Comment diviser le jeu de données pour la validation croisée, la courbe d'apprentissage et l'évaluation finale?

70

Quelle est la stratégie appropriée pour diviser l’ensemble de données?

Je demande des commentaires sur l'approche suivante (pas sur les paramètres individuels comme test_sizeou n_iter, mais si je X, y, X_train, y_train, X_testet de façon y_testappropriée et si la séquence est logique):

(étendant cet exemple à partir de la documentation scikit-learn)

1. Chargez le jeu de données

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Divisé en un ensemble d’entraînement et de test (par exemple, 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Choisissez un estimateur

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Choisissez l'itérateur de validation croisée

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Réglez les hyperparamètres

appliquer l'itérateur de validation croisée sur l' ensemble de formation

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Algorithme de débogage avec courbe d'apprentissage

X_trainest divisé au hasard en un entraînement et un test 10 fois ( n_iter=10). Chaque point de la courbe de score de formation correspond à la moyenne de 10 scores pour lesquels le modèle a été formé et évalué sur les i premiers exemples de formation. Chaque point de la courbe de score de validation croisée est la moyenne des 10 notes où le modèle a été formé sur les premiers i exemples de formation et évalués sur tous les exemples de l'ensemble de test.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Courbe d'apprentissage

plot_learning_curve () se trouve dans la version de développement actuelle de scikit-learn (0.15-git).

7. Évaluation finale sur l'ensemble de test

classifier.score(X_test, y_test)

7a. Tester le sur-ajustement dans la sélection du modèle avec une validation croisée imbriquée (en utilisant l'ensemble de données)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Question supplémentaire: Est-il judicieux de remplacer l'étape 7 par une validation croisée imbriquée? Ou le CV imbriqué doit-il être considéré comme complémentaire à l'étape 7?

(le code semble fonctionner avec la validation croisée des k-fold dans scikit-learn, mais pas avec shuffle & split. Il cvfaut donc le modifier ci-dessus pour que le code fonctionne)

8. Former le modèle final sur l'ensemble de données

classifier.fit(X, y)

EDIT: Je conviens maintenant avec les cbéléites que l’étape 7a n’a pas beaucoup de sens dans cette séquence. Donc je n'adopterais pas cela.

glisser
la source
Quelle règle de précision utilisez-vous? S'il s'agit d'une précision de classification, une telle règle de notation annulera une grande partie du travail que vous avez effectué.
Frank Harrell
J'ai utilisé le défaut qui est en effet la précision de la classification. Je sais que, par exemple, F1 serait plus approprié. Mais ici, je suis seulement intéressé si les scissions sont utilisées correctement.
Tobip
3
Je suis presque certain que F1 est un nouveau nom pour un vieux concept. Je pense qu'il est contre-productif d'inventer de nouveaux noms pour de vieilles choses. Plus important encore, il s’agit d’une règle de notation inappropriée qui entraîne la sélection des mauvaises caractéristiques et ajoute beaucoup de bruit dans l’ensemble du processus.
Frank Harrell
3
... en tout cas, la F1 partage les problèmes de précision auxquels @FrankHarrell fait allusion: ils proviennent du comptage de fractions de cas tests de classifcations dures. Pour obtenir l'une des règles de notation appropriées de Frank, vous devez passer à la sortie probabiliste du SVM, puis utiliser par exemple le score de Brier (erreur quadratique moyenne) au lieu de la précision. Je suppose que vous pourriez également obtenir une version de type F1 de MSE. De telles mesures devraient en effet être meilleures pour l'étape de réglage. Pour communiquer la performance finale, vous aurez peut-être également besoin des moyens classiques (précision, F1, par exemple) d’exprimer la performance pour votre communauté.
cbeleites
1
@ ta.ft: que l'approche soit erronée ou non dépend de ce que vous considérez comme erroné: la recherche par grille sur les proportions présente un risque sérieux d'écrémage sauf si vous avez un nombre ridiculement élevé de cas indépendants. Ainsi, dans de nombreuses situations, l'affirmation selon laquelle la recherche sur la grille donne le modèle optimal est fausse. Toutefois, si vous effectuez une validation imbriquée appropriée, la validation externe fournit une mesure honnête de la performance du modèle "optimal" choisi. Donc ce n'est pas faux. Vous n'avez simplement aucune garantie que la recherche sur la grille ait le modèle optimal. En ce qui concerne la littérature, je mettrai à jour ma réponse.
cbeleites

Réponses:

41

Je ne suis pas sûr de ce que vous voulez faire à l'étape 7a. Si je comprends bien, cela n’a aucun sens pour moi.

Voici comment je comprends votre description: à l’étape 7, vous souhaitez comparer les performances de maintien avec les résultats d’une validation croisée englobant les étapes 4 à 6. (Donc, oui, ce serait une configuration imbriquée).

Les points principaux pour lesquels je ne pense pas que cette comparaison ait beaucoup de sens sont:

  • Cette comparaison ne permet pas de détecter deux des principales sources de résultats de validation trop optimistes que je rencontre dans la pratique:

    • fuites de données (dépendance) entre les données d'apprentissage et de test causées par une structure de données hiérarchique (ou clusterisée) et non prises en compte dans le fractionnement. Dans mon domaine, nous avons généralement plusieurs lectures (parfois des milliers) de lectures (= rangées dans la matrice de données) d'un même patient ou d'une réplique biologique d'une expérience. Celles-ci ne sont pas indépendantes, le fractionnement de validation doit donc être effectué au niveau du patient. Cependant, une telle fuite de données se produit. Vous la retrouverez à la fois dans le fractionnement pour l'ensemble de conservation et dans le fractionnement par validation croisée. Les procédures en suspens seraient alors aussi biaisées avec optimisme que la validation croisée.

    • Le prétraitement des données est effectué sur l’ensemble de la matrice de données, où les calculs ne sont pas indépendants pour chaque ligne, mais plusieurs / toutes les lignes sont utilisées pour calculer les paramètres de prétraitement. Des exemples typiques seraient par exemple une projection PCA avant la classification "réelle".
      Encore une fois, cela affecterait à la fois votre attente et la validation croisée externe, de sorte que vous ne pouvez pas le détecter.

    Pour les données avec lesquelles je travaille, les deux erreurs peuvent facilement sous-estimer la fraction d'erreurs de classification d'un ordre de grandeur!

  • Si vous êtes limité à cette fraction comptée de types de performances de test, les comparaisons de modèles nécessitent soit un nombre extrêmement important de tests, soit des différences ridiculement grandes en performances réelles. La comparaison de 2 classificateurs avec des données d’entraînement illimitées peut être un bon début de lecture.

Cependant, comparer la qualité du modèle entre les affirmations de validation croisée interne pour le modèle "optimal" et la validation croisée externe ou la validation différée est logique: si l'écart est élevé, il est douteux que l'optimisation de votre recherche dans la grille fonctionne (vous pourriez avoir écrémé en raison de la variance élevée de la mesure de performance). Cette comparaison est plus facile en ce sens que vous pouvez repérer les problèmes si votre estimation interne est ridiculement bonne par rapport à l’autre - si ce n’est pas le cas, vous n'avez pas à vous soucier de votre optimisation. Mais dans tous les cas, si votre mesure externe (7) de la performance est honnête et correcte, vous avez au moins une estimation utile du modèle obtenu, qu’il soit optimal ou non.

IMHO mesurer la courbe d'apprentissage est encore un problème différent. Je traiterais probablement cela séparément, et je pense que vous devez définir plus clairement ce dont vous avez besoin de la courbe d'apprentissage (avez-vous besoin de la courbe d'apprentissage pour un ensemble de données du problème donné, des données et de la méthode de classification ou de la courbe d'apprentissage pour cet ensemble de données du problème donné, des données et de la méthode de classification), ainsi que pour un ensemble de décisions ultérieures (par exemple, comment gérer la complexité du modèle en fonction de la taille de l'échantillon d'apprentissage? Optimiser à nouveau, utiliser des hyperparamètres fixes, décider fonction permettant de corriger les hyperparamètres en fonction de la taille du jeu d’entraînement?)

(Mes données ont généralement si peu de cas indépendants pour obtenir la mesure de la courbe d'apprentissage suffisamment précise pour pouvoir l'utiliser, mais vous pouvez peut-être faire mieux si vos 1200 lignes sont réellement indépendantes)


update: Qu'est-ce qui ne va pas avec l'exemple scikit-learn?

Tout d’abord, la validation croisée imbriquée ici n’est pas un problème. La validation imbriquée est de la plus haute importance pour l’optimisation pilotée par les données, et la validation croisée est une approche très puissante (en particulier si elle est itérée / répétée).

Ensuite, si quelque chose ne va pas du tout, cela dépend de votre point de vue: tant que vous effectuez une validation imbriquée honnête (en gardant les données de test externes strictement indépendantes), la validation externe est une mesure appropriée des performances du modèle "optimal". Aucun problème avec ça.

Cependant, plusieurs problèmes peuvent survenir avec la recherche sur grille de ces mesures de performance de type proportionnelle pour le réglage hyperparamètre de SVM. En gros, cela signifie que vous ne pouvez (probablement?) Pas compter sur l'optimisation. Néanmoins, tant que votre scission externe a été effectuée correctement, même si le modèle n’est pas le meilleur possible, vous disposez d’une estimation honnête des performances du modèle que vous avez obtenu.

Je vais essayer d'expliquer de manière intuitive pourquoi l'optimisation risque de poser problème:

  • Sur le plan mathématique et statistique, le problème des proportions est que les proportions mesurées sont soumises à une variance énorme en raison de la taille de l'échantillon de test fini ((qui dépend également de la performance réelle du modèle, ):p^np
    Var(p^)=p(1p)n

    Vous avez besoin d'un nombre ridiculement énorme de cas (au moins par rapport au nombre de cas que je peux généralement avoir) afin d'obtenir la précision nécessaire (sens du biais / variance) pour estimer le rappel, la précision (sens du rendement de l'apprentissage automatique). Ceci s'applique bien sûr aussi aux ratios que vous calculez à partir de telles proportions. Consultez les intervalles de confiance pour les proportions binomiales. Ils sont incroyablement grands! Souvent plus importante que la véritable amélioration des performances sur la grille de l'hyperparamètre. Et statistiquement, la recherche sur la grille est un problème de comparaison multiple énorme: plus vous évaluez de points de la grille, plus le risque de trouver une combinaison d'hyperparamètres qui par hasard est très bon pour la fraction train / test que vous évaluez. C'est ce que je veux dire par écrémage.

  • Intuitivement, considérons un changement hypothétique d'un hyperparamètre, qui entraîne lentement la détérioration du modèle: un cas de test se déplace vers la limite de décision. Les mesures de performance de la proportion «dure» ne détectent pas cela jusqu'à ce que le cas traverse la frontière et soit du mauvais côté. Ensuite, cependant, ils attribuent immédiatement une erreur complète pour un changement infiniment petit de l'hyperparamètre.
    Afin de faire de l'optimisation numérique, vous avez besoin que la mesure de performance se comporte bien. Cela signifie que ni la partie saccadée (non continuellement différenciable) de la mesure de performance de type proportionnelle ni le fait que, mis à part ce saut, les modifications en cours ne sont pas détectées ne conviennent pas à l'optimisation.
    Les règles de scoring appropriées sont définies de manière particulièrement appropriée pour l'optimisation. Ils ont leur maximum global lorsque les probabilités prédites correspondent aux probabilités réelles d'appartenance de chaque cas à la classe en question.

  • Pour les SVM, vous avez le problème supplémentaire que non seulement les mesures de performance, mais également le modèle réagissent de cette manière instable: de petits changements de l'hyperparamètre ne changeront rien. Le modèle change uniquement lorsque les hyperparamètres le sont suffisamment pour que certains cas cessent d'être des vecteurs de support ou deviennent des vecteurs de support. Encore une fois, ces modèles sont difficiles à optimiser.

Littérature:


Mise à jour II: Variance d'écrémage

Ce que vous pouvez vous permettre en termes de comparaison de modèles dépend évidemment du nombre de cas indépendants. Faisons une simulation rapide et approximative sur le risque d'écrémage de la variance ici:

scikit.learndit qu'ils ont 1797 sont dans les digitsdonnées.

  • supposons que 100 modèles soient comparés, par exemple une grille pour 2 paramètres.10×10
  • supposons que les deux paramètres (plages) n’affectent pas du tout les modèles,
  • c'est-à-dire que tous les modèles ont la même performance réelle, disons 97% (performance typique de l' digitsensemble de données).

  • Exécutez simulations de "test de ces modèles" avec une taille d'échantillon = 1797 lignes dans le jeu de données104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

Voici la distribution pour la meilleure performance observée:

écrémage simulation de variance

La ligne rouge marque la véritable performance de tous nos modèles hypothétiques. En moyenne, nous n'observons que les 2/3 du taux d'erreur réel pour le meilleur des 100 modèles comparés (pour la simulation, nous savons qu'ils fonctionnent tous de la même manière, avec des prévisions correctes à 97%).

Cette simulation est évidemment très simplifiée:

  • En plus de la variance de la taille de l'échantillon testé, il existe au moins une variance due à l'instabilité du modèle. Nous sous-estimons donc la variance ici.
  • Le réglage des paramètres affectant la complexité du modèle couvrira généralement les jeux de paramètres dans lesquels les modèles sont instables et présentent donc une variance élevée.
  • Pour les chiffres UCI de l'exemple, la base de données d'origine a env. 11000 chiffres écrits par 44 personnes. Que se passe-t-il si les données sont regroupées en fonction de la personne qui a écrit? (Par exemple, est-il plus facile de reconnaître un 8 écrit par une personne si vous savez comment cette personne écrit, par exemple un 3?) La taille de l'échantillon effectif peut alors être aussi faible que 44.
  • Le réglage des hyperparamètres des modèles peut conduire à une corrélation entre les modèles (en fait, cela serait considéré comme se comportant bien du point de vue de l'optimisation numérique). Il est difficile de prédire l’influence de cela (et je suppose que cela est impossible sans prendre en compte le type de classificateur réel).

En général, cependant, le faible nombre de cas de test indépendants et le nombre élevé de modèles comparés augmentent le biais. En outre, l'article de Cawley et Talbot donne un comportement observé empirique.

cbéléites
la source
@cbleites: Si la recherche par grille peut ne pas être une méthode appropriée pour trouver le modèle optimal, quelle méthode devrais-je choisir alors?
Tobip
1
@ ta.ft: deux approches sont: a) incorporer autant de connaissances externes sur votre application et vos données dans la modélisation afin de réduire considérablement le nombre de modèles à comparer (= décidez des hyperparamètres au lieu d'optimiser). Dans l’ensemble, il peut être préférable de choisir un classificateur doté d’hyperparamètres intrinsèquement significatifs, c’est-à-dire où vous pouvez savoir à partir de l’application et du type de données ce que doit être l’hyperparamètre. b) compare les quelques modèles restants en appliquant la règle de notation appropriée. Par exemple, le score de Briers a des propriétés de variance bien meilleures pour de nombreux classificateurs.
cbeleites
1
Vous pouvez également refuser d’optimiser du tout (via les décisions (a)). Si vous obtenez un classificateur assez bon et que vous pouvez affirmer que vous n’avez aucune chance de prouver la supériorité d’un autre classificateur compte tenu de la taille de l’échantillon disponible (par exemple, effectuez des calculs démo de McNemar, recherchez la taille d’échantillon nécessaire pour les comparaisons de proportions d’un meilleur classificateur hypothétique - il y a Il y a de fortes chances pour que ceux-ci soient ridiculement grands, même pour des améliorations hypothétiques ridiculement grandes), mais vous pouvez affirmer que l'optimisation n'a aucun sens et crée simplement un risque de surajustement.
cbeleites
Je ne suis pas d'accord avec vous sur "écrémage variance". Si vous avez beaucoup de points dans la grille pour l'optimisation de l'hyperparamètre, un point peut devenir chanceux dans un pli du CV; mais si vous avez, disons un CV multiplié par 10, il est toujours improbable qu'un jeu de paramètres devienne accidentellement chanceux sur les 10 plis du CV.
ARN
1
@ ARN: La probabilité d'être "chanceux" dans tous les plis est directement liée au nombre total de cas (tous les 10 plis), et généralement, seule la moyenne de tous ces plis est prise en compte. J'ai mis à jour la réponse en simulant une sélection hypothétique du meilleur des 100 modèles (par exemple, 2 hyperparamètres de 10 étapes chacun), ce qui est déjà associé à un biais considérable pour l'exemple de scénario (taux d'erreur trop faible de 1/3) . Beaucoup de personnes ici ont rarement quelques milliers de cas indépendants sous la main, par exemple, même les 44 personnes qui ont écrit des chiffres pour l'ensemble des données de chiffres UCI.
cbeleites