Les performances de validation croisée seront-elles une indication précise pour prédire les performances réelles sur un ensemble de données indépendant?


9

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 vecteurα1et le score cv (taux de précision) est de 0,83389 , puis j'utiliseα1pour 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 donneα2et 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 donneα3et 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 donneα4et 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.

Réponses:


3

Tout d'abord, une réponse pragmatique: ne négligez pas la possibilité que l'ensemble de test provienne d'une distribution quelque peu différente de l'ensemble de données que vous utilisez pour la formation et la validation croisée. Vous pourriez penser que cela ne devrait pas se produire, mais dans la pratique, cela semble se produire.

Cela dit, partons de votre hypothèse et supposons que l'ensemble de test provient exactement de la même distribution que le reste de vos données. Dans ce cas, il est possible que la validation croisée vous induise en erreur sur le modèle qui convient le mieux, si vous utilisez la validation croisée pour sélectionner des hyper-paramètres.

Vous pouvez utiliser la validation croisée pour (a) sélectionner des hyper-paramètres ou (b) estimer la précision de votre modèle - mais pas les deux en même temps.

Il semble que vous utilisez la validation croisée pour sélectionner les hyper-paramètres optimaux: vous essayez de nombreux choix différents pour les hyper-paramètres, pour chaque choix, estimez la précision de ce choix à l'aide de la validation croisée, et sélectionnez le meilleur choix. Lorsque vous faites cela, rien ne garantit que la précision résultante (avec le meilleur paramètre) sera prédictive des performances sur l'ensemble de test - il peut s'agir d'une surestimation (en raison d'un sur-ajustement). Si c'est plus une surestimation pour M1 que M2, alors vous pourriez voir ce que vous avez vu.

Si vous souhaitez à la fois sélectionner des hyper-paramètres et estimer la précision, je suggère que vous ayez un ensemble de validation distinct pour l'estimation de la précision, ou utilisez une validation croisée imbriquée. Voir https://stats.stackexchange.com/q/65128/2921 et http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html .


Connaissez-vous une autre référence plus théorique (du côté de la théorie des probabilités) qui explique pourquoi un CV imbriqué est nécessaire qu'un CV simple pour la sélection du modèle? Je veux comprendre le mécanisme sous-jacent qui mène au problème que j'ai rencontré
KevinKim

1
Je suggère également d'utiliser la validation croisée imbriquée. si vous faites un CV externe 3 fois et un CV interne 10 fois, vous pourrez tester les 3 modèles que vous entraînez pendant les CV internes sur trois jeux de données différents; cela vous permettra de mieux comprendre comment votre processus de création de modèle finira par fonctionner lorsqu'il rencontrera différents ensembles de données.
darXider

@darXider J'ai lu certains des CV imbriqués, il semble qu'il soit utilisé pour comparer 2 classes de modèles, par exemple, RF et GBT de telle sorte que dans le CV interne, il choisisse les "meilleurs" hyperparamètres (erreur CV la plus faible) de RF et GBT respectivement, puis dans le CV externe, il calcule l'erreur de généralisation de RF et GBT avec les hyperparamètres choisis par le CV interne. Dans mon cas, je n'ai qu'une classe de modèle, le GBT, je veux effectuer un réglage hyperparamétrique. Comment le CV imbriqué m'aide-t-il à faire cela?
KevinKim

@KevinKim AFAIK, le but du CV imbriqué est de donner une idée de la façon dont le processus de construction de modèle généralisera et non de comparer différentes classes de modèles. Comme votre objectif ultime est d'utiliser votre modèle formé (RF ou XGB) sur des données futures / invisibles, vous pourriez mieux comprendre ses performances si vous utilisez un CV imbriqué. Bien sûr, vous effectuez également un réglage hyperparamétrique dans votre CV imbriqué 3x10; à la fin, vous obtiendrez, disons, 3 modèles XGB qui sont équivalents les uns aux autres (notez que vous ne devriez pas choisir l'un des trois, mais vous pouvez les combiner, disons, en utilisant diverses méthodes d'assemblage).
darXider

1

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?

Oui tu devrais. Bien sûr, dans les conditions

  1. les données de test proviennent du même processus de génération que les données de formation et de validation, et
  2. vous disposez de suffisamment de données dans chaque ensemble pour rendre les fluctuations statistiques improbables.

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.

Je peux penser à deux raisons:

  1. 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.

  2. 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.


J'ai le code dans mon message, je ne pense pas avoir abusé de la procédure de CV (avez-vous trouvé quelque chose de mal avec mon code?). Et j'ai bien vu que l'erreur de formation est beaucoup moins et stable (avec petite std) que l'erreur de validation. Je comprends que la véritable erreur de test sera supérieure à l'erreur de validation, mais je m'attends à ce que cela se produise également pour l'ensemble de mon modèle (je veux dire XBGT avec une valeur différente des hyperparamètres). D'après ce que j'ai vu, il semble que certains modèles cela arrive moins que d'autres modèles, ce qui crée ce "phénomène inverse". Je ne sais donc pas dans quelle direction je cherche à régler l'hyperpara
KevinKim

J'ai vu beaucoup de gens suggérer de briser le en 3 parties, former, validation et test, et après avoir réglé hyperP dans l'ensemble de validation, puis appliquer le modèle sur l'ensemble de test pour voir comment ce modèle fonctionnera sur un test réel (car l'étape de validation a également un certain biais). Ensuite, après le test, arrêtez de régler l'hyperP, comme si vous le faisiez, il commencera également à obtenir un biais (comme dans l'ensemble de validation). J'ai compris. Mais si après le test, je ne suis toujours pas satisfait des performances de mon modèle, que dois-je faire?
KevinKim

