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.
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].
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()
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.
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.
Ü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.
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')
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.
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.
Ü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.
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
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')
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