Comment savoir quelle méthode de validation croisée est la meilleure?


36

J'essaie de déterminer quelle méthode de validation croisée convient le mieux à ma situation.

Les données suivantes ne sont qu'un exemple pour résoudre le problème (en R), mais mes Xdonnées réelles ( xmat) sont corrélées les unes avec les autres et à différents degrés avec la yvariable ( ymat). J'ai fourni le code R, mais ma question ne concerne pas R, mais plutôt les méthodes. Xmatinclut les variables X V1 à V100 et ymatinclut une seule variable y.

set.seed(1233)
xmat           <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
  # the real y data are correlated with xmat
ymat           <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")

Je voudrais construire un modèle de prédiction ybasé sur toutes les variables de xmat. Ce sera donc un modèle de régression linéaire y ~ V1 + V2 + V3+ ... + V100. Après examen, je peux voir les trois méthodes de validation croisée suivantes:

  1. Répartissez les données dans environ la moitié et utilisez-en une pour la formation et une autre moitié pour les tests (validation croisée):

    prop       <- 0.5 # proportion of subset data
    set.seed(1234)
      # training data set 
    training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0))
    xmat.train <- xmat[training.s,]
    ymat.train <- ymat[training.s,]
    
      # testing data set 
    testing.s <- setdiff(1:nrow(xmat), training)
    xmat.test <- xmat[testing.s,]
    ymat.test <- ymat[testing.s,]
  2. Validation croisée K-fold - avec validation croisée 10 fois:

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
  3. Masquage d'une valeur ou de quelques valeurs à la fois : Dans cette méthode, nous masquons de manière aléatoire une valeur dans un jeu de données (y) en la remplaçant par NA et en la prédisant. Le processus est répété n fois.

    n = 500 
    predicted.v <- rep(NA, n)
    real.v      <- rep(NA, n)
    
    for (i in 1:n){
      masked.id <- sample (1:nrow(xmat), 1)
      ymat1     <- ymat 
      real.v[i] <- ymat[masked.id,]
      ymat1[masked.id,] <- NA
      mydata            <- data.frame(ymat1, xmat)
      fit               <- lm(ymat1 ~ ., data=mydata)
      predicted.v[i]    <- fit$fitted.values[masked.id]
    }

Comment savoir ce qui convient le mieux à n'importe quelle situation? Y a-t-il d'autres méthodes? Bootstrap validationvs CV? Des exemples travaillés seraient appréciés.


Êtes-vous intéressé à vérifier la validité des données ou à vérifier les estimations ou les valeurs prédites des coefficients b.
Subhash C. Davar

Je suis intéressé par la vérification des estimations ou valeurs prédites des coefficients b
rdorlearn

Le problème que j'ai avec la méthode n ° 1 est que la taille de l'échantillon est beaucoup plus petite que celle que vous avez en réalité. Par conséquent, les bandes de confiance / variabilité estimées seront probablement beaucoup plus grandes. De plus, je suppose que la méthode n ° 2 et la méthode n ° 3 auront des performances similaires. Si j'étais vous, commencez par la validation croisée des plis pour K = 5,6, ..., 14,15 et voyez si vos résultats sont assez similaires.
Kian

De plus, avez-vous l’intention de faire une sélection de modèle pour réduire le nombre de covariables? 100 semble beaucoup.
Kian

@ user2432701 Non, je voudrais utiliser tous les 100.
rdorlearn

Réponses:


34

Étant donné que le PO a placé une prime sur cette question, elle devrait attirer l’attention. C’est donc le bon endroit pour discuter de certaines idées générales, même si cela ne répond pas directement au PO.

Prénoms:

a) La validation croisée est le nom général de toutes les techniques d'estimation / mesure qui utilisent un ensemble de test différent de celui du train. Synonyme: estimations hors échantillon ou extra-échantillon. Antonym: estimation dans l'échantillon.

L'estimation dans l'échantillon est une technique qui utilise certaines informations sur l'ensemble d'apprentissage pour estimer la qualité du modèle (pas nécessairement l'erreur). Ceci est très courant si le modèle comporte un biais élevé - c’est-à-dire qu’il repose sur de fortes hypothèses concernant les données. Dans les modèles linéaires (un modèle à biais élevé), comme dans l'exemple de la question, on utilise R-carré, AIC, BIC, déviance, comme mesure de la qualité du modèle - ce sont tous des estimateurs dans l'échantillon. Dans SVM, par exemple, les données de ratio dans le vecteur de support par rapport au nombre de données constituent une estimation d'erreur du modèle dans l'échantillon.

Il existe de nombreuses techniques de validation croisée:

b) hold-out est la méthode # 1 ci-dessus. Divisez le jeu en une formation et un test. Il y a une longue histoire de discussions et de pratiques sur la taille relative de l'ensemble de formation et de test.

