La sélection des fonctionnalités doit-elle être effectuée uniquement sur les données d'entraînement (ou toutes les données)? J'ai parcouru des discussions et des articles tels que Guyon (2003) et Singhi et Liu (2006) , mais je ne suis toujours pas sûr de la bonne réponse.
La configuration de mon expérience est la suivante:
- Ensemble de données: 50 témoins sains et 50 patients atteints de maladie (caractéristiques du cca 200 pouvant être pertinentes pour la prédiction de la maladie).
- La tâche consiste à diagnostiquer la maladie en fonction des fonctionnalités disponibles.
Ce que je fais c'est
- Prenez l'ensemble de données et effectuez la sélection d'entités (FS). Je conserve uniquement les fonctionnalités sélectionnées pour un traitement ultérieur
- Fractionner pour tester et former, classificateur de train en utilisant les données du train et les caractéristiques sélectionnées. Ensuite, appliquez le classificateur aux données de test (à nouveau en utilisant uniquement les fonctionnalités sélectionnées). La validation sans intervention est utilisée.
- obtenir une précision de classification
- Moyenne: répéter 1) -3) N fois. (100).
Je suis d'accord que faire de la FS sur l'ensemble de données entier peut introduire un certain biais, mais mon avis est qu'il est "moyenné" pendant la moyenne (étape 4). Est-ce exact? (La variance de précision est )
1 Guyon, I. (2003) "An Introduction to Variable and Feature Selection", The Journal of Machine Learning Research, Vol. 3, pp. 1157-1182
2 Singhi, SK et Liu, H. (2006) "Feature Subset Selection Bias for Classification Learning", Proceeding ICML '06 Actes de la 23e conférence internationale sur l'apprentissage automatique, pp. 849-856
Tout comme un addendum aux réponses ici, j'ai deux liens qui m'ont vraiment aidé à comprendre pourquoi ce n'est pas une bonne procédure:
http://nbviewer.jupyter.org/github/cs109/content/blob/master/lec_10_cross_val.ipynb
https://www.youtube.com/watch?v=S06JpVoNaA0
Edit: comme demandé, une brève explication du contenu des liens:
Supposons que je forme un classificateur et que j'ai un ensemble de données de 1000 échantillons, avec 1 million d'entités chacun. Je ne peux pas tous les traiter, j'ai donc besoin de moins de fonctionnalités (disons, je peux calculer 300 fonctionnalités). J'ai également un ensemble de tests en attente de 100 échantillons pour estimer avec précision ma précision hors échantillon, dans le monde réel.
Si je filtre mes 1 million d'entités à 300, en sélectionnant les entités ayant la plus forte corrélation avec les cibles de l'ensemble de mes données, je fais une erreur (car j'introduis un sur-ajustement qui ne peut pas être détecté par la validation croisée plus tard). Mon set retenu le montrera en crachant une mauvaise valeur de précision.
Selon les liens ci-dessus, la bonne façon de le faire est de diviser mon ensemble de données en un ensemble de formation et un ensemble de validation croisée, puis de régler mon modèle (filtrage des fonctionnalités, etc.) en fonction de cet ensemble de formation et de son score CV associé. Si j'utilise des plis en K, je dois régler à partir de zéro chaque fois que je fais un split / fold, puis faire la moyenne des résultats.
Par programme, vous procédez comme suit:
Il est très important que vous effectuiez l'ingénierie des fonctionnalités à l'intérieur de la boucle, sur l'ensemble de sous-formation, Ti, plutôt que sur l'ensemble de formation complet, T1.
La raison en est que lorsque vous ajustez / ingénieur de fonctionnalités pour Ti, vous testez sur CVi, qui n'est pas visible pour ce modèle. Alors que, si vous ajustez / intégrez l'ingénieur sur T1, tout CV que vous choisissez doit être un sous-ensemble T1, et donc vous serez biaisé de manière optimiste, c'est-à-dire que vous serez surajusté, car vous vous entraînez et testez sur les mêmes échantillons de données.
Une très bonne réponse StackExchange est celle- ci, qui l'explique vraiment plus en profondeur et avec un exemple de code. Voir également cela comme un addendum.
la source
Le bootstrap "optimisme" Efron-Gong est très bon pour cela. L'idée est d'utiliser toutes les données disponibles pour développer le modèle prédictif et d'utiliser toutes les données pour estimer les performances futures probables de ce même modèle. Et la taille de votre échantillon est trop petite d'un facteur 100 pour que les approches à échantillon divisé fonctionnent.
Pour utiliser correctement le bootstrap, vous devez programmer toutes les étapes qui ont utilisé et les répéter à chaque rééchantillonnage. À l'exception de la sélection des fonctionnalités, voici un bon exemple: Interprétation d'un modèle de régression logistique avec plusieurs prédicteursY
la source