R 在'处获取glmnet系数;最佳';兰姆达

R 在'处获取glmnet系数;最佳';兰姆达,r,regression,glmnet,coefficients,R,Regression,Glmnet,Coefficients,我在glmnet中使用以下代码: > library(glmnet) > fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1]) > plot(fit, xvar='lambda') 然而,我想打印出最好的Lambda系数,就像在岭回归中一样。我看到fit的以下结构: > str(fit) List of 12 $ a0 : Named num [1:79] 20.1 21.6 23.2 24.7 26 ...

我在glmnet中使用以下代码:

> library(glmnet)
> fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1])
> plot(fit, xvar='lambda')

然而,我想打印出最好的Lambda系数,就像在岭回归中一样。我看到fit的以下结构:

> str(fit)
List of 12
 $ a0       : Named num [1:79] 20.1 21.6 23.2 24.7 26 ...
  ..- attr(*, "names")= chr [1:79] "s0" "s1" "s2" "s3" ...
 $ beta     :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. ..@ i       : int [1:561] 0 4 0 4 0 4 0 4 0 4 ...
  .. ..@ p       : int [1:80] 0 0 2 4 6 8 10 12 14 16 ...
  .. ..@ Dim     : int [1:2] 10 79
  .. ..@ Dimnames:List of 2
  .. .. ..$ : chr [1:10] "cyl" "disp" "hp" "drat" ...
  .. .. ..$ : chr [1:79] "s0" "s1" "s2" "s3" ...
  .. ..@ x       : num [1:561] -0.0119 -0.4578 -0.1448 -0.7006 -0.2659 ...
  .. ..@ factors : list()
 $ df       : int [1:79] 0 2 2 2 2 2 2 2 2 3 ...
 $ dim      : int [1:2] 10 79
 $ lambda   : num [1:79] 5.15 4.69 4.27 3.89 3.55 ...
 $ dev.ratio: num [1:79] 0 0.129 0.248 0.347 0.429 ...
 $ nulldev  : num 1126
 $ npasses  : int 1226
 $ jerr     : int 0
 $ offset   : logi FALSE
 $ call     : language glmnet(x = as.matrix(mtcars[-1]), y = mtcars[, 1])
 $ nobs     : int 32
 - attr(*, "class")= chr [1:2] "elnet" "glmnet"
但我无法得到最佳Lambda和相应的系数。谢谢你的帮助。

试试这个:

fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1], 
    lambda=cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.1se)
coef(fit)
或者您可以在
coef
中指定lambda值:

fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1])
coef(fit, s = cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.1se)
您需要选择一个“最佳”lambda,
lambda.1se
是一个合理或合理的选择。但您可以使用
cv.glmnet(as.matrix(mtcars[-1])、mtcars[,1])$lambda.min
或您确定为“最佳”的任何其他lambda值。

boxcox(){MASS}
提供了显示 在线性模型中,l的哪个值最适合

boxcox(lm.fit)
提供了 线性模型中的大范围l

lm.fit
用 最高ML值

boxcox(lm.fit,lambda=seq(-0.1,0.1,0.01))
if,for 例如,最高l约为0.04,请在其周围放大绘图 那个地区

在本例中,函数提供了l=-
0.1和0.1,增量为0.01。

要提取最佳lambda,可以键入
fit$lambda.min

要获得与最佳λ相对应的系数,请使用
coef(fit,s=fit$lambda.min)
-请参考


我认为系数是由一个模型产生的,该模型适合于完整数据,而不仅仅是测试集,如本文所述。

cv.glmnet中lambda.min的对数为-0.5。如果我从上面的glmnet在绘图(拟合)的x轴上标记该点,可以吗?该图x轴上显示的对数lambda来自lambda.min所在的同一矢量?x轴上的对数lambda来自lambda.min所在的同一个lambda值矢量。请注意,由于交叉验证的性质,如果再次运行
cv.glmnet
,则可以为
lambda.min
获取不同的值。因此,x轴上的标记是
cv.glmnet
的特定调用中的
lambda.min
。需要注意的是,正如Frank所说,如果重新运行交叉验证,最小lambda会有一些(或很多)变化<代码>?cv.glmnet提示“请注意,cv.glmnet的结果是随机的,因为折叠是随机选择的。”。用户可以通过多次运行cv.glmnet并平均误差曲线来减少这种随机性。我重新运行cv 100次,对曲线进行平均,然后找到该平均曲线的最小值(或1se,如果您愿意)。@smci询问交叉验证是否是一个好主意?我会说你的想法听起来很合理,但我也会说“最佳实践”可能取决于你的目标。你打算节俭吗?预测能力?功能选择?@smci,我所做的是使用一个随机种子:但使用外部循环,以便cv运行多次(N)。这将通过mse曲线生成Nλ。然后我在每个λ处对曲线上的N ms’se进行平均。然后找到使该平均mse最小的lambda。您使用的是默认lambda序列,该序列是使用
nlambda、lambda.min.ratio
构建的。我经常听到的建议是传递您自己的lambda序列,例如,
lambda=10^seq(10,-15,1/3)
或类似内容。@smci,您的示例中有一个输入错误。符号应位于from参数上,例如
lambda=10^ seq(from=-10,to=15,by=1/3)
@smci您对该建议有引用吗?我找不到任何声明不使用默认lambda序列的内容。虽然我理解为什么提供用户指定的方法可能会很好,但我希望有一个来源。@AW27:您没有引用,但我告诉过您,十多年来,整个用户社区都知道什么是正确的方法;我既不是glmnet doc的作者,也不是出版物的作者。所以,无论如何,我鼓励你提出一个docbug,写一篇博文来说明这一点(在多个不同的数据集上),做一个文献搜索来说明为什么没有很好地涵盖这一点等等。但请不要再问我了。欢迎来到So!我们可以超越只是回答问题的时候,包括一个建议,如何提问可以做得更好。在这种情况下,考虑将ASKER指向“GLMNET”VIGET或<代码> CV.GLMFIT 函数,这将帮助他们找到更好的LAMBDA值。嘿,如果你做的适合= GLMNET(AS。矩阵(MTCAS [ 1)],MTCAS [,1 ] ],没有合适的$lambda。min。您只能通过调用cv.glmnet(as.matrix(mtcars[-1])、mtcars[,1])来实现这一点。此外,如果您阅读了上面的接受答案,可以使用lambda.min,但lambda.1se是常用的,因为您试图选择更为节省的模型。