[PYTHON] [Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen

0. Einleitung

Dieses Mal untersuchte ich ** LightGBM **, eine der Lernmodellmethoden. LightGBM wird in Kaggle auch häufig als Teil des Ensemble-Lernens verwendet. Daneben sind auch die Prozesse um sie herum (wie das Zeichnen der ROC-Kurve) erforderlich, daher habe ich sie zusammengefasst.

Der Artikel, auf den ich mich bezog, ist hier.

1. Installieren Sie LightGBM

terminal


pip install lightgbm

Machen. Aber,

jupyter


import lightgbm as lgb 

Ich habe einen Fehler erhalten und habe untersucht, wie ich damit umgehen soll.

Fehler beim Importieren von LightGBM

Ich kam an. Demzufolge

terminal


brew install libomp

Dann wurde es sicher gelöst. Dies wird Sie vorwärts bringen.

2. Bereiten Sie einen Pseudodatensatz vor

Importieren Sie zunächst die erforderlichen Bibliotheken.

In[1]


%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

print(pd.__version__) #Sie können die Version im Skript überprüfen.

Out[1]


0.21.0

Laden Sie dann den Datensatz. Dieses Mal werden wir die Irisdaten aus dem Scikit-Learn-Datensatz verwenden.

In[2]


from sklearn.datasets import load_iris

iris = load_iris()
#print(iris.DESCR)  #Beschreibung des Datensatzes anzeigen
print(type(iris))

Out[2]


<class 'sklearn.utils.Bunch'>

In[3]


df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target

print(df.shape)
df.head()

image.png

Zeichnen wir diese Daten mit nur zwei Variablen.

In[4]


fig = plt.figure(figsize = (5,5))
ax = fig.add_subplot(111)

plt.scatter(df[df['target']==0].iloc[:,0], df[df['target']==0].iloc[:,1], label='Setosa')
plt.scatter(df[df['target']==1].iloc[:,0], df[df['target']==1].iloc[:,1], label='Versicolour')
plt.scatter(df[df['target']==2].iloc[:,0], df[df['target']==2].iloc[:,1], label='Virginica')
plt.xlabel("sepal length[cm]", fontsize=13)
plt.ylabel("sepal width[cm]", fontsize=13)

plt.legend()
plt.show()

image.png

Dieses Mal werde ich versuchen, es als ein Zwei-Klassen-Klassifizierungsproblem von Versicolour und Virginica zu lösen, das unter diesen drei Typen relativ schwer zu klassifizieren scheint. Daher sind diejenigen mit einer Bezeichnung von 0 ausgeschlossen. Geben Sie den verbleibenden beiden Typen die Bezeichnungen 0 und 1.

In[5]


data = df[df['target']!=0]
data.head()

image.png

In[6]


data['target'] = data['target'] - 1

X = data.drop('target', axis=1)
y = data['target']

Out[6]


/Users/{user}/.pyenv/versions/3.6.6/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """Entry point for launching an IPython kernel.

Ich konnte mit dieser Warnung nicht gut umgehen. Wenn Sie also wissen, was zu tun ist ...

3. Lernen Sie mit LightGBM

Teilen Sie vorher die Trainingsdaten und die Testdaten auf. Dieses Mal führen wir eine Kreuzvalidierung durch. Bereiten Sie daher auch Validierungsdaten vor.

In[7]


from sklearn.model_selection import train_test_split

X_trainval, X_test, y_trainval, y_test = train_test_split(X, y, test_size=0.2, random_state=7, stratify=y)
X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, test_size=0.2, random_state=7, stratify=y_trainval)

Es ist endlich das Hauptthema. Wir werden ein LightGBM-Modell bauen.

Über Hyperparameter

Die Parameter und andere Argumente des lightgbm-Funktionszugs sind Hyperparameter. Die Dokumentation dazu ist hier.

Ich denke auch, dass die folgenden Artikel hilfreich sein werden.

Hier werde ich nur diejenigen erklären, die wichtig erscheinen.

--objektiv: Da es sich diesmal um eine Zwei-Klassen-Klassifikation handelt, wird Binär angegeben. --metric: 2 Gibt auc an, einen der Indikatoren, die für die Klassenklassifizierung verwendet werden können. --early_stopping_rounds: Wenn sich die Metrik in der angegebenen Anzahl von Runden nicht verbessert, hören Sie vorher auf zu lernen.

In[8]


import lightgbm as lgb

lgb_train = lgb.Dataset(X_train, y_train)
lgb_val = lgb.Dataset(X_val, y_val)

params = {
    'metric' :'auc', #binary_Auch mit logloss möglich
    'objective' :'binary',
    'max_depth' :1,
    'num_leaves' :2,
    'min_data_in_leaf' : 5,    
}

evals_result = {} #Wörterbuch zum Speichern von Ergebnissen

gbm = lgb.train(params,
                lgb_train,
                valid_sets = [lgb_train, lgb_val],
                valid_names = [ 'train', 'eval'],
                num_boost_round = 500,
                early_stopping_rounds = 20,
                verbose_eval = 10,
                evals_result = evals_result
               )

Out[8]


Training until validation scores don't improve for 20 rounds
[10]	train's auc: 0.997559	eval's auc: 0.914062
[20]	train's auc: 0.997559	eval's auc: 0.914062
Early stopping, best iteration is:
[3]	train's auc: 0.998047	eval's auc: 0.914062

4. Zeichnen Sie die Lernkurve

Das evals_result, das ich zuvor in das Argument der Zugfunktion eingefügt habe, enthält den Datensatz über die als Index angegebene auc. Wir werden dies verwenden, um eine Lernkurve zu zeichnen.

In[9]


print(evals_result.keys())
print(evals_result['eval'].keys())
print(evals_result['train'].keys())

train_metric = evals_result['train']['auc']
eval_metric = evals_result['eval']['auc']
train_metric[:5], eval_metric[:5]

Out[9]


dict_keys(['train', 'eval'])
odict_keys(['auc'])
odict_keys(['auc'])

([0.9375, 0.9375, 0.998046875, 0.998046875, 0.998046875],
 [0.8125, 0.8125, 0.9140625, 0.9140625, 0.9140625])

Da es wie folgt als Liste im Wörterbuch enthalten ist, geben Sie den Schlüssel an, um diese Liste abzurufen.

Zeichnen Sie dann eine Lernkurve.

In[10]


plt.plot(train_metric, label='train auc')
plt.plot(eval_metric, label='eval auc')
plt.grid()
plt.legend()
plt.ylim(0, 1.1)

plt.xlabel('rounds')
plt.ylabel('auc')
plt.show()

image.png

5. Untersuchen Sie wichtige Funktionen

lightgbm kann seine Bedeutung bei der Klassifizierung mithilfe von lightgbm.plot_importance visualisieren.

Die Dokumentation für lightgbm.plot_importance ist hier.

In[11]


lgb.plot_importance(gbm, figsize=(12, 6), max_num_features=4)
plt.show();

image.png

6. Testdaten schätzen ・ ROC-Kurve zeichnen

In[12]


from sklearn import metrics

y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)

fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred, drop_intermediate=False, )
auc = metrics.auc(fpr, tpr)
print('auc:', auc)

Out[12]


auc: 1.0

Die Dokumentation zu roc_curve finden Sie hier (https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html).

Als ich die ROC-Kurve untersuchte, waren die folgenden Artikel auf leicht verständliche Weise organisiert, sodass ich sie verknüpfen werde.

In[13]


plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR: False positive rate')
plt.ylabel('TPR: True positive rate')
plt.grid()
plt.plot();

image.png

Diesmal war es relativ einfach, so dass es zu einer extremen ROC-Kurve wurde.

Stellen Sie schließlich einen bestimmten Schwellenwert ein und sortieren Sie die Antwortbezeichnungen basierend auf diesem Schwellenwert.

In[13]


y_pred = (y_pred >= 0.5).astype(int)
y_pred

Out[14]


array([1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0])

7. Zeichnen Sie eine Wärmekarte der Verwirrungsmatrix

Schließlich,

Ich habe auch eine Heatmap der Verwirrungsmatrix mit Bezug auf gezeichnet.

In[15]


from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

cm = confusion_matrix(y_test.values, y_pred)

sns.heatmap(cm, annot=True, annot_kws={'size': 20}, cmap= 'Reds');

image.png

Recommended Posts

[Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe versucht, mit Theano tief zu lernen
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
[Kaggle] Ich habe versucht, mit unausgeglichenem Lernen zu unterabtasten
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, tief zu lernen
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, meinen eigenen Datensatz mit Chainer Trainer zu lernen
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, ein Deep-Learning-Modell von TensorFlow mit TensorFlow Serving zu hosten
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren
Ich habe irgendwie versucht, ein Jupyter-Notebook zu verwenden
Ich habe versucht, mit OpenPose eine Schildkrötenwelle zu schießen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.