2017-02-23 14 views
1

이 질문은 에 질문 되었으나 만족할만한 대답이 없었습니다.glmnet 및 lm을 사용하는 보통 최소 제곱

λ = 0 인 LASSO는 일반적인 최소 제곱과 동일하지만 R의 glmnet()lm()의 경우는 아닌 것 같습니다. 그 이유는 무엇입니까?

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) 

이들의 회귀 계수는 최적화 알고리즘의 아마 약간의 차이로 인해 종료 조건에서 대부분이 개 유효 숫자가 동의 : 우리는 상호 작용 조건을 추가 할 때

    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 

의 차이는 훨씬 더 나쁘다.

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

회귀 계수 :이 twoposts을 선택하면

     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

크로스 유효성 확인을 시도해보십시오. – sconfluentus

답변

3

, 당신은 왜이 같은 결과를 얻는되지 않습니다에 관한 감각을 얻을 것이다.

본질적으로 glmnet 정규화 경로를 사용하여 모델을 추정 할 때 최대 우도가 부과됩니다. lm은 QR 분해를 사용하여 최소 제곱 문제를 해결합니다. 따라서 견적은 완전히 동일하지 않습니다.

그러나 "람다"에서 ?glmnet의 사용 설명서에주의 사항 :

경고 :주의하여 사용한다. 람다에 단일 값을 제공하지 마십시오 (CV 사용 후 predict() 대신 예측). 대신 람다 값의 시퀀스가 ​​감소합니다. glmnet은 따뜻함에 의지합니다. 은 속도를 내기 시작하며, 종종 이 단일 적합을 계산하는 것보다 전체 경로에 더 빠르게 맞 춥니 다.

당신은 계수 가까이 그렇게 차이가 사소한 얻을 수있는 (적어도) 세 가지를 할 수있다 - (1) lambda 값의 범위가를, (2) 임계 값 thres 감소, (3) 반복의 최대 횟수를 늘립니다.


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 

상호 작용 된 모델의 차이의 일부

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 

아마이 아닌 사소한,하지만 가까이 있습니다.