c) k- fold - méthode n ° 2 ci-dessus. Assez standard.

d) Laissez-une-sortie - méthode n ° 3 ci-dessus.

e) bootstrap : si votre ensemble contient N données, sélectionnez au hasard N échantillons AVEC REMPLACEMENT dans le jeu et utilisez-le comme entraînement. Les données du jeu d'origine qui n'ont pas été échantillonnées à tout moment sont utilisées comme jeu de test. Il existe différentes manières de calculer l'estimation finale de l'erreur du modèle en utilisant à la fois l'erreur pour l'ensemble de test (hors échantillon) et l'erreur pour l'ensemble du train (dans l'échantillon). Voir par exemple le bootstrap .632. Je pense qu'il existe également une formule 0,632+ - ce sont des formules qui estiment l'erreur réelle du modèle en utilisant à la fois des erreurs hors échantillon et des erreurs intra-échantillon.

f) Le problème de la répétition est orthogonal au choix de la méthode ci-dessus. À l'exception de Leave-one-out, toutes les méthodes ci-dessus peuvent être répétées autant de fois que nécessaire. En fait, on peut parler de maintien REPEATED ou de k- fold REPEATED. Pour être juste, presque toujours la méthode bootstrap est utilisée de manière répétée.


La question suivante est de savoir quelle méthode est "meilleure". Le problème est ce que "mieux" signifie.

1) La première réponse est de savoir si chacune de ces méthodes est biaisée pour l'estimation de l'erreur de modèle (pour une quantité infinie de données futures).

2) La deuxième alternative est la rapidité ou la précision avec laquelle chacune de ces méthodes converge vers la véritable erreur de modèle (si elles ne sont pas biaisées). Je crois que c'est toujours un sujet de recherche. Permettez-moi de souligner ces deux documents (derrière le mur de paiement), mais le résumé nous donne une idée de ce qu’ils essaient d’accomplir. Notez également qu'il est très courant d'appeler k- fold comme "validation croisée" par lui-même.

Il existe probablement de nombreux autres articles sur ces sujets. Ce ne sont que quelques exemples.

3) Un autre aspect de "mieux" est le suivant: étant donné une mesure particulière de l'erreur de modèle en utilisant l'une des techniques ci-dessus, vous pouvez être certain que l'erreur de modèle correcte est proche.

En général, dans ce cas, vous souhaitez prendre plusieurs mesures de l'erreur et calculer un intervalle de confiance (ou un intervalle crédible si vous suivez une approche bayésienne). Dans ce cas, la question est de savoir dans quelle mesure pouvez-vous faire confiance à la variance de l'ensemble des mesures d'erreur. Notez que toutes les techniques ci-dessus, à l'exception de la règle d'exclusion, vous donneront de nombreuses mesures différentes ( k mesures pour un k- pli, n mesures pour un maintien n- répété) et vous pourrez ainsi mesurer la variance (ou l'écart type). ) de cet ensemble et calculer un intervalle de confiance pour la mesure de l'erreur.

Ici, les choses se compliquent un peu. D'après ce que j'ai compris dans le document. Aucun estimateur non biaisé de la variance de la validation croisée par k- fold (pas derrière paywall), on ne peut pas faire confiance à la variance obtenue d'un k- fold - on ne peut donc pas construire un bon intervalle de confiance à partir de k - plis. En outre de ce que je comprends du papier approximatif tests statistiques pour comparer les algorithmes d' apprentissage Classification supervisée (non derrière paywall), les techniques qui utilisent des mesures répétées (répétées kplusieurs fois, le maintien répété - pas sûr du bootstrap) va sous-estimer la variance réelle de la mesure d'erreur (il est assez facile de le voir - puisque vous échantillonnez à partir d'un ensemble fini si vous répétez la mesure avec un très grand nombre fois, les mêmes valeurs continueront à se répéter, ce qui maintiendra la moyenne, mais réduira la variance). Ainsi, les techniques de mesures répétées seront trop optimistes quant à l’intervalle de confiance.

Ce dernier article suggère de faire un 5 répétitions sur 2 - qu'il appelle 5 × 2 CV - comme un bon équilibre de nombreuses mesures (10) mais pas trop de répétitions.

MODIFIER:

Bien sûr, il existe d’excellentes réponses dans Cross Validated à certaines de ces questions (bien qu’elles ne soient parfois pas d’accord entre elles). Voilà quelque:

Validation croisée ou amorce pour évaluer les performances de la classification?

