Sélection des fonctionnalités et validation croisée

76

Récemment, j'ai beaucoup lu sur ce site (@Aniko, @Dikran Marsupial, @Erik) et ailleurs sur le problème du surajustement avec une validation croisée - (Smialowski et al 2010, Bioinformatics, Hastie, Éléments d'apprentissage statistique). Il est suggéré que toute sélection de caractéristique supervisée (utilisant la corrélation avec les étiquettes de classe) effectuée en dehors de l'estimation de performance du modèle à l'aide de la validation croisée (ou d'une autre méthode d'estimation de modèle telle que l'amorçage) peut entraîner un surajustement.

Cela ne me semble pas intuitif - si vous sélectionnez un ensemble de fonctionnalités puis évaluez votre modèle en utilisant uniquement les fonctionnalités sélectionnées à l'aide de la validation croisée, vous obtenez une estimation non biaisée de la performance généralisée du modèle pour ces fonctionnalités (cela suppose que l'échantillon étudié soit représentatif de la populatation)?

Avec cette procédure, on ne peut bien sûr pas revendiquer un ensemble de fonctionnalités optimal, mais peut-on également indiquer que les performances du jeu de fonctionnalités sélectionné sur des données invisibles sont valides?

J'accepte le fait que la sélection de caractéristiques sur l'ensemble du jeu de données peut entraîner certaines fuites de données entre les ensembles de test et de train. Mais si l'ensemble de fonctionnalités est statique après la sélection initiale et qu'aucun autre réglage n'est effectué, il est sûrement possible de signaler les métriques de performance validées de manière croisée.

Dans mon cas, j'ai 56 fonctionnalités et 259 cas et ainsi #cases> #features. Les caractéristiques sont dérivées des données du capteur.

Toutes mes excuses si ma question semble dérivée, mais cela semble être un point important à clarifier.

Edit: Lors de la mise en œuvre de la sélection des fonctionnalités dans la validation croisée sur le jeu de données détaillé ci-dessus (grâce aux réponses ci-dessous), je peux confirmer que la sélection des fonctionnalités avant la validation croisée dans ce jeu de données a introduit un impact significatif.partialité. Ce biais / surajustement était le plus important dans le cas d’une formulation à 3 classes, par rapport à une formulation à 2 classes. Je pense que le fait d’avoir utilisé la régression par étapes pour la sélection des caractéristiques a augmenté ce sur-ajustement; à des fins de comparaison, sur un ensemble de données différent mais lié, j'ai comparé un sous-programme séquentiel de sélection de fonction avant exécuté avant la validation croisée par rapport à des résultats que j'avais précédemment obtenus avec la sélection de caractéristique dans CV. Les résultats entre les deux méthodes ne différaient pas considérablement. Cela peut signifier que la régression pas à pas est plus encline à sur-adapter que les FS séquentielles ou peut être une bizarrerie de cet ensemble de données.

BGreene
la source
7
Je ne pense pas que ce soit (tout à fait) ce que Hastie et al. préconisent. L'argument général est que si la sélection de fonctionnalités utilise la réponse, il est préférable de l'inclure dans le cadre de votre procédure de CV. Si vous effectuez un filtrage de prédicteurs, par exemple en examinant leurs variances d'échantillon et en excluant les prédicteurs avec une faible variation, vous pouvez utiliser une procédure unique.
cardinal
3
+1 Cependant, même dans ce cas, la validation croisée ne représente pas la variance dans le processus de sélection des fonctionnalités, ce qui peut poser problème si la sélection des fonctionnalités est instable. Si vous effectuez d'abord la sélection, la variabilité de la performance dans chaque pli sous-représentera la variabilité réelle. Si vous effectuez la sélection dans chaque pli, la variabilité de la performance de chaque pli augmentera de manière appropriée. Je ferais toujours toujours la sélection dans chaque pli si je pouvais me permettre les frais de calcul.
Dikran Marsupial
1
Je pense que l’affirmation "TOUTE sélection de caractéristiques effectuée avant l’estimation des performances du modèle à l’aide de la validation croisée peut entraîner un surajustement". est une déclaration inexacte ou déformée de ce que suggèrent Hastie et d’autres. Si vous changez le mot "prior" en "sans", cela aura plus de sens. De plus, la phrase semble suggérer que la validation croisée est le seul moyen de tester légitimement le bien-fondé des variables sélectionnées. Le bootstrap, par exemple, pourrait être une autre approche légitime. .
Michael Chernick
@ MichaelChernick - d'accord. J'ai édité ci-dessus pour mieux refléter mon sens.
BGreene
1
@Bgreene: une discussion récente sur cette question peut être lue sur goo.gl/C8BUa .
Alekk

Réponses:

69

