Sélection de modèle et validation croisée: la bonne manière

34

CrossValidated contient de nombreuses discussions sur la sélection de modèles et la validation croisée. Voici quelques-uns:

Cependant, les réponses à ces discussions sont assez génériques et soulignent principalement les problèmes liés aux approches particulières en matière de validation croisée et de sélection de modèle.

Pour rendre les choses aussi concrètes que possible , disons par exemple que nous travaillons avec un SVM avec un noyau RBF: , et que J'ai un jeu de données d'entités X et d'étiquettes y , et que je veuxK(x,x)=(γ|xx|)2

  1. Trouver les meilleures valeurs possibles de mon modèle ( etγC )
  2. Former le SVM avec mon jeu de données (pour le déploiement final)
  3. Estimer l'erreur de généralisation et l'incertitude (variance) autour de cette erreur

Pour ce faire, je voudrais personnellement faire une recherche sur la grille, par exemple, j'essaie toutes les combinaisons possibles de et . Pour simplifier, on peut supposer les plages suivantes:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

Plus précisément, en utilisant mon ensemble de données complet, je procède comme suit:

  1. Pour chaque paire ( , ), j'effectue des itérations répétées (par exemple 100 répétitions aléatoires) de validation croisée de pli (par exemple ) sur mon jeu de données, c'est-à-dire que je forme mon SVM sur plis de et évalue la erreur sur le pli gauche, itérant à travers tous les plis. Globalement, je collecte 100 x 10 = 1000 erreurs de test.CγKK=10K1K
  2. Pour chacune de ces paires ( , ), je calcule la moyenne et la variance de ces 1000 erreurs de test .CγμM,σM

Maintenant, je veux choisir le meilleur modèle (les meilleurs paramètres de noyau) que je voudrais utiliser pour former mon SVM final sur l'ensemble de données. D'après ce que je comprends, choisir le modèle qui présente la moyenne d'erreur la plus faible et la variance et serait le bon choix, et que les are ce modèle sont mes meilleures estimations du biais d'erreur et de la variance de généralisation du modèle lors de la formation avec l'ensemble de données complet.μMσMμMσM

MAIS, après avoir lu les réponses dans les discussions ci-dessus, j’ai l’impression que cette méthode pour choisir le meilleur SVM pour le déploiement et / ou pour estimer son erreur (performances de généralisation) est imparfaite et qu’il existe de meilleurs moyens de choisir le SVM. meilleur SVM et signaler son erreur. Si c'est vrai, que sont-ils? Je cherche une réponse concrète s'il vous plaît.

En ce qui concerne ce problème, comment puis-je choisir le meilleur modèle et évaluer correctement son erreur de généralisation ?

Amelio Vazquez-Reina
la source
Pour rendre les choses aussi concrètes que possible, veuillez nous indiquer: Combien de cas statistiquement indépendants avez-vous dans votre ensemble de données? Quelle est la fonction cible que vous évaluez pour l'optimisation / Quel type de mesure d'erreur utilisez-vous? Observez-vous réellement un comportement cohérent de la mesure d'erreur choisie sur votre grille de paramètres? Dans le cas où vous parlez de classification et que votre mesure d'erreur le permet: comment les résultats de validation croisée itérés se comparent-ils à la variance que vous attendez (mais ne peuvent pas mesurer) en raison de la taille finie de l'échantillon?
cbeleites soutient Monica
Un article qui pourrait vous intéresser: optimalprediction.com/files/pdf/V2A5.pdf
user31256
2
+1 pour une question très claire et détaillée, ainsi que pour une question très pertinente pour la communauté de la science des données en général.
NickBraunagel

Réponses:

20

Mon article dans JMLR aborde cette question précise et montre pourquoi la procédure suggérée dans la question (ou au moins une très similaire) entraîne des estimations de performance biaisées de manière optimiste:

Gavin C. Cawley, Nicola LC Talbot, "Sur-ajustement dans la sélection de modèles et biais de sélection ultérieurs dans l'évaluation de performances", Journal of Machine Learning Research, 11 (Jul): 2079-2107, 2010. ( www )

L'essentiel à retenir est que la validation croisée est une technique permettant d'estimer les performances de généralisation d'une méthode de génération de modèle plutôt que du modèle lui-même. Par conséquent, si la sélection des paramètres du noyau fait partie du processus de génération du modèle, vous devez également procéder à une validation croisée du processus de sélection du modèle. Dans le cas contraire, vous obtiendrez une estimation de performance biaisée de manière optimiste (comme cela sera le cas avec la procédure que vous proposez).

Supposons que vous ayez une fonction fit_model, qui prend en charge un ensemble de données composé d'attributs X et de réponses souhaitées Y, et qui renvoie le modèle ajusté pour cet ensemble de données, y compris le réglage des hyper-paramètres (dans ce cas, les paramètres de noyau et de régularisation). Cet ajustement des hyper-paramètres peut être effectué de nombreuses manières, par exemple en minimisant l'erreur de validation croisée sur X et T.

