[PYTHON] Ich habe versucht, LightGBM mit Yellowbrick zu lernen

Einführung

Ich habe Yellowbrick kurz vor [^ 1] ausprobiert, aber ich habe nur versucht, es basierend auf dem Beispielcode von Yellowbrick zu verschieben, also habe ich versucht herauszufinden, was Yellowbrick kann. Dieses Mal werde ich LightGBM, das häufig in Kaggle verwendet wird, mit Yellowbrick erstellen und sogar das Modell speichern. Yellowbrick ist jedoch möglicherweise nicht in der Lage, Vorverarbeitungen wie das Erstellen von Features und die detaillierte Bewertung der Modellgenauigkeit durchzuführen, sodass dies nicht behandelt wird.

Umgebung

Die Ausführungsumgebung ist wie folgt.

$sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G8037
$python3 --version
Python 3.7.4

Die Installation von Yellowbrick ist in [^ 1] beschrieben und wird daher weggelassen. Informationen zur Installation von LightGBM finden Sie hier [^ 2].

Ein Modell bauen

Vorbereitung

Importieren Sie die diesmal zu verwendende Bibliothek.

import pandas as pd
import numpy as np

import yellowbrick
from yellowbrick.datasets import load_bikeshare
from yellowbrick.model_selection import LearningCurve,ValidationCurve,FeatureImportances
from yellowbrick.regressor import ResidualsPlot


import lightgbm as lgb

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from joblib import dump, load

Verwenden Sie für Daten "load_bikeshare", das von Yellowbrick erstellt wurde.

# Load data
X, y = load_bikeshare()
print(X.head())

Es gibt 12 erklärende Variablen, die alle numerische Daten sind. Die Zielvariable ist die Anzahl der gemieteten geteilten Fahrräder. Dieses Mal werde ich diese Daten so wie sie sind in LightGBM einfügen und ein Modell erstellen.

   season  year  month  hour  holiday  weekday  workingday  weather  temp  \
0       1     0      1     0        0        6           0        1  0.24   
1       1     0      1     1        0        6           0        1  0.22   
2       1     0      1     2        0        6           0        1  0.22   
3       1     0      1     3        0        6           0        1  0.24   
4       1     0      1     4        0        6           0        1  0.24   

   feelslike  humidity  windspeed  
0     0.2879      0.81        0.0  
1     0.2727      0.80        0.0  
2     0.2727      0.80        0.0  
3     0.2879      0.75        0.0  
4     0.2879      0.75        0.0  

Teilen Sie die Daten für Training und Validierung vor dem Training. Das Split-Verhältnis ist für Texto auf 8: 2 eingestellt.

# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Das Modell verwendet LightGBM wie oben erwähnt. Da Yellowbrick jedoch eine Bibliothek wie die erweiterte Version von scikit-learn ist, verwendet LightGBM auch die API von scilit-learn [^ 3].

# Model
model = lgb.LGBMRegressor()

Versuchen Sie zu stimmen

Verwenden wir nun die ValidationCurve von Yellowbrick, um die Hyperparameter zu bestimmen. Dieses Mal werde ich versuchen, die Beziehung zwischen den Werten von max_depth, n_estimators und num_leaves und der Genauigkeit zu untersuchen. Siehe hier [^ 5] für die API-Spezifikationen der Validierungskurve.

Geben Sie das Modell, den zu überprüfenden Parameternamen und den Parameterbereich im Argument von ValidationCurve wie folgt an. cv kann die Anzahl der Unterteilungen des Kreuztests und des Generators einstellen. Dieses Mal wird die Anzahl der Teilungen des Kreuztests auf 5 eingestellt. Die letzte Bewertung gibt den Index an, um die Genauigkeit zu sehen, und setzt neg_mean_squared_error unter den durch scicit-learn definierten Indizes [^ 4].

visualizer = ValidationCurve(
    model, param_name="max_depth",
    param_range=np.arange(1, 11), cv=5, scoring='neg_mean_squared_error'
)
visualizer.fit(X_train, y_train)
visualizer.show()

Die Ausgabe erfolgt wie in der folgenden Abbildung gezeigt, und die vertikale Achse lautet neg_mean_squared_error. Dieser Index multipliziert buchstäblich den durchschnittlichen quadratischen Fehler mit (-1), was anzeigt, dass die Oberseite (näher an 0) in der Figur eine höhere Genauigkeit aufweist. Wenn beim Cross Validation Score max_depth 6 oder mehr beträgt, ändert sich die Genauigkeit kaum. Setzen Sie also max_depth auf 6.

out01.png

Als nächstes untersuchen wir n_estimators auf die gleiche Weise. Das Programm ist wie folgt.

visualizer = ValidationCurve(
    model, param_name="n_estimators",
    param_range=np.arange(100, 1100, 100), cv=5, scoring='neg_mean_squared_error'
)
visualizer.fit(X_train, y_train)
visualizer.show()

Die Ausgabe erfolgt wie in der folgenden Abbildung dargestellt. Wenn die Nestimatoren 600 oder höher sind, ist die Genauigkeit beim Cross Validation Score nahezu gleich. Setzen Sie also n_estimators auf 600.

out02.png

