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_size
ou n_iter
, mais si je X
, y
, X_train
, y_train
, X_test
et de façon y_test
approprié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_train
est 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()
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 cv
faut 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.
Réponses:
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^ n p
Var(p^)=p(1−p)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:
Gneiting, T. & Raftery, AE: Règles de notation strictement strictes, prévision et estimation, Journal de l'American Statistical Association, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Chimiométrie pour la reconnaissance de formes, Wiley, (2009).
souligne le comportement instable du SVM en fonction des hyperparamètres.
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.learn
dit qu'ils ont 1797 sont dans lesdigits
données.c'est-à-dire que tous les modèles ont la même performance réelle, disons 97% (performance typique de l'
digits
ensemble de données).Exécutez simulations de "test de ces modèles" avec une taille d'échantillon = 1797 lignes dans le jeu de données104
digits
Voici la distribution pour la meilleure performance observée:
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 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.
la source