2017-02-23 3 views
1

Diese Frage wurde in stackoverflow.com/q/38378118 gestellt, aber es gab keine befriedigende Antwort.Gewöhnliche kleinste Quadrate mit glmnet und lm

LASSO mit λ = 0 entspricht Äquivalenz kleinster Quadrate, dies scheint jedoch für glmnet() und lm() in R nicht der Fall zu sein. Warum?

library(glmnet) 
options(scipen = 999) 

X = model.matrix(mpg ~ 0 + ., data = mtcars) 
y = as.matrix(mtcars["mpg"]) 
coef(glmnet(X, y, lambda = 0)) 
lm(y ~ X) 

Die Regressionskoeffizienten stimmen höchstens 2 signifikanten Zahlen, vielleicht wegen etwas anderen Abschlussbedingungen ihrer Optimierungsalgorithmen:

    glmnet  lm 
(Intercept) 12.19850081 12.30337 
cyl   -0.09882217 -0.11144 
disp   0.01307841 0.01334 
hp   -0.02142912 -0.02148 
drat   0.79812453 0.78711 
wt   -3.68926778 -3.71530 
qsec   0.81769993 0.82104 
vs   0.32109677 0.31776 
am   2.51824708 2.52023 
gear   0.66755681 0.65541 
carb   -0.21040602 -0.19942 

Der Unterschied viel schlimmer ist, wenn wir Interaktion Begriffe hinzufügen.

X = model.matrix(mpg ~ 0 + . + . * disp, data = mtcars) 
y = as.matrix(mtcars["mpg"]) 
coef(glmnet(X, y, lambda = 0)) 
lm(y ~ X) 

Regressionskoeffizienten:

     glmnet   lm 
(Intercept) 36.2518682237 139.9814651 
cyl   -11.9551206007 -26.0246050 
disp   -0.2871942149 -0.9463428 
hp   -0.1974440651 -0.2620506 
drat   -4.0209186383 -10.2504428 
wt    1.3612184380 5.4853015 
qsec   2.3549189212 1.7690334 
vs   -25.7384282290 -47.5193122 
am   -31.2845893123 -47.4801206 
gear   21.1818220135 27.3869365 
carb   4.3160891408 7.3669904 
cyl:disp  0.0980253873 0.1907523 
disp:hp  0.0006066105 0.0006556 
disp:drat  0.0040336452 0.0321768 
disp:wt  -0.0074546428 -0.0228644 
disp:qsec  -0.0077317305 -0.0023756 
disp:vs  0.2033046078 0.3636240 
disp:am  0.2474491353 0.3762699 
disp:gear  -0.1361486900 -0.1963693 
disp:carb  -0.0156863933 -0.0188304 
+0

versuchen, dies auf Kreuz validiert – sconfluentus

Antwort

3

Wenn Sie diese twoposts überprüfen, werden Sie ein Gefühl bekommen, warum Sie nicht die gleichen Ergebnisse erhalten werden.

Im Wesentlichen bestraft glmnet maximale Wahrscheinlichkeit mit einem Regularisierungspfad, um das Modell zu schätzen. lm löst das Problem der kleinsten Quadrate mithilfe der QR-Zerlegung. Also werden die Schätzungen niemals exakt gleich sein.

Beachten Sie jedoch, im Handbuch für ?glmnet unter "Lambda":

WARNUNG: Vorsicht verwenden. Geben Sie keinen einzelnen Wert für Lambda an (für Vorhersagen nach CV-Verwendung vorherzusagen()). Liefern Sie stattdessen eine abnehmende Folge von Lambda-Werten. glmnet verlässt sich auf seine Wärmemengen startet für die Geschwindigkeit, und es ist oft schneller, um einen ganzen Pfad als eine einzige Anpassung zu passen.

Sie können (mindestens) drei Dinge tun die Koeffizienten näher zu kommen, so dass die Differenz ist trivial - (1) haben eine Reihe von Werten für lambda, (2) verringern den Schwellenwert thres und (3) Erhöhen Sie die maximale Anzahl der Iterationen.

library(glmnet) 
options(scipen = 999) 

X = model.matrix(mpg ~ 0 + ., data = mtcars) 
y = as.matrix(mtcars["mpg"]) 
lfit <- glmnet(X, y, lambda = rev(0:99), thres = 1E-10) 
lmfit <- lm(y ~ X) 
coef(lfit, s = 0) - coef(lmfit) 
11 x 1 Matrix of class "dgeMatrix" 
          1 
(Intercept) 0.004293053125 
cyl   -0.000361655351 
disp  -0.000002631747 
hp   0.000006447138 
drat  -0.000065394578 
wt   0.000180943607 
qsec  -0.000079480187 
vs   -0.000462099248 
am   -0.000248796353 
gear  -0.000222035415 
carb  -0.000071164178 

X = model.matrix(mpg ~ 0 + . + . * disp, data = mtcars) 
y = as.matrix(mtcars["mpg"]) 
lfit <- glmnet(X, y, lambda = rev(0:99), thres = 1E-12, maxit = 10^7) 
lmfit <- glm(y ~ X) 
coef(lfit, s = 0) - coef(lmfit) 
20 x 1 Matrix of class "dgeMatrix" 
          1 
(Intercept) -0.3174019115228 
cyl   0.0414909318817 
disp   0.0020032493403 
hp   0.0001834076765 
drat   0.0188376047769 
wt   -0.0120601219002 
qsec   0.0019991131315 
vs   0.0636756040430 
am   0.0439343002375 
gear  -0.0161102501755 
carb  -0.0088921918062 
cyl:disp -0.0002714213271 
disp:hp  -0.0000001211365 
disp:drat -0.0000859742667 
disp:wt  0.0000462418947 
disp:qsec -0.0000175276420 
disp:vs  -0.0004657059892 
disp:am  -0.0003517289096 
disp:gear 0.0001629963377 
disp:carb 0.0000085312911 

Einige der Unterschiede für die interagierten Modell sind wahrscheinlich nicht trivial, aber näher.

Verwandte Themen