Wie kann man Lasso interpretieren, das alle Koeffizienten auf 0 verkleinert?


8

Ich habe einen Datensatz mit 338 Prädiktoren und 570 Instanzen (kann leider nicht hochgeladen werden), auf denen ich das Lasso verwende, um die Funktionsauswahl durchzuführen. Insbesondere verwende ich die cv.glmnetFunktion glmnetwie folgt: Dabei mydata_matrixhandelt es sich um eine 570 x 339-Binärmatrix und die Ausgabe ist auch binär:

library(glmnet)
x_dat <- mydata_matrix[, -ncol(mydata_matrix)]
y <- mydata_matrix[, ncol(mydata_matrix)]
cvfit <- cv.glmnet(x_dat, y, family='binomial')

Dieses Diagramm zeigt, dass die geringste Abweichung auftritt, wenn alle Variablen aus dem Modell entfernt wurden. Bedeutet dies wirklich, dass die Verwendung des Abschnitts das Ergebnis besser vorhersagt als die Verwendung eines einzelnen Prädiktors, oder habe ich einen Fehler gemacht, möglicherweise in den Daten oder im Funktionsaufruf?

Dies ähnelt einer vorherigen Frage , die jedoch keine Antworten erhielt.

plot(cvfit)

Geben Sie hier die Bildbeschreibung ein


1
Ich denke, dieser Link kann einige Details ausarbeiten. Im Wesentlichen kann dies bedeuten, dass viele (wenn nicht alle) Ihrer Prädiktoren nicht sehr wichtig sind. Der folgende Thread erklärt dies ausführlicher. stats.stackexchange.com/questions/182595/…
Dhiraj

3
@Dhiraj Significant ist ein Fachbegriff für das Testen der Nullhypothesen-Signifikanz. Es ist hier nicht angebracht.
Matthew Drury

Antworten:


11

Ich glaube nicht, dass Sie einen Fehler im Code gemacht haben. Dies ist eine Frage der Interpretation der Ausgabe.

Das Lasso gibt nicht an, welche einzelnen Regressoren "prädiktiver" sind als andere. Es hat einfach eine eingebaute Tendenz, Koeffizienten als Null zu schätzen. Je größer der Strafkoeffizient ist, desto größer ist diese Tendenz.Log(λ)

Ihr Kreuzvalidierungsdiagramm zeigt, dass das Modell, wenn immer mehr Koeffizienten auf Null gesetzt werden, immer besser Teilmengen von Werten vorhersagt, die zufällig aus dem Datensatz entfernt wurden. Wenn die besten kreuzvalidierten Vorhersagefehler (hier als "Binomialabweichung" gemessen) erreicht werden, wenn alle Koeffizienten Null sind, sollten Sie vermuten, dass keine lineare Kombination einer Teilmenge der Regressoren zur Vorhersage der Ergebnisse nützlich sein kann.

Sie können dies überprüfen, indem Sie zufällige Antworten generieren, die von allen Regressoren unabhängig sind, und Ihr Anpassungsverfahren auf diese anwenden. Hier ist eine schnelle Möglichkeit, Ihren Datensatz zu emulieren:

n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
                       dimnames=list(1:n, c("y", paste0("x", 1:k)))))

Der Datenrahmen Xhat eine zufällige Binärspalte mit dem Namen "y" und 338 andere Binärspalten (deren Namen keine Rolle spielen). Ich habe Ihren Ansatz verwendet, um "y" gegen diese Variablen zu regressieren, aber - um vorsichtig zu sein - habe ich sichergestellt, dass der Antwortvektor yund die Modellmatrix xübereinstimmen (was möglicherweise nicht der Fall ist, wenn in den Daten Werte fehlen). ::

f <- y ~ . - 1            # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")

Das Ergebnis ist bemerkenswert ähnlich wie Ihres:

plot(fit)

Zahl

In der Tat gibt das Lasso mit diesen vollständig zufälligen Daten immer noch neun Koeffizientenschätzungen ungleich Null zurück (obwohl wir konstruktionsbedingt wissen, dass die korrekten Werte alle Null sind). Aber wir sollten keine Perfektion erwarten. Da die Anpassung auf dem zufälligen Entfernen von Teilmengen der Daten zur Kreuzvalidierung basiert, erhalten Sie normalerweise nicht die gleiche Ausgabe von einem Lauf zum nächsten. In diesem Beispiel erzeugt ein zweiter Aufruf cv.glmneteine Anpassung mit nur einem Koeffizienten ungleich Null. Wenn Sie Zeit haben, ist es daher immer eine gute Idee, das Anpassungsverfahren mehrmals erneut auszuführen und zu verfolgen, welche Koeffizientenschätzungen durchweg ungleich Null sind. Für diese Daten - mit Hunderten von Regressoren - dauert es einige Minuten, bis sie neun weitere Male wiederholt werden.

sim <- cbind(as.numeric(coef(fit)), 
             replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), 
     xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
     main="Results of Repeated Cross-Validated Lasso Fits")

Figur 2

Acht dieser Regressoren haben Schätzungen von ungleich Null in etwa der Hälfte der Anpassungen; Der Rest von ihnen hat niemals Schätzungen ungleich Null. Dies zeigt, inwieweit das Lasso auch dann noch Koeffizientenschätzungen ungleich Null enthält, wenn die Koeffizienten selbst wirklich Null sind.


1

Wenn Sie weitere Informationen erhalten möchten, können Sie die Funktion verwenden

fit1<-glmnet(x_dat, y, family='binomial', alpha= x)

plot(fit1, xvar = "lambda", label = TRUE)

Das Diagramm sollte ähnlich sein wie Geben Sie hier die Bildbeschreibung ein Die Beschriftungen ermöglichen es, die Wirkung von Lambda für die Regressoren zu identifizieren.

Können Sie den unterschiedlichen Wert von x (im Modell wird Alpha-Faktor genannt) bis 0 (Gratregression) bis 1 (LASSO-Regression) verwenden? Der Wert [0,1] ist die elastische Nettoregression


Das Verringern von Alpha auf 0,5 hat dazu beigetragen, mehr Variablen aufzunehmen, danke für den Tipp.
Stuart Lacy

0

Die Antwort, dass es keine linearen Kombinationen von Variablen gibt, die für die Vorhersage von Ergebnissen nützlich sind, trifft in einigen, aber nicht in allen Fällen zu.

Ich hatte eine Darstellung wie die obige, die durch Multikollinearität in meinen Daten verursacht wurde. Durch das Reduzieren der Korrelationen konnte Lasso arbeiten, aber es wurden auch nützliche Informationen über die Ergebnisse entfernt. Bessere Variablensätze wurden erhalten, indem zufällige Waldbedeutungen zum Screenen von Variablen und dann Lasso verwendet wurden.


-1

Es ist möglich, aber ein wenig überraschend. LASSO kann seltsame Dinge tun, wenn Sie Kollinearität haben. In diesem Fall sollten Sie wahrscheinlich Alpha <1 setzen, damit Sie stattdessen ein elastisches Netz anbringen. Sie können Alpha durch Kreuzvalidierung auswählen, aber stellen Sie sicher, dass Sie für jeden Alpha-Wert die gleichen Falten verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.