Come eseguire la convalida incrociata con cv.glmnet (regressione LASSO in R)?


10

Mi chiedo come affrontare l'addestramento corretto e testare un modello LASSO usando glmnet in R?

  • In particolare, mi chiedo come farlo se la mancanza di un set di dati di test esterno richiede l'uso della convalida incrociata (o altro approccio simile) per testare il mio modello LASSO.

Vorrei analizzare il mio scenario:

Ho solo un set di dati per informare e addestrare il mio modello glmnet. Di conseguenza, dovrò utilizzare la convalida incrociata per suddividere i miei dati per generare anche un modo per testare il mio modello.

Sto già usando cv.glmnet, che secondo i dettagli del pacchetto :

Convalida incrociata k-fold per glmnet, produce un grafico e restituisce un valore per lambda.

  • La convalida incrociata viene eseguita cv.glmnetsemplicemente per scegliere la migliore lambda o serve anche come una procedura di convalida incrociata più generale?

    • In altre parole, devo ancora eseguire un altro passaggio di convalida incrociata per "testare" il mio modello?

Sto lavorando con il presupposto che "sì, lo faccio".

Stando così le cose, come posso avvicinarmi alla convalida incrociata del mio cv.glmnetmodello?

  • Devo farlo manualmente o forse la caretfunzione è utile per i modelli glmnet?

  • Devo usare due "loop" concentrici di validazione incrociata? ... Uso un "loop interno" di CV via cv.glmnetper determinare il miglior valore lambda all'interno di ciascuna delle k pieghe di un "loop esterno" dell'elaborazione della validazione incrociata di k-fold ?

    • Se eseguo la convalida incrociata del mio cv.glmnetmodello di convalida incrociata , come posso isolare il modello "migliore" (dal valore "lambda" migliore) da ciascun cv.glmnetmodello all'interno di ogni piega del mio "anello esterno" di convalida incrociata altrimenti?

      • Nota: sto definendo il modello "migliore" come il modello associato a un lambda che produce un MSE entro 1 SE del minimo ... questo è il $lambda.1senel cv.glmnetmodello.

Contesto:

Sto cercando di prevedere l'età dell'albero ("età") in base al diametro dell'albero ("D"), D ^ 2 e specie ("fattore (SPEC)"). [equazione risultante: Age ~ D + factor(SPEC) + D^2]. Ho ~ 50K righe di dati, ma i dati sono longitudinali (tiene traccia degli individui nel tempo) e sono composti da ~ 65 specie.


1
Per coloro che hanno votato per chiudere senza commentare: non è utile ... fammi sapere qual è il tuo problema nei commenti e proverò a risolverlo.
theforestecologist

1
Non stanno votando per chiudere, stanno votando per migrare su CrossValidated. Ho appena aggiunto il mio voto a quello.
Hack-R

@theforestecologist: dovresti essere in grado di vedere i motivi per cui è stata citata la chiusura / migrazione facendo clic sul pulsante 'chiudi'.
DWin

Grazie per avermelo chiesto, avevo esattamente questa domanda. E non posso usare il cursore perché ho Y multivariato. Ma hai ispezionato il codice sorgente e confermato che non è necessario un CV aggiuntivo? Il codice sorgente può essere piuttosto difficile da seguire.
qoheleth

Risposte:


3

La convalida incrociata viene eseguita in cv.glmnet semplicemente per scegliere la migliore lambda o serve anche come una procedura di convalida incrociata più generale?

Fa quasi tutto il necessario in una validazione incrociata. Ad esempio, adatta i possibili lambdavalori ai dati, sceglie il modello migliore e infine allena il modello con i parametri appropriati.

Ad esempio, nell'oggetto restituito ::

cvmè l'errore di convalida incrociata medio. cvsdè la deviazione standard stimata.

Come altri valori restituiti, questi vengono calcolati sul set di test. Infine, il

glmnet.fit fornisce il modello addestrato su tutti i dati (training + test) con i migliori parametri.

Devo farlo manualmente o forse la funzione di cursore è utile per i modelli glmnet?

Non è necessario farlo manualmente. 'Caret' sarebbe molto utile, ed è uno dei miei pacchetti preferiti perché funziona con tutti gli altri modelli con la stessa sintassi. Io stesso uso spesso caretanziché cv.glmnet. Tuttavia, nel tuo scenario è essenzialmente lo stesso.

Uso due "loop" concentrici di validazione incrociata? ... Uso un "loop interno" di CV tramite cv.glmnet per determinare il miglior valore lambda all'interno di ciascuna delle k pieghe di un "loop esterno" di k-fold elaborazione di convalida incrociata?

È possibile farlo e questo concetto è molto simile all'idea di convalida incrociata nidificata Convalida incrociata nidificata per la selezione del modello .

Se eseguo la convalida incrociata del mio modello cv.glmnet già convalidato in modo incrociato, come posso isolare il modello "migliore" (dal valore "lambda" migliore) da ciascun modello cv.glmnet all'interno di ogni piega del mio ciclo esterno altrimenti " "di validazione incrociata?

Basta eseguire un ciclo in cui si generano i dati di allenamento e i dati di test vengono eseguiti cv.glmnetsui dati di allenamento e si utilizza il modello glmnet.fitper prevedere i dati di test.


@discupulus: grazie. Potresti fornire una sorta di prova per questo? (cioè, percorrimi per favore). Inoltre, data la tua risposta, ciò significa che non sono necessari ulteriori processi di convalida incrociata per segnalare una metrica delle prestazioni per i dati? (Potrei semplicemente segnalare l'MSE del caso lambda.1se come prestazione del mio modello finale?)
theforestecologist

Sì, non sono necessarie ulteriori convalide incrociate. Per l'evidenza, puoi guardare il codice sorgente della cv.glmnetfunzione come Ropensource. Digita semplicemente la cv.glmnetconsole.
discipulus

3
@discipulus. Ho inviato un'email a Trevor Hastie chiedendo "cv.glmnet (implementazione R) fa solo CV per scegliere lambda? Oppure fa anche un CV esterno per convalidare la lambda scelta? In altre parole, dobbiamo codificare il nostro CV esterno se noi vuoi convalidare la lambda scelta? " e lui rispose (piuttosto rapidamente) "Sì, solo per scegliere lambda", che interpreto nel senso che fa solo il CV interno, e dovremo codificare il nostro CV esterno.
qoheleth,

@theforestecologist Sto cercando di saperne di più sulla validazione incrociata e di trovare il tuo post educativo. Non capisco cosa intendi per cv.glmnet anche come procedura di convalida incrociata più generale. Pensavo che l'unico parametro disponibile da scegliere fosse lambda: quale strato esterno di validazione incrociata esiste? Ti sarei grato se potessi rispondere. Grazie!
user2450223
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.