[PYTHON] Parameteroptimierung mit GridSearchCV / RandomizedSearchCV unter Verwendung des Voting Classifier

Überblick

In scikit-learn gibt es einen Abstimmungsklassifizierer, der die vorhergesagten Werte mehrerer Modelle nach einer bestimmten Regel zusammenführt. Das Eingabemodell muss mit den angegebenen einzelnen Parametern ausgelöst werden, oder die Parameteroptimierung und der Abstimmungsklassifizierer müssen gleichzeitig ausgeführt werden.

Dieses Mal werde ich zusammenfassen, wie Parameter für einzelne Modelle während der Verwendung von Voting Classifier optimiert werden. Grundsätzlich entspricht es der im folgenden Dokument beschriebenen Methode.

1.11. Ensemble methods — scikit-learn 0.18.1 documentation

So legen Sie Parameter fest

Geben Sie für param_grid / param_distributions, die in GridSearchCV / RandomizedSearchCV angegeben sind, "{Modellname} __ {Parametername}" wie "lr__C" an. Verwenden Sie für den Modellnamen den Namen, der in den Schätzern im Abstimmungsklassifizierer angegeben ist.

# http://scikit-learn.org/stable/modules/ensemble.html#using-the-votingclassifier-with-gridsearch
params = {'lr__C': [1.0, 100.0], 'rf__n_estimators': [20, 200],}

Vorsichtsmaßnahmen beim Einstellen der Parameter

Der Voting Classifier optimiert nicht die Parameter für jedes Modell, sondern alle Kombinationen von Parametern für alle Modelle. Mit anderen Worten, wenn es 100 Kombinationen in xg boost und 100 Kombinationen in Random Forest gibt, versuchen Sie jeweils 100 Kombinationen und stimmen Sie die Abstimmungsergebnisse schließlich mit Voting ab und entscheiden Sie das Beste, aber versuchen Sie 100 × 100 = 10.000 Sortierer mit Voting. Es ist wie geworden. Wenn daher viele Parameter ausprobiert werden müssen, besteht die Möglichkeit, dass in GridSearchCV eine Kombinationsexplosion auftritt. Wenn möglich, ist es daher realistischer, dies zuerst zu versuchen, nachdem die Anzahl der Versuche (n_iter) in RandomizedSearchCV ermittelt wurde.

#Schlechtes Beispiel für eine ungewöhnliche Anzahl von Kombinationen aufgrund der Verwendung von GridSearchCV für 3 Modelltypen
Fitting 5 folds for each of 324000 candidates, totalling 1620000 fits
[CV] xg__colsample_bytree=0.5, rf__random_state=0, xg__learning_rate=0.5, rf__n_estimators=5, rf__n_jobs=1, xg__n_estimators=50, rf__max_depth=3, rf__min_samples_split=3, rf__max_features=3, xg__max_depth=3, lg__C=1.0 
[...]

Wenn das für die Parameteroptimierung verwendete Wörterbuch Parameter mit unnötigen Modellnamen enthält, die nicht vom Voting Classifier verwendet werden, tritt ein Fehler auf. Das Folgende ist ein Beispiel für einen Fehler, wenn "lr__" im Parameter enthalten ist, obwohl kein Modellname lr vorhanden ist.

ValueError: Invalid parameter lr for estimator VotingClassifier(estimators=[(
[...]

Quellcode

Ein Beispiel, in dem xgboost, RandomForest und LogisticRegression als Eingabe für den Abstimmungsklassifizierer verwendet werden. Die Parameter jedes Modells wurden beim Zusammenführen von Wörterbüchern umbenannt, um den Schreibstil mit dem Fall der Nichtabstimmung zu vereinheitlichen.

from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV


xg = xgb.XGBClassifier()
rf = RandomForestClassifier()
lr = LogisticRegression()

xg_param = {
    "n_estimators": [50, 100, 150],
    "max_depth": [3, 6, 9],
    "colsample_bytree": [0.5, 0.9, 1.0],
    "learning_rate": [0.5, 0.9, 1.0]
}
rf_param = {
    "n_estimators": [5, 10, 50, 100, 300],
    "max_features": [3, 5, 10, 15, 20],
    "min_samples_split": [3, 5, 10, 20],
    "max_depth": [3, 5, 10, 20]
}
lr_param = {
    "C": list(np.logspace(0, 4, 10))
}

params = {}
params.update({"xg__" + k: v for k, v in xg_param.items()})
params.update({"rf__" + k: v for k, v in rf_param.items()})
params.update({"lr__" + k: v for k, v in lr_param.items()})

eclf = VotingClassifier(estimators=[("xg", xg),
                                    ("rf", rf),
                                    ("lr", lr)],
                        voting="soft")

clf = RandomizedSearchCV(eclf,
                         param_distributions=params,
                         cv=5,
                         n_iter=100,
                         n_jobs=1,
                         verbose=2)
clf.fit(X_train, y_train)
predict = clf.predict(X_test)

Referenz

Recommended Posts

Parameteroptimierung mit GridSearchCV / RandomizedSearchCV unter Verwendung des Voting Classifier
Parametereinstellung mit luigi (2)
Parametereinstellung mit luigi
Optimieren von Hyperparametern mit Grid Search mithilfe einer Pipeline mit Keras