[PYTHON] Klassifikation / Regression durch Stapeln (Scikit-Learn)

Das Stapeln ist eine Möglichkeit, mehrere Modelle des maschinellen Lernens zu kombinieren, aber ich habe versucht, Pythons Scikit-Learn StackingClassifier und StackingRegressor zu verwenden.

StackingClassifier

Klassifizierung durch Stapeln

Verwenden wir Brustkrebsdaten, um die Leistung des Klassifizierungsmodells zu überprüfen.

from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

Es gibt Raum für Verbesserungen, da ich nicht alle Parameter eingestellt habe, aber vorerst

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.ensemble import StackingClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression

estimators = [
        ('svc', make_pipeline(StandardScaler(), SVC())),
        ('rf', RandomForestClassifier()),
        ('mlp', MLPClassifier(max_iter=10000))
        ]
clf = StackingClassifier(
    estimators=estimators,
    final_estimator=LogisticRegression(max_iter=10000)
)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
0.972027972027972

Leistung eines einzelnen Klassifizierungsmodells

Berechnen wir zum Vergleich die Genauigkeitsrate eines einzelnen Klassifizierungsmodells.

make_pipeline(StandardScaler(), SVC()).fit(X_train, y_train).score(X_test, y_test)
0.965034965034965
RandomForestClassifier().fit(X_train, y_train).score(X_test, y_test)
0.951048951048951
MLPClassifier(max_iter=10000).fit(X_train, y_train).score(X_test, y_test)
0.9090909090909091
LogisticRegression(max_iter=10000).fit(X_train, y_train).score(X_test, y_test)
0.958041958041958

Das Ergebnis ist, dass es besser ist, sie zu kombinieren, als sie alleine zu verwenden.

Wenn Sie jedoch aus train_test_split neu berechnen, ist die Leistung eines einzelnen Klassifizierungsmodells möglicherweise besser, je nachdem, wie es aufgeteilt ist.

Für den Leistungsvergleich halte ich es für besser, die Berechnung viele Male zu wiederholen, ohne den zufälligen Startwert festzulegen, und zu überprüfen, wie stabil die Leistung ist.

StackingRegressor

Zurück durch Stapeln

Verwenden wir Diabetesdaten, um die Leistung des Regressionsmodells zu sehen.

from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)

Auch hier besteht Verbesserungsbedarf, da die Parameter nicht angepasst wurden.

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVR
from sklearn.ensemble import StackingRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.cross_decomposition import PLSRegression

estimators = [
        ('svr', make_pipeline(StandardScaler(), SVR())),
        ('rf', RandomForestRegressor()),
        ('mlp', MLPRegressor(max_iter=10000))
        ]
clf = StackingRegressor(
    estimators=estimators,
    final_estimator=PLSRegression(),
)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
0.4940607294168183

Leistung eines einzelnen Regressionsmodells

Zum Vergleich berechnen wir den R2-Wert eines einzelnen Regressionsmodells.

make_pipeline(StandardScaler(), SVR()).fit(X_train, y_train).score(X_test, y_test)
0.17571936903725216
RandomForestRegressor().fit(X_train, y_train).score(X_test, y_test)
0.46261715392586217
MLPRegressor(max_iter=10000).fit(X_train, y_train).score(X_test, y_test)
0.4936782755875562
PLSRegression().fit(X_train, y_train).score(X_test, y_test)
0.4927059150604132

Das Ergebnis ist wiederum, dass es besser ist, sie zu kombinieren, als sie allein zu verwenden.

Wenn Sie jedoch aus train_test_split neu berechnen, ist die Leistung eines einzelnen Regressionsmodells möglicherweise besser, je nachdem, wie es aufgeteilt wird.

Für den Leistungsvergleich halte ich es für besser, die Berechnung viele Male zu wiederholen, ohne den zufälligen Startwert festzulegen, und zu überprüfen, wie stabil die Leistung ist.

Recommended Posts

Klassifikation / Regression durch Stapeln (Scikit-Learn)
Multi-Label-Klassifizierung nach Random Forest mit Scikit-Learn
Unterschied zwischen Regression und Klassifikation
Pokemon-Klassifizierung nach Themenmodell
[Python] Lineare Regression mit Scicit-Learn
Überwachtes maschinelles Lernen (Klassifikation / Regression)
Stapelvorlage für maschinelles Lernen (Rückgabe)
Robuste lineare Regression mit Scikit-Learn
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 1.15. Isotonische Regression
Klassifikation und Regression beim maschinellen Lernen
Darstellung der Regressionslinie durch Restdarstellung