2017-02-23 4 views
1

Этот вопрос был задан в stackoverflow.com/q/38378118, но не было удовлетворительного ответа.Обычные наименьшие квадраты с glmnet и lm

LASSO с λ = 0 эквивалентен обычным наименьшим квадратам, но это не похоже на glmnet() и lm() в R. Почему?

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) 

Их коэффициенты регрессии соглашаются не более чем на 2 значащих цифр, возможно, из-за слегка различные условия прекращения их алгоритмов оптимизации:

    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) 

коэффициенты регрессии:

     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

Если вы проверить эти twoposts, вы получите ощущение, почему вы не получаете те же самые результаты.

По существу, glmnet оштрафовано максимальное правдоподобие, используя путь регуляризации для оценки модели. lm решает проблему наименьших квадратов, используя QR-разложение. Таким образом, оценки никогда не будут одинаковыми.

Однако примечание в руководстве по ?glmnet под "лямбда":

ВНИМАНИЕ: использовать с осторожностью. Не указывайте единственное значение для лямбда (для прогнозов после использования CV() вместо). Вместо этого поставьте уменьшающуюся последовательность значений лямбда. glmnet полагается на свои теплые тона. начинает скорость, а его часто быстрее подходит для целого пути, чем .

Вы можете сделать (по крайней мере) три вещи, чтобы получить коэффициенты ближе, чтобы разность тривиальна - (1) имеют диапазон значений для lambda, (2) уменьшение порогового значения thres, и (3) увеличить максимальное количество итераций.

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 

Некоторые различия для взаимодействовали модели, вероятно, нетривиально, но ближе.

Смежные вопросы