[PYTHON] Réglage des paramètres avec GridSearchCV / RandomizedSearchCV lors de l'utilisation de VotingClassifier

Aperçu

Dans scikit-learn, il existe un classificateur de vote qui fusionne les valeurs prédites de plusieurs modèles selon une règle spécifique. Le modèle d'entrée doit être lancé avec des paramètres individuels spécifiés, ou le réglage des paramètres et le classificateur de vote doivent être exécutés en même temps.

Cette fois, je vais résumer comment régler les paramètres pour les modèles individuels tout en utilisant Voting Classifier. Fondamentalement, c'est la même que la méthode décrite dans le document suivant.

1.11. Ensemble methods — scikit-learn 0.18.1 documentation

Comment spécifier les paramètres

Pour param_grid / param_distributions spécifiés dans GridSearchCV / RandomizedSearchCV, spécifiez {model name} __ {parameter name} comme lr__C. Pour le nom du modèle, utilisez le nom spécifié dans les estimateurs dans Voting Classifier.

# 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],}

Précautions lors du réglage des paramètres

Le classificateur de vote ne règle pas les paramètres sur chaque modèle, mais règle toutes les combinaisons de paramètres sur tous les modèles. En d'autres termes, s'il y a 100 combinaisons dans xg boost et 100 combinaisons dans Random Forest, essayez 100 combinaisons chacune et faites enfin correspondre les résultats de réglage à Vote et décidez le meilleur, mais essayez 100 × 100 = 10000 trieurs avec vote. C'est devenu comme. Par conséquent, s'il y a beaucoup de paramètres à essayer, il est possible qu'une explosion de combinaison se produise dans GridSearchCV, donc si possible, il est plus réaliste de l'essayer d'abord après avoir déterminé le nombre d'essais (n_iter) dans RandomizedSearchCV.

#Mauvais exemple de nombre inhabituel de combinaisons dû à l'utilisation de GridSearchCV sur 3 types de modèles
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 
[...]

De plus, si le dictionnaire utilisé pour le réglage des paramètres contient des paramètres avec des noms de modèle inutiles autres que le modèle utilisé par Voting Classifier, une erreur se produit. Voici un exemple d'erreur lorsque "lr__" est inclus dans le paramètre même s'il n'y a pas de nom de modèle lr.

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

Code source

Un exemple où xgboost, RandomForest et LogisticRegression sont utilisés comme entrée pour Voting Classifier. Les paramètres de chaque modèle ont été renommés lors de la fusion des dictionnaires afin d'unifier le style d'écriture avec le cas de non vote.

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)

référence

Recommended Posts

Réglage des paramètres avec GridSearchCV / RandomizedSearchCV lors de l'utilisation de VotingClassifier
Réglage des paramètres avec luigi (2)
Réglage des paramètres avec luigi
Réglage des hyper paramètres avec Grid Search à l'aide de pipeline avec keras