Definizione esatta della misura di Devianza nel pacchetto glmnet, con crossvalidation?


12

Per la mia ricerca attuale sto usando il metodo Lazo tramite il pacchetto glmnet in R su una variabile binomiale dipendente.

In glmnet la lambda ottimale si trova attraverso la validazione incrociata e i modelli risultanti possono essere confrontati con varie misure, ad esempio errori di classificazione errata o devianza.

La mia domanda: come si definisce esattamente la devianza in glmnet? Come viene calcolato?

(Nel documento corrispondente "Percorsi di regolarizzazione per modelli lineari generalizzati tramite discesa coordinata" di Friedman et al. Trovo solo questo commento sulla devianza usata in cv.glmnet: "media devianza (meno il doppio della probabilità di log a sinistra-fuori dati) "(p. 17)).


È lo stesso della devianza usata in glm(o almeno, dovrebbe essere - c'è solo una definizione di devianza di cui sono a conoscenza).
Hong Ooi,

Sì, ma penso che lo estendano in qualche modo come indicato dalla citazione nel mio primo post. La devianza, a quanto ho capito, può confrontare le prestazioni di due modelli, ma come possono gli autori includere i dati lasciati fuori dalla validazione incrociata? Che senso ha "meno il doppio della probabilità di log sui dati di sinistra"?
Jo Wmann,

1
Va bene, grazie, ora penso di averlo capito: la devianza è definita come -2 * log-verikelihood o piuttosto (2 * log-verikelihood) / (log-verksity of the null-model). Questo spiega anche perché la loro misura di deviazione per i diversi valori di lambda non superi l'intervallo 0,2. Il modello viene stimato sulle pieghe k-1 della convalida incrociata e applicato alla piega rimanente. Per l'applicazione sulla piega rimanente viene calcolato il punteggio di verosimiglianza. Questo viene ripetuto k volte e viene restituita la media dei risultati k per ogni lambda della misura di devianza definita sopra.
Jo Wmann,

1
Sì, viene sempre calcolata la media su tutte le pieghe per ogni lambda. Penso che tu possa usare direttamente la devianza o il rapporto tra il modello nullo e quello, probabilmente è l'unico modello di intercettazione. Esistono due insidie: a) le pieghe potrebbero non avere lo stesso numero esatto di punti dati b) ogni piega contiene dati diversi (naturalmente). per correggere (a) puoi semplicemente dividere la devianza per il numero di punti dati nella piega selezionata. per correggere (a) e (b) contemporaneamente utilizzare l'approccio del rapporto. il modello di devianza presuppone che il set di dati sia lo stesso in ciascun modello (la stessa idea nella stima MAP in cui ignorano il denominatore).
Cagdas Ozgenc,

1
Tuttavia, una volta che le pieghe entrano in scena, il denominatore non è più lo stesso nelle pieghe. Quindi il rapporto se ne occupa eliminando i denominatori. Ma non so quanto sia grave questo problema quando si supera la media delle pieghe.
Cagdas Ozgenc,

Risposte:


9

In Friedman, Hastie e Tibshirani (2010) , la devianza di un modello binomiale, ai fini della convalida incrociata, viene calcolata come

meno il doppio della probabilità di log sui dati lasciati fuori (p. 17)

Dato che questo è il documento citato nella documentazione perglmnet (a p. 2 e 5), questa è probabilmente la formula usata nella confezione.

E in effetti, nel codice sorgente per funzione cvlognet, vengono calcolati i residui di deviazione per la risposta

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

dov'è predmatsemplicemente

predict(glmnet.object,x,lambda=lambda)

e passato dalla cv.glmnetfunzione di codifica . Ho usato il codice sorgente disponibile sulla pagina JStatSoft per il documento e non so quanto sia aggiornato quel codice. Il codice per questo pacchetto è sorprendentemente semplice e leggibile; puoi sempre verificare tu stesso digitando glmnet:::cv.glmnet.


1

Oltre alla risposta di @shadowtalker, quando stavo usando il pacchetto glmnet, sento che la devianza nella convalida incrociata è in qualche modo normalizzata.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Rif: documento devianza R.

perché se faccio la divisione,

head(deviance(fit$glmnet.fit)) / length(y))

il risultato è

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

che è molto vicino alla misura $ cvm.

Questo potrebbe essere quello che ha detto il commento di @Hong Ooi su questa domanda:

/programming/43468665/poisson-deviance-glmnet

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.