Почему predict.glmnet игнорирует переданное ему лямбда-значение, и есть ли обходной путь, чтобы заставить его принять это значение?

В следующем коде я ожидаю, что два оператора печати будут печатать один и тот же результат, поскольку я явно передаю параметр s обеим функциям прогнозирования.

library(glmnet)

set.seed(1)
x=rnorm(100)
eps=rnorm(100)

y = 1 + x + x^2 + x^3 + eps

xmat=model.matrix(y~poly(x,10,raw=T),data=data.frame(x=x))

grid=10^seq(10,-2,length=100)

lasso.mod = glmnet(xmat,y, alpha=1,lambda=grid)
lasso.coef=predict(lasso.mod,type="coefficients",s=0.01495444)[1:10,]
print(lasso.coef)

lasso.mod = glmnet(xmat,y, alpha=1,lambda=5)
lasso.coef=predict(lasso.mod,type="coefficients",s=0.01495444)[1:10,]
print(lasso.coef)

Однако результаты сильно отличаются, и хотелось бы понять, почему.

          (Intercept)           (Intercept) poly(x, 10, raw = T)1 
         1.1329454011          0.0000000000          1.3081576745 
poly(x, 10, raw = T)2 poly(x, 10, raw = T)3 poly(x, 10, raw = T)4 
         0.6887020751          0.6576599481          0.0336098492 
poly(x, 10, raw = T)5 poly(x, 10, raw = T)6 poly(x, 10, raw = T)7 
         0.0566899437          0.0002744787          0.0006870169 
poly(x, 10, raw = T)8 
         0.0001053833 
          (Intercept)           (Intercept) poly(x, 10, raw = T)1 
             2.092266              0.000000              0.000000 
poly(x, 10, raw = T)2 poly(x, 10, raw = T)3 poly(x, 10, raw = T)4 
             0.000000              0.000000              0.000000 
poly(x, 10, raw = T)5 poly(x, 10, raw = T)6 poly(x, 10, raw = T)7 
             0.000000              0.000000              0.000000 
poly(x, 10, raw = T)8 
             0.000000 

Я провел эксперимент, в котором я изменил lasso.mod = glmnet(xmat,y, alpha=1,lambda=5) на lasso.mod = glmnet(xmat,y, alpha=1,lambda=0.015), и результаты были намного ближе.

Кажется, что функция прогнозирования зависит от grid, который передается функции обучения, но в документации, похоже, указано, что параметр s в predict должен переопределять его. Есть ли зависимость, и если да, то какая и как ее обойти к коэффициентам для произвольных s?

Обновление 1: я нашел загадочное предупреждение в документации для glmnet.

      Do not
      supply a single value for 'lambda' (for predictions after CV
      use 'predict()' instead).  Supply instead a decreasing
      sequence of 'lambda' values. 'glmnet' relies on its warms
      starts for speed, and its often faster to fit a whole path
      than compute a single fit.

Предупреждение относится только к производительности, а не к точности/стабильности, но я пытался варьировать различные последовательности уменьшения grid, и результаты predict все равно различались.


person merlin2011    schedule 05.11.2013    source источник


Ответы (1)


Проблема, похоже, связана с тем фактом, что используемое вами значение s не принадлежит grid. Обратитесь к predict.glmnet справке по использованию exact. Один из способов обойти это — использовать точно такое же значение s, которое вы хотите использовать в predict, при построении моделей с использованием glmnet.

person user1521587    schedule 29.11.2013