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.
la source
Oui tu devrais. Bien sûr, dans les conditions
Je peux penser à deux raisons:
L'ensemble de données de test n'est en effet pas généré de la même manière. Par conséquent, il est préférable de ne pas se fier à l'ensemble de tests Kaggle auquel vous n'avez pas accès. Utilisez les données dont vous disposez.
Vous êtes trop ajusté, ce qui signifie que vous n'exécutez pas correctement la validation croisée. Assurez-vous vraiment que la formation des paramètres se produit sur les données de la formation et, en même temps, que la validation se produit sur les données que vous n'avez pas utilisées pour la formation. Comparez les histogrammes des pertes d'entraînement et des pertes de validation. Les pertes d'entraînement devraient être systématiquement plus petites que les pertes de validation. Faites de même pour les pertes sur les données de test pour obtenir une image cohérente.
As and end note: Il est à prévoir que les performances sur l'ensemble de test sont inférieures à celles sur l'ensemble de validation. En effet, le modèle est choisi en fonction de l'ensemble de validation. Il est donc biaisé par rapport à cet ensemble de données.
la source
C'est possible. Imaginez un scénario simple où le modèle
M1
aD
mieux compris la variance de l'ensemble de données d'apprentissage que le modèle,M2
car ses paramètres sont mieux ajustés. Cela signifie qu'ilM1
fonctionne mieuxD
queM2
.Mais lorsque nous les testons sur l'ensemble de test
T
, il est possible que lesM2
performancesM1
soient meilleures, car elles pourraient sur-adapterD
alors qu'ellesM2
ne l'étaient pas. Par conséquent,M1
fonctionne moins bienT
queM2
.Cela peut être dû au fait que vous avez effectué votre validation croisée sur le même ensemble de données au lieu d'un ensemble de validation. Si vous vous entraînez et validez dans le même ensemble, vous risquez de passer à côté du fait que cela pourrait être trop adapté. Ainsi, il est toujours préférable de former, valider et tester sur différents ensembles de données. Donc, le flux devrait être
la source
D
avait déjà pris en compte les problèmes de surajustement. Je comprends que si vous ne faites pas du tout de validation croisée, c'est-à-dire que vous ajustez simplement le modèle sur l'ensemble de donnéesD
et résolvez ce problème d'optimisation et obtenez les paramètres optimaux, alors ce modèle aura le moins d'erreur de train et il est très probable un sur-ajustement. Dans ce cas, je conviens que ceoptimized
modèle aura tendance à mal fonctionner sur un ensemble de données de test indépendant. Mais je pense que ce problème a été résolu par une validation croisée sur l'ensemble de donnéesD
, n'est-ce pas?D
, vous coupez d'abord au hasardD
en environ 10 morceaux de taille égale, puis à chaque itération, vous ajustez à la fois M1 et M2 sur le même 9/10D
, puis vous les appliquez de la même manière 1 / 10D
pour obtenir votretest error
, puis vous répétez ce processus 10 fois et à chaque fois, l'ensemble de train et l'ensemble de test sont différents de l'itération précédente. Ensuite, après 10 itérations, vous faites la moyenne de l'erreur de test pour M1 et M2, puis vous trouvez que M1 a moins d'erreur de test, puis ne suffit-il pas de conclure que M1 est meilleur que M2 et cette procédure semble avoir déjà pris soin de la sur-adaptationLa théorie derrière la validation croisée (validation croisée en V) a été abordée dans de nombreux articles. Il y a une preuve pour cela dans un ensemble d'articles publiés de 2003 à 2007. Veuillez vous référer à: - Sélecteur Oracle. 2006 - super apprenant 2007 - super apprenant en prédiction 2010 - validation croisée unifiée 2003
la source