Je pense que dans la pratique, même si nous vivons dans un monde de «big data», le nombre de fonctionnalités augmente également. Comme nous avons la malédiction des dimensions, il est très probable que même si nous avons un grand nombre de lignes, toujours pour chaque partie de l'espace des fonctionnalités, nous n'avons toujours pas assez de points de données. Ensuite, la fluctuation statistique est toujours là. Ensuite, je me demande si cette procédure de réglage hyperP est toujours correcte ou utile pour obtenir un modèle avec de bonnes performances sur un ensemble de données de test réel. Si le CV n'est pas utile pour effectuer cette tâche, alors quelle est la bonne procédure?
KevinKim

Vérifiez si les pertes d'entraînement dans votre procédure de validation sont comparables entre elles, c'est-à-dire cohérentes. Sinon, essayez une autre sélection de modèle / fonction. Ne continuez pas avant d'avoir ce droit. Faites ensuite la même chose pour vos pertes de validation. Si ceux-ci ne sont pas comparables, essayez une autre méthode de sélection / validation de modèle / fonctionnalité. Quand ils le sont, passez à l'ensemble de test. Si la perte ne vous y satisfait pas, alors rejetez la procédure complète et essayez autre chose. Si vous commencez l'optimisation à l'aide de l'ensemble de test, vous ne pouvez pas vous fier aux performances en direct, car elles seront biaisées par rapport à l'ensemble de test.
Ytsen de Boer

0

C'est possible. Imaginez un scénario simple où le modèle M1a Dmieux compris la variance de l'ensemble de données d'apprentissage que le modèle, M2car ses paramètres sont mieux ajustés. Cela signifie qu'il M1fonctionne mieux Dque M2.

Mais lorsque nous les testons sur l'ensemble de test T, il est possible que les M2performances M1soient meilleures, car elles pourraient sur-adapter Dalors qu'elles M2ne l'étaient pas. Par conséquent, M1fonctionne moins bien Tque M2.

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

  1. Former différents modèles sur le même ensemble d'entraînement
  2. Validé à l'ensemble de validation
  3. Choisissez les performances de base du modèle les plus performantes lors de la validation
  4. Utilisez-le pour noter votre test.

Je pensais que la validation croisée sur l'ensemble de données Davait 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ées Det 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 ce optimizedmodè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ées D, n'est-ce pas?
KevinKim

1
Plus précisément, lorsque vous effectuez un CV 10 fois D, vous coupez d'abord au hasard Den environ 10 morceaux de taille égale, puis à chaque itération, vous ajustez à la fois M1 et M2 sur le même 9/10 D, puis vous les appliquez de la même manière 1 / 10 Dpour obtenir votre test 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-adaptation
KevinKim

Oui, il suffit de conclure que "M1 est meilleur que M2". Mais, si votre procédure de sélection de modèle revient à sélectionner M1 en fonction des performances de validation , votre choix du meilleur modèle (M1 dans ce cas) est biaisé par rapport à l'ensemble de validation. D'où la nécessité d'une vérification finale de l'ensemble de test, pour obtenir une indication de son efficacité sur les données en direct.
Ytsen de Boer

@YtsendeBoer Je me suis finalement convaincu de ce que vous avez dit. Je suis d'accord. Mais ensuite, si sur un autre ensemble de tests indépendant, j'ai trouvé que M1 est pire que M2 (rappelez-vous que M1 est meilleur que M2 sur l'ensemble de validation), alors dans ce cas, devrais-je choisir M1 ou M2 comme modèle final pour faire une prédiction réelle dans le avenir? Si je choisis M1, alors clairement le résultat du test contre M1. Mais si je choisis M2, ne serait-ce pas simplement M2 sur-adaptant également cet ensemble de données de test spécifique? c'est-à-dire de la même manière que le sur-ajustement M1 sur l'ensemble de validation spécifique?
KevinKim

Oui, c'est exactement pourquoi vous ne devriez pas faire de sélection de modèle sur le jeu de test. Vous avez choisi M1 dans votre procédure de sélection de modèle à l'aide du jeu de validation. Ensuite, vous exécutez M1 sur l'ensemble de test et décidez si le résultat est assez bon. Oubliez M2 à ce stade, même s'il s'avère plus performant sur un autre ensemble de test. Si, toutefois, vous avez des doutes sur vos résultats, vous devez ajouter votre "autre jeu de test indépendant" au reste de vos données (plus de données sont meilleures), recommencer la procédure et vous y tenir .
Ytsen de Boer

0

La 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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.