Croce convalida regressione lazo in R


10

La funzione R cv.glm (libreria: avvio) calcola l'errore di stima della convalida incrociata K stimato per i modelli lineari generalizzati e restituisce delta. Ha senso usare questa funzione per una regressione del lazo (libreria: glmnet) e, in tal caso, come può essere eseguita? La libreria glmnet usa una validazione incrociata per ottenere il miglior parametro di tornitura, ma non ho trovato alcun esempio che convalida incrociata l'equazione glmnet finale.


2
Ha certamente senso, e sebbene LASSO ottimizzi solo su un (iper-) parametro, se vuoi ottenere la migliore stima possibile delle prestazioni fuori campione, hai bisogno di un ciclo esterno di validazione incrociata. Vedi Puoi allenarti troppo allenando gli algoritmi di machine learning usando CV / Bootstrap? e le carte citate.
Scortchi - Ripristina Monica

Si consiglia di utilizzare glmnet anziché glm esp. se stai facendo CV. Se ricordo, il pacchetto glm diventa doloroso da usare. Inoltre, cv.glmnet espone più parametri di cv.glm.
smci,

Risposte:


9

Un esempio su come fare plain vanilla convalida incrociata per lazo in glmnetsu mtcars set di dati.

  1. Carica set di dati.

  2. Preparare funzionalità (variabili indipendenti). Dovrebbero essere di matrixclasse. Il modo più semplice per convertire dfin variabili contenenti categoriali matrixè tramite model.matrix. Intendiamoci, per impostazione predefinita si glmnetadatta l'intercettazione, quindi è meglio rimuovere l'intercettazione dalla matrice del modello.

  3. Preparare la risposta (variabile dipendente). Codifichiamo le auto con una media superiore alla media mpg('1') e le altre inefficienti ('0'). Converti questa variabile in fattore.

  4. Eseguire la convalida incrociata tramite cv.glmnet. Raccoglierà alpha=1dai glmnetparametri predefiniti , che è quello che hai chiesto: regressione del lazo.

  5. Esaminando l'output della convalida incrociata potresti essere interessato ad almeno 2 informazioni:

    • lambda, che minimizza l'errore con convalida incrociata. glmnetin realtà fornisce 2 lambda: lambda.mine lambda.1se. È il tuo giudizio come statistico praticante che usare.

    • coefficienti regolarizzati risultanti.

Si prega di consultare il codice R per le istruzioni precedenti:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Commenti finali:

  • nota, l'output del modello non dice nulla sulla significatività statistica dei coefficienti, solo i valori.

  • l1 penalizer (lasso), che hai chiesto, è noto per l'instabilità, come evidenziato in questo post del blog e in questa domanda di scambio di stack . Un modo migliore potrebbe essere anche la convalida incrociata alpha, che ti permetterebbe di decidere il giusto mix di penalizzatori l1 e l2.

  • un modo alternativo per eseguire la convalida incrociata potrebbe essere quello di passare al punto di inserimento train( ... method='glmnet')

  • e infine, il modo migliore per saperne di più cv.glmnete le sue impostazioni predefinite proviene glmnetovviamente ?glmnetdalla console di R)))


Bella risposta. .. vale anche la pena eseguire il CV più volte e calcolare la media della curva di errore (vedere? cv.glmnet) per tenere conto del campionamento.
user20650

@SergeyBushmanov MOLTO UTILE!
forestecologo il

Ciao, so che questo è un vecchio post, ma volevo farti una domanda. Lei afferma che l'output del modello non dice nulla sulla significatività statistica dei coefficienti, quindi come si determina se sono significativi o no?
Jun Jang,

@JunJang "Non esiste un significato statistico per i coefficienti" è la dichiarazione degli autori del pacchetto, non io. Questa affermazione è data, non ricordo esattamente, né in uno dei libri degli autori del pacchetto né nella vignetta del pacchetto. In tal caso, invece di dire coefficienti significativi o meno, preferiresti dire che sono "utili" o meno nello spiegare l'obiettivo attraverso la validazione incrociata.
Sergey Bushmanov,
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.