Si vous effectuez la sélection des fonctionnalités sur toutes les données, puis effectuez une validation croisée, les données de test de chaque pli de la procédure de validation croisée ont également été utilisées pour choisir les fonctionnalités. C'est ce qui biaise l'analyse des performances.

Considérons cet exemple. Nous générons des données cibles en retournant une pièce de monnaie 10 fois et en enregistrant si elle tombe en tête ou en queue. Ensuite, nous générons 20 objets en retournant la pièce 10 fois pour chaque objet et écrivez ce que nous obtenons. Nous effectuons ensuite la sélection des caractéristiques en choisissant celle qui correspond le mieux aux données cibles et nous l'utilisons comme prédiction. Si nous validons ensuite, nous obtiendrons un taux d'erreur attendu légèrement inférieur à 0,5. En effet, nous avons choisi la fonctionnalité sur la base d'une corrélation à la fois entre le kit d'apprentissage et le kit de test, dans chaque étape de la procédure de validation croisée. Cependant, le taux d'erreur réel va être de 0,5 car les données cibles sont simplement aléatoires. Si vous sélectionnez les fonctionnalités indépendamment dans chaque repli de la validation croisée, la valeur attendue du taux d'erreur est 0.

L'idée principale est que la validation croisée est un moyen d'estimer la performance de généralisation d'un processus pour la construction d'un modèle. Vous devez donc répéter le processus dans son intégralité. Sinon, vous vous retrouverez avec une estimation biaisée ou une sous-estimation de la variance de l'estimation (ou des deux).

HTH

Voici un code MATLAB qui effectue une simulation Monte-Carlo de cette configuration, avec 56 fonctions et 259 cas, pour correspondre à votre exemple, le résultat obtenu est:

Estimateur biaisé: erate = 0.429210 (0.397683 - 0.451737)

Estimateur non biaisé: erate = 0,499689 (0,397683 - 0,590734)

L'estimateur biaisé est celui où la sélection de caractéristiques est effectuée avant la validation croisée, l'estimateur non biaisé est celui où la sélection de caractéristiques est effectuée indépendamment dans chaque repli de la validation croisée. Cela suggère que le biais peut être assez grave dans ce cas, en fonction de la nature de la tâche d'apprentissage.

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));
Dikran Marsupial
la source
3
Merci - c'est très utile. Si vous adoptez l’approche suggérée, comment évaluez-vous ensuite votre modèle final? Comme vous aurez plusieurs ensembles de fonctionnalités, comment choisissez-vous le dernier ensemble de fonctionnalités? Historiquement, j'ai également rapporté des résultats basés sur une validation croisée unique avec les paramètres du modèle et les fonctionnalités choisies.
BGreene
16
Il est préférable de considérer la validation croisée comme une évaluation des performances d'une procédure d'adaptation d'un modèle plutôt que du modèle lui-même. La meilleure chose à faire est normalement d'effectuer la validation croisée comme ci-dessus, puis de construire votre modèle final en utilisant l'intégralité du jeu de données en utilisant la même procédure que celle utilisée dans chaque repli de la procédure de validation croisée.
Dikran Marsupial
2
Dans ce cas, communiquons-nous les résultats de la classification sur la base de la validation croisée (potentiellement de nombreux jeux de fonctionnalités différents) tout en signalant que le modèle ne contient qu'un seul de ces jeux de fonctionnalités, c'est-à-dire que les résultats de classification validés de manière croisée ne correspondent pas nécessairement au jeu de fonctionnalités?
BGreene
10
Essentiellement, la validation croisée estime uniquement les performances attendues d'un processus de création de modèle, et non le modèle lui-même. Si l'ensemble des fonctionnalités varie considérablement d'un pli de la validation croisée à un autre, cela indique que la sélection de la fonctionnalité est instable et n'a probablement pas beaucoup de sens. Il est souvent préférable d’utiliser la régularisation (par exemple, la régression de la crête) plutôt que la sélection des caractéristiques, en particulier si cette dernière est instable.
Dikran Marsupial
3
C'est un poste tellement important. Incroyable combien n'appliquent pas cela.
Chris A.
12

Pour ajouter une description légèrement différente et plus générale du problème:

Si vous effectuez un type de prétraitement basé sur les données , par exemple

  1. optimisation des paramètres guidée par validation croisée / out-of-bootstrap
  2. réduction de la dimensionnalité avec des techniques telles que PCA ou PLS pour générer des entrées pour le modèle (p. ex. PLS-LDA, PCA-LDA)
  3. ...

et si vous souhaitez utiliser la validation croisée / out-of-bootstrap (/ hold-out) pour estimer les performances du modèle final , le prétraitement piloté par les données doit être effectué sur les données de formation de substitution, c'est-à-dire séparément pour chaque modèle de substitution.

