Come faccio a sapere quale metodo di convalida incrociata è il migliore?


36

Sto cercando di capire quale metodo di convalida incrociata è il migliore per la mia situazione.

I seguenti dati sono solo un esempio di come risolvere il problema (in R), ma i miei Xdati reali ( xmat) sono correlati tra loro e correlati a diversi gradi con la yvariabile ( ymat). Ho fornito il codice R, ma la mia domanda non riguarda R ma piuttosto i metodi. Xmatinclude le variabili X da V1 a V100 mentre ymatinclude una singola variabile 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="")

Vorrei costruire un modello per la previsione ybasato su tutte le variabili in xmat. Quindi sarà un modello di regressione lineare y ~ V1 + V2 + V3+ ... + V100. Da una recensione, posso vedere i seguenti tre metodi di convalida incrociata:

  1. Dividi i dati in circa la metà e usane uno per l'allenamento e un'altra metà per i test (cross validation):

    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. Convalida incrociata di K-fold - usando la validazione incrociata di 10 volte:

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
    
  3. Mascherare uno o più valori alla volta : in questo metodo mascheriamo casualmente un valore nel set di dati (y) sostituendolo con NA e prevederlo. Il processo si ripete n volte.

    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]
    }

Come faccio a sapere qual è il migliore per ogni situazione? Ci sono altri metodi? Bootstrap validationvs CV? Gli esempi lavorati sarebbero apprezzati.


Sei interessato a verificare la validità dei dati o a verificare le stime o i valori previsti dei coefficienti b.
Subhash C. Davar,

Sono interessato a verificare le stime o i valori previsti dei coefficienti b
rdorlearn,

Il problema che ho con il metodo n. 1 è che la dimensione del campione è molto più piccola di quella che hai nella realtà. Pertanto, le fasce di confidenza / variabilità stimate sono probabilmente molto più grandi. Inoltre, immagino che il metodo n. 2 e il metodo n. 3 saranno simili nelle prestazioni. Se fossi in te, inizia con K-fold cross validation per K = 5,6, ..., 14,15 e vedi solo se i tuoi risultati sono abbastanza simili.
Kian,

Inoltre, hai intenzione di fare la selezione del modello per ridurre il numero di covariate? 100 sembra abbastanza.
Kian,

@ user2432701 No, vorrei usare tutti e 100.
rdorlearn,

Risposte:


34

Poiché l'OP ha posto una taglia su questa domanda, dovrebbe attirare una certa attenzione, e quindi è il posto giusto per discutere alcune idee generali, anche se non risponde direttamente all'OP.

Primo nome:

a) la convalida incrociata è il nome generale per tutte le tecniche di stima / misura che utilizzano un set di prova diverso dal set di treni. Sinonimo: stime fuori campione o extra campione. Antonym: stima in campione.

La stima nel campione sono tecniche che utilizzano alcune informazioni sul set di addestramento per stimare la qualità del modello (non necessariamente errore). Questo è molto comune se il modello ha un alto pregiudizio, cioè fa grandi ipotesi sui dati. Nei modelli lineari (un modello di bias elevato), come nell'esempio della domanda, si usa R-quadrato, AIC, BIC, devianza, come misura della qualità del modello - tutti questi sono stimatori nel campione. In SVM, ad esempio, i dati del rapporto nel vettore di supporto rispetto al numero di dati sono una stima nel campione di errore del modello.

Esistono molte tecniche di convalida incrociata:

b) l' aggancio è il metodo n. 1 sopra. Dividi il set in un allenamento e un test. C'è una lunga storia di discussioni e pratiche sulle dimensioni relative del set di addestramento e test.

c) k -fold - metodo n. 2 sopra. Piuttosto standard.

d) Leave-one-out - metodo n. 3 sopra.

e) bootstrap : se il tuo set ha N dati, seleziona casualmente N campioni CON SOSTITUZIONE dal set e usalo come allenamento. I dati del set originale che non sono stati sottoposti a campionamento in qualsiasi momento vengono utilizzati come set di test. Esistono diversi modi per calcolare la stima finale dell'errore del modello che utilizza sia l'errore per il set di test (fuori campione) sia l'errore per il set di treni (in campione). Vedere ad esempio il bootstrap .632. Penso che esista anche una formula .632+: sono formule che stimano il vero errore del modello utilizzando sia errori fuori campione che all'interno del campione.

