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
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
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
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
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