Si le prétraitement piloté par les données est de type 1. Ceci conduit à une validation croisée "double" ou "imbriquée": l'estimation du paramètre est réalisée dans une validation croisée utilisant uniquement le jeu d'apprentissage de la validation croisée "externe". Les ElemStatLearn ont une illustration ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf page 222 sur 5).

Vous pouvez dire que le prétraitement fait vraiment partie de la construction du modèle. seul le prétraitement est fait

  • indépendamment pour chaque cas ou
  • indépendamment de l'ensemble de données réel

peut être sorti de la boucle de validation pour sauvegarder les calculs.

Inversement, si votre modèle est entièrement construit à partir de connaissances externes à un ensemble de données particulier (par exemple, vous décidez au préalable de votre connaissance experte que les canaux de mesure 63 - 79 ne peuvent pas réellement aider à résoudre le problème, vous pouvez bien sûr les exclure. Construisez le modèle et validez-le. De même, si vous effectuez une régression PLS et décidez par votre expérience que 3 variables latentes constituent un choix raisonnable (mais ne jouez pas pour déterminer si 2 ou 5 lv donnent de meilleurs résultats), vous pouvez alors: continuez avec une validation normale hors-bootstrap / croisée.

cbéléites
la source
Malheureusement, le lien pour imprimer 5 du livre ElemStatLearn ne fonctionne pas. Je me demandais si l'illustration à laquelle vous faisiez référence est toujours sur la même page. S'il vous plaît mentionner la légende aussi.
rraadd88
Ainsi, si j’ai deux ensembles de données, la sélection / l’ingénierie des fonctionnalités sur l’un et le CV sur l’autre, il n’y aurait pas de problème?
Milos
1
@Milos: non, tant que ces fonctionnalités deviennent des paramètres fixes pour les modèles pour la validation croisée, cela devrait être OK. Il s'agirait d'une configuration d'hypothèses appropriée (= développement d'entités sur l'ensemble de données A) / de tests d'hypothèses (= mesure de la performance des entités désormais fixées avec l'ensemble de données B).
cbeleites
@cbeleites Oui, c'est ce que j'avais l'intention de faire. Déterminez les fonctionnalités sur A, puis corrigez-les et effectuez une validation croisée des modèles sur B. Merci. :)
Milos
@Milos: gardez toutefois à l'esprit que votre argumentation sur les performances obtenues est encore meilleure si vous entraînez complètement votre modèle sur A puis utilisez B uniquement à des fins de test.
cbeleites
5

Essayons de le rendre un peu intuitif. Prenons cet exemple: vous avez une variable dépendante binaire et deux prédicteurs binaires. Vous voulez un modèle avec un seul prédicteur. Les deux prédicteurs ont une chance, disons, à 95% d'être égale à la personne à charge et une chance de 5% de ne pas être d'accord avec la personne à charge.

Désormais, par hasard sur vos données, un prédicteur équivaut à la dépendance de l’ensemble des données dans 97% des cas et l’autre dans 93% des cas. Vous choisissez le prédicteur à 97% et construisez vos modèles. Dans chaque volet de la validation croisée, vous aurez le modèle dépendant du prédicteur, car il a presque toujours raison. Par conséquent, vous obtiendrez une performance prédite croisée de 97%.

Maintenant, vous pourriez dire, ok c'est juste de la malchance. Mais si les prédicteurs sont construits comme ci-dessus, alors vous avez une chance que 75% d’au moins un d’eux ait une précision> 95% sur l’ensemble des données et que vous choisissiez cette précision. Vous avez donc une chance de 75% de surestimer la performance.

En pratique, il n'est pas du tout trivial d'estimer l'effet. Il est tout à fait possible que votre sélection d’entités sélectionne les mêmes entités dans chaque pli que si vous l’aviez faite pour l’ensemble du jeu de données, sans biais. L'effet devient également plus petit si vous avez beaucoup plus d'échantillons mais de fonctionnalités. Il peut être instructif d’utiliser les deux méthodes avec vos données et de voir en quoi les résultats diffèrent.

Vous pouvez également mettre de côté une quantité de données (20%, par exemple), utiliser à la fois votre méthode et la méthode correcte pour obtenir des estimations de performances en effectuant une validation croisée sur la valeur de 80% et voir quelle prévision de performance s'avère plus précise lorsque vous transférez votre modèle à une autre. % des données mises de côté. Notez que, pour que cela fonctionne, votre sélection de fonctionnalités avant votre CV devra également être effectuée uniquement sur 80% des données. Sinon, cela ne simulera pas le transfert de votre modèle vers des données extérieures à votre échantillon.

Erik
la source
Pourriez-vous élaborer davantage sur la manière correcte de sélectionner les fonctionnalités avec votre exemple intuitif? Je vous remercie.
uared1776