Est-il possible d'obtenir un modèle pire après l'optimisation?
J'essaie récemment d'optimiser les modèles, mais pour une raison quelconque, chaque fois que j'essaie d'exécuter l'optimisation, le score du modèle est finalement pire qu'avant, donc je pense que je fais quelque chose de mal.
afin d'optimiser mon modèle, je définis la grille de paramètres et ensuite l'ajustement avec les données du train, puis en fonction des résultats, je recommence avec nre paramètres, par exemple
#ROUND 1
param_grid={
'max_depth': [3,4,5],
'learning_rate':[0.1,0.01,0.05],
'gamma': [0,0.25,1.0],
'reg_lambda':[0,1.0,10.0],
'scale_pos_weight':[1,3,5]
}
grid_search = GridSearchCV(estimator = clf_xgb, param_grid = param_grid,
cv = 3, n_jobs = -1, verbose = 2)
grid_search.fit(X_train,y_train)
grid_search.best_params_
>>>.....
(et maintenant basé sur le résultat en changeant les paramètres ...)
après cette étape, je choisis les meilleurs hyperparamètres et lance le modèle;
clf_xgb=xgb.XGBClassifier(seed=42,
objective='binary:logistic',
gamma=0,
learn_rate=0.7,
max_depth=6,
reg_lambda=0.8,
scale_pos_weight=1,
subsample=0.9,
cilsample_bytree=0.5)
clf_xgb.fit(X_train,
y_train,
verbose=True,
early_stopping_rounds=10,
eval_metric='aucpr',
eval_set=[(X_test,y_test)])
Le problème est que lorsque je vérifie le score du modèle
clf_xgb.score(X_test,y_test)
J'obtiens toujours un score inférieur à ce que j'avais avant l'optimisation, ce qui me fait soupçonner que je manque quelque chose dans la manière de le faire / principe de base dans ce processus.
Est-il possible qu'après avoir exécuté l'optimisation, mon score ne s'améliore pas (et même pire?)? Où est mon erreur? Y a-t-il d'autres paramètres qui pourraient influencer ou améliorer mon modèle?
Réponses
Est-il possible qu'après avoir exécuté l'optimisation, mon score ne s'améliore pas (et même pire?)?
Oui, théoriquement, par pur hasard, il est possible que votre estimation initiale, avant l'optimisation des hyper-paramètres, fournisse de meilleurs résultats que la meilleure combinaison de paramètres trouvée dans la grille de paramètres. Cependant, en supposant que vous disposez de suffisamment de données et que votre grille de paramètres est suffisamment large, il est peu probable que le réglage des hyper-paramètres ne puisse pas donner de meilleurs résultats. Un tel comportement indique plutôt que quelque chose ne va pas avec votre approche ou vos données.
Si vous comprenez correctement, le choix des meilleurs paramètres est basé sur les résultats du CV sur les données d'entraînement, tandis que dans votre exécution finale, les performances sont évaluées sur la base d'un ensemble de données de test. Si la distribution des données d'entraînement et de test diffère de manière significative, cela peut conduire à une situation où les paramètres fournissant les meilleurs résultats sur les données d'entraînement fonctionnent mal sur les données de test.
Où est mon erreur?
Comme déjà mentionné par d'autres, les paramètres que vous testez après le réglage n'ont pas été inclus dans la grille de paramètres. Dans ce cas, il est incorrect de parler des performances du modèle "après l'exécution de l'optimisation".
Je suggère ce qui suit afin d'étudier et de résoudre le problème
- Au lieu d'utiliser les paramètres codés en dur dans l'
XGBClassifierappel, utilisez les paramètres optimaux trouvés par le processus de réglage, c'est-à-diregrid_search.best_params_. De plus, si vous pensez quesubsampleetcilsample_bytree(une faute de frappe?) Sont des paramètres pertinents, incluez-les dans la grille des paramètres. - Augmentez le
cvparamètre à par exemple 5-10, les résultats aveccv = 3peuvent être très instables. Vous pouvez évaluer la stabilité de vos résultats actuels en utilisant différentes valeurs aléatoires et en répétant l'ensemble de l'exercice. - Assurez-vous que vous utilisez les paramètres cohérents dans le processus de réglage et dans l'évaluation finale, ou incluez simplement ces paramètres dans la grille des paramètres si possible. En particulier, vérifiez
early_stopping_roundseteval_metric.
Y a-t-il d'autres paramètres qui pourraient influencer ou améliorer mon modèle?
- D'après votre code, le nombre de tours que vous utilisez n'est pas clair. Augmentez-le
n_estimatorsou incluez-le dans la grille des paramètres. - Étant donné que vous utilisez AUCPR, vous devrez peut-être définir explicitement le paramètre
maximize=True, sinon dans votre exécution finale, vous pourriez minimiser l'AUCPR, ce qui pourrait expliquer des résultats médiocres.
Cette question est un peu mal formulée. Vous ne pouvez pas empirer après l'optimisation, sinon ce ne serait pas l'optimisation! (Au pire, vous avez les mêmes performances qu'avant, en obtenant exactement les mêmes paramètres que vous aviez déjà)
Comme le souligne Grzegorz dans un commentaire, tout d'abord votre liste de paramètres n'est pas complète et ne contient pas les valeurs que vous utiliserez plus tard. Par exemple le taux d'apprentissage, mais aussi max_depth. Deuxièmement, une recherche de grille où vous ne savez pas vraiment où chercher devrait contenir une variance beaucoup plus grande pour les paramètres. Vous vérifiez [0.1, 0.01, 0.05]le taux d'apprentissage, mais avez-vous vérifié [0.0001, 0.001, 1.]? Le taux d'apprentissage peut être un mauvais exemple ici, mais j'espère qu'il fait passer le message, vous voudrez peut-être vérifier d'abord la magnitude / l'échelle, par exemple les puissances de dix, avant de vérifier les petites variations.
En fonction de votre jeu de données, la différence entre les exécutions avec les mêmes valeurs peut également provenir de différentes graines! Vérifiez que vous définissez toujours la même graine ou essayez-la suffisamment de fois avec des graines différentes pour obtenir une réponse comparable (par exemple avec KFold).
Votre modèle converge-t-il même pour chaque formation? Où vous assurez-vous que vous vous entraînez suffisamment longtemps? Vous pouvez tracer la perte pour l'échantillon d'entraînement et de test et vérifier si elle converge ou non. Cela peut être contrôlé avec n_estimatorsxgboost, je crois.
Il n'y a rien de mal dans votre code ou processus. Souvent, les performances d'apprentissage automatique sur l'ensemble de données de test sont inférieures à celles sur l'ensemble de données d'entraînement. Votre modèle ne se généralise pas parfaitement aux données qu'il n'a pas vues auparavant (c'est-à-dire le jeu de données de test).