Étape 1 - Ajustez le modèle à toutes les données disponibles à l’aide de la fonction fit_model. Cela vous donne le modèle que vous utiliserez en fonctionnement.

Étape 2 - Évaluation du rendement. Effectuez des validations croisées répétées en utilisant toutes les données disponibles. Dans chaque pli, les données sont partitionnées en un ensemble d'apprentissage et un ensemble de test. Ajustez le modèle à l'aide du jeu d'apprentissage (enregistrez les valeurs d'hyper-paramètre pour le modèle ajusté) et évaluez les performances du jeu de test. Utilisez la moyenne de tous les ensembles de tests comme estimation de la performance (et examinez peut-être également la dispersion des valeurs).

Étape 3 - Variabilité des paramètres d’hyper-paramètres - effectuez une analyse des valeurs d’hyper-paramètres collectées à l’étape 3. Cependant, il convient de souligner qu’il n’ya rien de spécial à propos des hyper-paramètres, ce sont juste des paramètres du modèle qui ont été estimés (indirectement). ) à partir des données. Ils sont traités comme des hyper-paramètres plutôt que comme paramètres pour des raisons de commodité de calcul / mathématiques, mais cela n’est pas nécessairement le cas.

Le problème de l’utilisation de la validation croisée ici est que les données d’apprentissage et de test ne sont pas des échantillons indépendants (car elles partagent des données), ce qui signifie que l’estimation de la variance de l’estimation de la performance et des hyper-paramètres risque d’être biaisée (c.-à-d. plus petit que ce ne serait le cas pour des échantillons de données réellement indépendants dans chaque repli). Plutôt que de procéder à une validation croisée répétée, j'utiliserais probablement plutôt bootstrap et capturer les modèles résultants si cela était réalisable sur le plan du calcul.

Le point clé est que pour obtenir une estimation de performance non biaisée, quelle que soit la procédure utilisée pour générer le modèle final (fit_model), elle doit être répétée dans son intégralité indépendamment dans chaque étape de la procédure de validation croisée.

Dikran Marsupial
la source
C'est une excellente réponse. Quand vous dites rather than repeated cross-validation you would go for bootstrapping- Quelle est exactement la différence? Les deux impliquent de multiples répétitions de diviser les données en trainet testet de la formation puis dans trainet à l' évaluation dans test, non?
Josh
4
Le bootstrap (échantillonnage avec remplacement) semble un moyen plus naturel de procéder à un grand nombre de ré-échantillonnages, car il est plus aléatoire que la validation croisée répétée. Pour amorcer l’utilisation d’ensembles ensachés est une fonctionnalité intéressante, l’erreur hors du sac étant une estimation de la performance. Il n'y a pas beaucoup de choses à choisir entre les deux.
Dikran Marsupial
Merci @Dikran - Cela m'a fait me demander, en supposant que l'on utilise par exemple l'amorçage, comment choisirais-tu un bon modèle en considérant la moyenne et la variance entre répétitions? (c.-à-d. quel protocole de sélection de modèle suivriez-vous?). Cette question pose exactement cette question. Obtenir votre avis sur ce sujet serait extrêmement précieux!
Josh
@DikranMarsupial Pourriez-vous poster du code (par exemple, Python ou R) pour vos étapes 1 à 3? Je trouve beaucoup plus facile de comprendre de telles procédures lorsque je vois du code concret.
tobip
1
Message clé: "Le point clé est que pour obtenir une estimation de performance impartiale, quelle que soit la procédure utilisée pour générer le modèle final (fit_model), elle doit être répétée dans son intégralité indépendamment dans chaque repli de la procédure de validation croisée." Ce message exact est également transmis dans Les éléments de l’apprentissage statistique (voir la section 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel le
0

L'utilisation d'un SVM avec des hyperparamètres fixes ( et ) est un algorithme d'apprentissage automatique.γC

Une procédure qui optimise ces hyperparamètres et forme un SVM avec ceux - ci est également un simple algorithme d'apprentissage automatique . Au lieu d'optimiser uniquement les paramètres internes du SVM (les vecteurs de support), il optimise également les hyperparamètres.

Maintenant, vous avez deux problèmes [qui peuvent être résolus indépendamment]:

Lisez Mauvaise utilisation de la validation croisée (performances de rapport pour la meilleure valeur d'hyperparamètre) pour vous assurer de ne pas les mélanger.


Une solution spécifique (probablement pas optimale) au problème concret de votre question:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Ici, ce modelserait votre "meilleur modèle" et loss_CVune "estimation correcte de son erreur de généralisation" (bien que biaisé à la hausse, mais vous ne pouvez pas avoir le gâteau et le manger aussi).

Jan-Glx
la source