f) Ortogonale alla selezione del metodo sopra è la questione della ripetizione. Ad eccezione del congedo, tutti i metodi sopra possono essere ripetuti un numero qualsiasi di volte. In effetti, si può parlare di hold-out REPEATED , o REPEATED k -fold. Per essere onesti, quasi sempre il metodo bootstrap viene utilizzato in modo ripetuto.


La domanda successiva è: quale metodo è "migliore". Il problema è che cosa significa "migliore".

1) La prima risposta è se ciascuno di questi metodi è distorto per la stima dell'errore del modello (per una quantità infinita di dati futuri).

2) La seconda alternativa è quanto velocemente o quanto bene ciascuno di questi metodi converge al vero errore del modello (se non sono distorti). Credo che questo sia ancora un argomento di ricerca. Permettetemi di indicare questi due documenti (dietro la parete di pagamento) ma l'abstract ci dà una comprensione di ciò che stanno cercando di realizzare. Si noti inoltre che è molto comune chiamare k -fold come "convalida incrociata" da solo.

Probabilmente ci sono molti altri articoli su questi argomenti. Questi sono solo alcuni esempi.

3) Un altro aspetto di "migliore" è: data una particolare misura dell'errore del modello usando una delle tecniche sopra, come si può essere certi che l'errore del modello corretto sia vicino.

In generale, in questo caso si desidera prendere molte misure dell'errore e calcolare un intervallo di confidenza (o un intervallo credibile se si segue un approccio bayesiano). In questo caso, il problema è quanto ci si può fidare della varianza del set di misure di errore. Nota che, tranne per il congedo unico, tutte le tecniche sopra ti daranno molte misure diverse ( k misure per una piega k , n misure per una tenuta n ripetuta) e quindi puoi misurare la varianza (o deviazione standard ) di questo set e calcola un intervallo di confidenza per la misura dell'errore.

Qui le cose si complicano. Da quello che ho capito dal documento Nessuno stimatore imparziale della varianza della convalida incrociata di k -fold (non dietro paywall), non ci si può fidare della varianza che si ottiene da una k -fold - quindi non si può costruire un buon intervallo di confidenza da k - pieghe. Anche da quello che ho capito dall'articolo Test statistici approssimativi per il confronto tra algoritmi di apprendimento di classificazione supervisionata (non dietro paywall), tecniche che utilizzano misure ripetute (ripetute k-fold, ripetuto hold-out - non sono sicuro di bootstrap) sottostimerà la vera varianza della misura dell'errore (è abbastanza facile vederlo - poiché stai campionando da un set finito se ripeti la misura un numero molto grande di volte, gli stessi valori continueranno a ripetersi, il che mantiene la media uguale, ma riduce la varianza). Pertanto, le tecniche di misurazione ripetute saranno troppo ottimistiche sull'intervallo di confidenza.

Quest'ultimo articolo suggerisce di fare un 5 volte ripetuto - che chiama 5 × 2 CV - come un buon equilibrio tra molte misure (10) ma non troppe ripetizioni.

MODIFICARE:

Naturalmente ci sono grandi risposte in Cross Validated ad alcune di queste domande (anche se a volte non sono d'accordo tra loro). Qui ce ne sono alcuni:

Convalida incrociata o bootstrap per valutare le prestazioni di classificazione?

Differenze tra validazione incrociata e bootstrap per stimare l'errore di previsione

Convalida incrociata o bootstrap per valutare le prestazioni di classificazione?

Comprensione del bootstrap per la validazione e la selezione del modello

In generale, il tag è il tuo amico qui.


Quindi qual è la soluzione migliore? Non lo so. Ho usato CV 5 × 2 quando devo essere molto rigoroso, quando devo essere sicuro che una tecnica sia migliore di un'altra, specialmente nelle pubblicazioni. E utilizzo un controllo se non ho intenzione di misurare la varianza o la deviazione standard o se ho vincoli di tempo: esiste un solo modello di apprendimento in un controllo .


Per quanto riguarda le complicate proprietà di varianza della convalida incrociata, penso che bisogna fare attenzione a quale varianza deve essere misurata. IIRC, Bengio et al. concentrarsi sulla varianza per un set di dati di dimensione n per il problema attuale. Che è diverso (e più grandi) da incertezza casuale per le previsioni di un modello addestrato sui set di dati che ho a portata di mano. Vedi anche la tassonomia dei problemi nel documento Dietterich collegato sopra.
cbeleites supporta Monica il

7

Si prega di fare riferimento alla pagina di Wikipedia per le definizioni dei metodi (fanno un lavoro di gran lunga migliore di quello che potrei fare qui).

Dopo aver dato un'occhiata a quella pagina, potrebbe essere utile quanto segue. Consentitemi di concentrarmi sulla parte della domanda in cui si desidera scegliere uno di questi metodi per il loro processo di modellazione. Dal momento che questa è una scelta piuttosto frequente che si fa e che potrebbero beneficiare di ulteriori conoscenze, ecco la mia risposta per due situazioni:

  1. Qualsiasi situazione : utilizzare k-fold cross validationcon un numero adeguato di ripetizioni (diciamo 5 o 10).

    • Dividere i dati in 1 metà, allenarsi sulla prima metà e convalidare sull'altra è comunque un passo nella validazione incrociata doppia (l'altra fase è ripetere lo stesso esercizio con le due metà scambiate). Quindi, esclude la strategia di "suddivisione dei dati a metà".

    • Molti documenti di machine learning e data mining usano la validazione incrociata di k-fold (non hanno citazione), quindi usala a meno che tu non debba essere molto attento in questo passaggio.

    • Ora, lascia un metodo fuori e altri metodi come ' lasciare p fuori ' e ' dividere e ripetere casualmente ' (essenzialmente bootstrap come il processo descritto sopra) sono sicuramente contendenti buoni.

    • Se la dimensione dei tuoi dati è N, la convalida incrociata N-fold è essenzialmente la stessa di quella lasciata fuori.

    • 'leave p out' e 'bootstrap' sono un po 'più diversi dalla convalida incrociata di k fold, ma la differenza sta essenzialmente nel modo in cui le pieghe sono definite e il numero di ripetizioni' k 'che si verificano.

    • Come dice la pagina della wiki, sia k-fold che ' leave p out ' sono stimatori decenti di " performance / fit attesi " (anche se le scommesse sono spente per quanto riguarda la varianza di questi stimatori).

  2. La tua situazione: hai solo una dimensione del campione di 200 rispetto al numero di funzioni (100). Penso che ci sia una probabilità molto alta che ci siano più modelli lineari che offrono le stesse prestazioni. Suggerirei di usare la validazione incrociata di k-fold con> 10 ripetizioni . Scegli un valore di 3 o 5.

    • Motivo del valore k: scelta generica.

    • Motivo del valore di ripetizione: un valore decentemente elevato per la ripetizione è probabilmente fondamentale in questo caso perché l'output di un singolo calcolo di convalida incrociata di k-fold può essere suscettibile di piegare la variabilità / casualità di divisione che introduciamo.

Pensieri aggiuntivi:

  • Forse dovrei anche usare i metodi ' lasciare p out ' e ' bootstrap come la divisione casuale ripetuta ' (oltre alla convalida incrociata di k-fold) per la stessa misura di performance / adattamento per verificare se gli output del mio metodo di validazione incrociata di k-fold sembrano a posto.

  • Sebbene desideri utilizzare tutte le 100 funzionalità, come suggerito da qualcuno, presta attenzione alla multicollinearità / correlazione e forse riduci il numero di funzionalità.



Vorrei tagliare molto di tutto questo e andare direttamente al bootstrap di ottimismo Efron-Gong come implementato nel rmspacchetto R validatee nelle calibratefunzioni.
Frank Harrell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.