Différences entre validation croisée et amorçage pour estimer l'erreur de prédiction

Validation croisée ou amorce pour évaluer les performances de la classification?

Comprendre l'amorçage pour la validation et la sélection du modèle

En général, le tag est votre ami ici.


Alors quelle est la meilleure solution? Je ne sais pas. J'utilise 5 × 2 CV lorsque j'ai besoin d'être très rigoureux, quand je dois être sûr qu'une technique est meilleure qu'une autre, en particulier dans les publications. Et j'utilise un hold-up si je ne prévois pas de mesurer la variance ou l'écart-type, ou si j'ai des contraintes de temps - il n'y a qu'un seul modèle d'apprentissage dans un hold-out .


En ce qui concerne les propriétés de variance compliquées de la validation croisée, je pense qu’il faut être prudent quant à la variance à mesurer. IIRC, Bengio et al. concentrez-vous sur la variance pour un ensemble de données de taille n pour le problème à résoudre. Ce qui est différent (et plus grand) de l'incertitude aléatoire pour les prédictions d'un modèle formé sur l' ensemble de données que j'ai sous la main. Voir également la taxonomie du problème dans l'article de Dietterich lié ci-dessus.
cbeleites soutient Monica le

7

S'il vous plaît se référer à la page wikipedia pour les définitions de méthodes (elles font un travail bien meilleur que ce que je pourrais faire ici).

Une fois que vous avez consulté cette page, les informations suivantes peuvent vous aider. Permettez-moi de me concentrer sur la partie de la question où l'on veut choisir l'une de ces méthodes pour leur processus de modélisation. Comme il s’agit d’un choix assez fréquent et qu’ils pourraient bénéficier de connaissances supplémentaires, voici ma réponse pour deux situations:

  1. Toute situation : utilisez k-fold cross validationavec un nombre de répétitions approprié (disons 5 ou 10).

    • Fractionner les données en une moitié, s'entraîner sur la première moitié et valider sur l'autre est une étape dans la validation croisée en deux temps (l'autre étape consiste à répéter le même exercice, les deux moitiés étant interchangées). Par conséquent, excluez la stratégie consistant à "scinder les données en deux".

    • De nombreux documents d’apprentissage automatique et d’exploration de données utilisent la validation croisée au pli k (ne pas citer), utilisez-la, sauf si vous devez faire très attention à cette étape.

    • Maintenant, laissez une méthode de sortie et d'autres méthodes telles que « laisser de côté » et « scinder au hasard et répéter » (essentiellement du type bootstrap similaire au processus décrit ci-dessus) sont définitivement de bons candidats.

    • Si la taille de vos données est N, la validation croisée N-fold est essentiellement la même que celle laissée en retrait.

    • 'leave p out' et 'bootstrap' sont un peu plus différents que la validation croisée k fois, mais la différence réside essentiellement dans la définition des plis et le nombre de répétitions 'k' qui se produisent.

    • Comme le dit la page du wiki, les pliages k et ' laisser p out ' sont des estimateurs décents de la ' performance / ajustement attendu ' (bien que les paris soient décalés en ce qui concerne la variance de ces estimateurs).

  2. Votre situation: votre taille d'échantillon est seulement de 200 par rapport au nombre de fonctionnalités (100). Je pense qu'il est très probable qu'il existe plusieurs modèles linéaires offrant les mêmes performances. Je suggérerais d'utiliser la validation croisée avec pli k avec plus de 10 répétitions . Choisissez une valeur de 3 ou 5.

    • Raison de la valeur k: choix générique.

    • Raison de la valeur de répétition: Une valeur de répétition très élevée est probablement critique dans ce cas-ci, car le résultat d’un calcul de validation croisée à plis multiples peut être suffisant pour plier la variabilité / le caractère aléatoire de scission que nous introduisons.

Pensées supplémentaires:

  • J'aurais peut-être aussi recours à des méthodes de type « abandon de sortie » et « bootstrap » (en plus de la validation croisée du k-fold) pour la même mesure de performance / ajustement afin de vérifier si les résultats de ma méthode de validation croisée du k-fold semblaient corrects.

  • Bien que vous souhaitiez utiliser les 100 fonctionnalités, comme quelqu'un l'a suggéré, faites attention à la multicolinéarité / corrélation et réduisez éventuellement le nombre de fonctionnalités.


Consultez aussi cette réponse: stats.stackexchange.com/questions/69291/…
Theja

Je voudrais passer à travers beaucoup de cela et aller directement au bootstrap d'optimisme Efron-Gong tel qu'implémenté dans le rmspackage validateet les calibratefonctions R.
Frank Harrell
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.