为什么predict.glmnet会忽略传递给它的lambda值,是否有解决方法使其接受该值?

时间:2013-11-05 07:34:10

标签: r glmnet

在下面的代码中,我希望两个print语句打印相同的结果,因为我明确地将参数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的结果仍然不同。

1 个答案:

答案 0 :(得分:1)

此问题似乎与您使用的s值不属于grid的事实有关。有关predict.glmnet的使用,请参阅exact帮助。解决此问题的一种方法是在使用s构建模型时,使用与predict中要使用的完全相同的glmnet值。