Je pense que cette question est liée à la théorie derrière la validation croisée. Je présente ici mes résultats empiriques et j'ai écrit une question liée à la théorie de la validation croisée là- bas .
J'ai deux modèles M1 et M2, j'utilise le même ensemble de données pour les former et j'effectue une validation croisée en utilisant ce même ensemble de données pour trouver les paramètres optimaux pour chaque modèle. Disons finalement que j'ai trouvé que M1 sous son paramètre optimal, fonctionne mieux que M2 sous son paramètre optimal en termes de score de validation croisée 10 fois. Maintenant, si j'ai un autre ensemble de données de test indépendant avec à la fois des prédicteurs et des étiquettes et que cet ensemble de données de test est généré à partir de la même distribution de mon ensemble de données d'entraînement, puis avant d'appliquer ces 2 modèles bien ajustés sur ce nouvel ensemble de données de test, puis-je prétendre ou dois-je m'attendre à voir que M1 fonctionnera toujours mieux que M2 sur ce nouvel ensemble de données de test?
Je jouais l'exemple du Kaggle Titanic. J'ai 2 modèles xgboost, M1 est bien réglé et M2 est moins bien réglé dans le sens où M1 a une meilleure validation croisée 10 fois sur l'ensemble de données de formation. Mais ensuite, lorsque j'ai soumis les deux, j'ai constaté que le modèle le moins bien réglé avait en fait de meilleurs scores sur l'ensemble de données de test. Comment cela pourrait-il être? Et si c'est vrai, que devons-nous rechercher lorsque nous adaptons les données à différents modèles et ajustons les paramètres du modèle?
Voici mes résultats de soumission spécifiques: J'ai fait une recherche aléatoire dans la grille
params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50],
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9],
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
estimator=XGBClassifier(**params_fixed, seed=seed),
param_distributions=params_grid,
n_iter=5000,
cv=10,
scoring='accuracy',
random_state=seed
)
Chaque fois que je change la variable n_iter
. Tout d'abord, je mets n_iter=10
, cela me donne un ensemble de valeurs de ces hyper paramètres, appelons ce vecteuret le score cv (taux de précision) est de 0,83389 , puis j'utilisepour former mon modèle et générer des prédictions sur l'ensemble de données de test indépendant, et lorsque je soumets à Kaggle, il génère une véritable précision sur l'ensemble de données de test 0.79426
Deuxièmement, je mets n_iter=100
, ça me donneet le score cv est de 0,83614 , c'est-à-dire supérieur au premier, est logique, mais quand je me soumets à Kaggle, 0,78469 , inférieur au premier.
Troisièmement, je mets n_iter = 1000
, ça me donneet le score cv est de 0,83951 , c'est-à-dire plus élevé que le second, a du sens, mais quand je me soumets à Kaggle, 0,77990 , plus bas que le second.
Quatrièmement, je mets n_iter = 5000
, ça me donneet le score cv est de 0,84512 , c'est-à-dire supérieur au troisième, a du sens, mais quand je me soumets à Kaggle, 0,72249 , inférieur au troisième.
C'est vraiment frustré. Le modèle s'améliore de plus en plus sur le score de validation croisée, mais lorsqu'il est exécuté sur un ensemble de données indépendant réel, ses performances deviennent de pire en pire. Ai-je interprété les scores CV de la manière exactement opposée? Je vois un article mentionné que le score CV peut être trop optimiste pour déduire le vrai score du test. Cependant, même si cela est vrai, je pense que les scores CV de tous mes 4 modèles devraient être optimistes quant à leur propre score de test, c'est-à-dire que l'ordre devrait être préservé. Mais lors de l'application sur l'ensemble de données de test réel, l'ordre est inversé.
La seule raison que j'imagine serait que cet ensemble de données de test a une distribution différente de l'ensemble de données de formation. Cependant, si c'est effectivement le cas, je pense qu'il n'y a pas de méthode sous le soleil qui puisse résoudre ce problème.