Genaue Definition des Abweichungsmaßes im glmnet-Paket mit Kreuzvalidierung?

11

Für meine aktuelle Forschung verwende ich die Lasso-Methode über das glmnet-Paket in R für eine binomialabhängige Variable.

In glmnet wird das optimale Lambda durch Kreuzvalidierung ermittelt und die resultierenden Modelle können mit verschiedenen Maßnahmen verglichen werden, z. B. Fehlklassifizierungen oder Abweichungen.

Meine Frage: Wie genau ist Abweichung in glmnet definiert? Wie wird es berechnet?

(In der entsprechenden Veröffentlichung "Regularisierungspfade für verallgemeinerte lineare Modelle über Koordinatenabstieg" von Friedman et al. Findet ich nur diesen Kommentar zu der in cv.glmnet verwendeten Abweichung: "mittlere Abweichung (minus die doppelte logarithmische Wahrscheinlichkeit für die Auslassung) Daten) "(S. 17)).

Jo Wmann
quelle
Es ist das gleiche wie die Abweichung, die in verwendet wird glm(oder sollte es zumindest sein - es gibt nur eine Definition von Abweichung, die mir bekannt ist).
Hong Ooi
Ja, aber ich denke, sie erweitern es in gewisser Weise, wie aus dem Zitat in meinem ersten Beitrag hervorgeht. Abweichungen können meines Wissens die Leistung zweier Modelle vergleichen, aber wie beziehen die Autoren dann die ausgelassenen Daten der Kreuzvalidierung ein? Wie macht das "minus doppelte Log-Wahrscheinlichkeit für die ausgelassenen Daten" Sinn?
Jo Wmann
1
Okay, danke, jetzt denke ich, dass ich es verstanden habe: Die Abweichung ist definiert als -2 * Log-Wahrscheinlichkeit oder besser (2 * Log-Wahrscheinlichkeit) / (Log-Wahrscheinlichkeit des Null-Modells). Dies erklärt auch, warum ihr Abweichungsmaß für die verschiedenen Lambda-Werte das Intervall 0,2 nicht überschreitet. Das Modell wird auf die k-1-Falten der Kreuzvalidierung geschätzt und auf die verbleibende Falte angewendet. Für die Anwendung auf der verbleibenden Falte wird der Log-Likelihood-Score berechnet. Dies wird k-mal wiederholt und der Mittelwert der k-Ergebnisse für jedes Lambda des oben definierten Abweichungsmaßes wird zurückgegeben.
Jo Wmann
1
Ja, es wird immer über alle Falten für jedes Lambda gemittelt. Ich denke, Sie können entweder die Abweichung direkt oder das Verhältnis wrt zu null Modell verwenden, das wahrscheinlich das Intercept-Only-Modell ist. Es gibt zwei Fallstricke: a) Falten haben möglicherweise nicht genau die gleiche Anzahl von Datenpunkten. B) Jede Falte enthält (natürlich) unterschiedliche Daten. Um (a) zu beheben, können Sie die Abweichung einfach durch die Anzahl der Datenpunkte in der ausgewählten Falte teilen. Um (a) und (b) gleichzeitig zu fixieren, verwenden Sie den Verhältnisansatz. Das Abweichungsmodell geht davon aus, dass der Datensatz in jedem Modell gleich ist (dieselbe Idee in der MAP-Schätzung, bei der der Nenner ignoriert wird).
Cagdas Ozgenc
1
Sobald jedoch Falten ins Bild kommen, ist der Nenner über die Falten hinweg nicht mehr derselbe. Das Verhältnis kümmert sich darum, indem es die Nenner aufhebt. Aber ich weiß nicht, wie groß das Problem ist, wenn man über Falten mittelt.
Cagdas Ozgenc

Antworten:

8

In Friedman, Hastie und Tibshirani (2010) wird die Abweichung eines Binomialmodells zum Zwecke der Kreuzvalidierung berechnet als

minus die doppelte Log-Wahrscheinlichkeit für die ausgelassenen Daten (S. 17)

Angesichts der Tatsache, dass dies das in der Dokumentation fürglmnet (auf S. 2 und 5) zitierte Papier ist, ist dies wahrscheinlich die im Paket verwendete Formel.

Tatsächlich werden im Quellcode für die Funktion cvlognetdie Abweichungsreste für die Antwort wie folgt berechnet

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

wo predmatist einfach

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

und von der Einkapselungsfunktion übergeben cv.glmnet. Ich habe den auf der JStatSoft-Seite verfügbaren Quellcode für das Papier verwendet und weiß nicht, wie aktuell dieser Code ist. Der Code für dieses Paket ist überraschend einfach und lesbar. Sie können jederzeit selbst überprüfen, indem Sie tippen glmnet:::cv.glmnet.

Shadowtalker
quelle
1

Zusätzlich zu der Antwort von @shadowtalker, als ich das Paket glmnet verwendete, habe ich das Gefühl, dass die Abweichung in der Kreuzvalidierung irgendwie normalisiert ist.

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

Ref: Abweichung R Dokument

denn wenn ich die Teilung mache,

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

Das Ergebnis ist

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

Das ist sehr nah an der Passform $ cvm.

Dies könnte der Kommentar von @Hong Ooi zu dieser Frage sein:

/programming/43468665/poisson-deviance-glmnet

vtshen
quelle