Überprüfen Sie abschließend num_leaves auf die gleiche Weise. Das Programm ist wie folgt.

visualizer = ValidationCurve(
    model, param_name="num_leaves",
    param_range=np.arange(2, 54, 4), cv=5, scoring='neg_mean_squared_error'
)
visualizer.fit(X_train, y_train)
visualizer.show()

Diese Ausgabe ist in der folgenden Abbildung dargestellt. Wenn Sie sich den Cross Validation Score ansehen, beträgt num_leaves 20 oder mehr und die Genauigkeit hat sich kaum geändert. Setzen Sie ihn daher auf 20.

out03.png

Wie oben beschrieben, war es möglich, die Parameter mit ValidationCurve einfach abzustimmen. Definieren Sie das Modell erneut.

# Model
model = lgb.LGBMRegressor(
    boosting_type='gbdt', 
    num_leaves=20, 
    max_depth=6, 
    n_estimators=600, 
    random_state=1234, 
    importance_type='gain')

Versuchen Sie, eine Lernkurve zu zeichnen

Um zu sehen, ob das Modell unter- oder überpasst ist Schauen wir uns die Genauigkeit des Modells an, während wir die Menge der Trainingsdaten ändern. Mit LearningCurve kann es einfach visualisiert werden.

visualizer = LearningCurve(model, cv=5, scoring='neg_mean_squared_error')
visualizer.fit(X_train, y_train)
visualizer.show()

Das Ergebnis ist in der folgenden Abbildung dargestellt. Es ist ersichtlich, dass sich die Genauigkeit des Kreuzvalidierungswerts mit zunehmender Datenmenge verbessert. Selbst wenn die Datenmenge erhöht werden kann, wird sich die Genauigkeit nicht dramatisch verbessern.

out04.png

Bedeutung der Merkmalsmenge

Es ist auch einfach, erklärende Variablen in der Reihenfolge ihrer Wichtigkeit anzuzeigen, wenn die Anzahl der gemieteten geteilten Fahrräder vorhergesagt wird.

visualizer = FeatureImportances(model)
visualizer.fit(X_train, y_train)
visualizer.show()

Das Ergebnis ist in der folgenden Abbildung dargestellt. Die effektivste Zeit war die Tageszeit. Andere Variablen werden angezeigt, wobei diese Wichtigkeit auf 100 gesetzt ist.

out05.png

Modellgenauigkeit

Überprüfen Sie, wie im vorherigen Artikel [^ 1] gezeigt, die Genauigkeit anhand der Restverteilung.

visualizer = ResidualsPlot(model)
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.show()

Die Ausgabe erfolgt wie in der folgenden Abbildung dargestellt. Wenn Sie sich das Streudiagramm ansehen, gibt es Stellen, an denen der vorhergesagte Wert nicht stimmt, der Wert von $ R ^ 2 $ jedoch 0,9 oder mehr beträgt. Betrachtet man die Restverteilung im Histogramm, so scheint die Genauigkeit gut zu sein, da es einen Peak um den Rest von 0 gibt.

out06.png

Es scheint, dass die in der Abbildung angezeigte Punktzahl nicht in einen anderen Index als $ R ^ 2 $ geändert werden kann. Als ich den RMSE erneut berechnete, waren es ungefähr 38. Nachdem wir ein solches Modell haben, werden wir hier den Modellbau beenden.

model = model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)
# The rmse of prediction is: 38.82245025441572

Modell speichern

Speichern Sie das erstellte Modell. Als ich es mit Scikit-learn nachgeschlagen habe, wurde beschrieben, wie man es mit joblib [^ 6] speichert, also speichere es auf die gleiche Weise.

dump(model, 'lightgbm.joblib') 

schließlich

Im obigen Programm wird auch auf den Beispielcode [^ 7] von LightGBM verwiesen. Der Eindruck ist, dass dies praktisch ist, da Sie die Genauigkeit des Modells und des Diagramms, das zur Überprüfung mit Yellowbrick verwendet werden kann, leicht überprüfen können. Andererseits fühlt es sich seltsam an, Visualizer jedes Mal "fit" zu machen ...

Recommended Posts

Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe maschinelles Lernen mit liblinear versucht
[Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen
Ich habe versucht, tief zu lernen
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
[Mac] Ich habe versucht, das Lernen mit Open AI Baselines zu stärken
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe versucht, mit PyCaret zu clustern
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Mayungos Python-Lernfolge 1: Ich habe versucht, mit Druck zu drucken
Ich habe versucht, Sätze mit summpy zusammenzufassen
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, das Gesicht mit MTCNN zu erkennen
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe versucht, mit Theano tief zu lernen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, Sätze mit GPT-2 zu generieren
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Ich habe mit ChainerRL Deep Enforcement Learning (Double DQN) ausprobiert
Mayungos Python Learning Episode 7: Ich habe versucht, mit if, elif, else zu drucken
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe Linebot mit Flasche (Anaconda) + Heroku ausprobiert
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, DeepPose mit PyTorch PartⅡ zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Mayungos Python Learning Episode 8: Ich habe versucht, Eingaben zu machen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert
Mayungos Python Learning Episode 2: Ich habe versucht, Zeichen mit Variablen zu löschen
Ich habe AutoKeras ausprobiert
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht