如何找到最小的λλ使得所有 Lasso / Elastic Net 系数都为零?

机器算法验证 回归 机器学习 套索 网络 弹性网
2022-04-08 00:17:23

在 R 的 glmnet 包的文档中,它指出当拟合弹性网络时,glmnet 函数将使用一系列λ值,从所有系数为零λ的最小λ我怎样才能找到这样的λ值?

2个回答

套索解β^(λ)求解

minβ12||yXβ||22+λ||β||1.
众所周知, 对于所有的\lambda \geq \lambda_1 ,我们有\widehat{\beta}(\lambda)=0其中\lambda_1 = \max_j |X_j^Ty| ,它应该给你想要的值。β^(λ)=0λλ1λ1=maxj|XjTy|

请注意,如果目标函数的缩放比例不同, λ1


使用带有 GLMNET 的汽车示例:

fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1], intercept=FALSE, standardize=FALSE) 1/32*max(abs(t(as.matrix(mtcars[,-1]))%*%mtcars[,1]))/(head(fit$lambda))[1]

正如预期的那样,这给出了值 1。

请注意,标准化和截距都设置为 FALSE。如果标准化和截距设置为 TRUE,则的值是在缩放回归量上计算的。(在这方面,请查看https://think-lab.github.io/d/205/#5,了解如何执行适当的缩放以获得您想要的结果。):λ

xy<-scale(mtcars) fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1]) (1/32*max(abs(t(xy[,-1])%*%mtcars[,1]*sqrt(32/31))))/(head(fit$lambda))[1]

这再次给出了值 1 ...

但是,如果拦截 = TRUE 但标准化 = FALSE,我不确定 glmnet 正在计算什么。


我们看到带有标准选项的 glmnet 计算, 其中λ1

λ1=maxj|1ni=1nxjy|
xj=xjxj¯1ni=1n(xjxj¯)2.

事实证明,对于弹性网络问题(对应 ),其最大值计算为α(0,1]λ1,α

λ1,α=λ1/α

实际上,例如设置我们有:α=0.3

aa<-0.3 xy<-scale(mtcars) fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1],a=aa) 1/aa*(1/32*max(abs(t(xy[,-1])%*%mtcars[,1]*sqrt(32/31))))/(head(fit$lambda))[1]

这再次导致输出值1

那是为了计算。但是请注意,弹性网络标准可以重写为标准套索问题。

首先,我认为glmnet将从大的而不是小的开始。这是文档:注意,如果我们想指定,最好按降序排列λλλ

典型的用法是让程序根据 nlambda 和 lambda.min.ratio 计算自己的 lambda 序列。提供 lambda 值会覆盖此值。警告:小心使用。不要为 lambda 提供单个值(对于 CV 之后的预测,请改用 predict())。而是提供递减的 lambda 值序列。glmnet 依赖于它的暖启动速度,而且它通常更快地适应整个路径而不是计算单个适应。

另外,请参阅我的问题:为什么 `R` `glmnet` 需要以降序运行?λ


拟合结果包含使用的 lambda 值。这是一个例子。

library(glmnet)
fit=glmnet(as.matrix(mtcars[,-1]),mtcars[,1])
head(fit$lambda)
[1] 5.146981 4.689737 4.273114 3.893502 3.547614 3.232454