套索vs.自适应套索


12

LASSO和自适应LASSO是两个不同的东西,对吗?(对我来说,处罚看起来有所不同,但我只是在检查我是否错过了某件事。)

当您通常谈到弹性网时,是LASSO还是自适应LASSO?

如果您选择alpha = 1,glmnet包将执行哪一个操作?

自适应LASSO可在较温和的条件下工作,对吗?两者都在适当的数据中具有oracle属性,对吗?

Answers:


15

您问题的简要答案:

  • 套索和自适应套索是不同的。(请查看Zou(2006),了解自适应套索与标准套索有何不同。)
  • 套索是弹性网的特例。(参见Zou&Hastie(2005)。)
    自适应套索不是弹性网的特殊情况。
    弹性网不是套索或自适应套索的特殊情况。
  • glmnetR中的“ glmnet”包中的函数为执行套索(不是自适应套索)alpha=1
  • 套索比适应性套索在更温和的条件下工作吗?我无法回答这个问题(应该查看Zou(2006)的见解)。
  • 只有自适应套索(而不是套索或弹性网)才具有oracle属性。(参见邹(2006)。)

参考文献:


12

LASSO解决方案是最小化的解决方案

Q(β|X,y)=12n||yXβ||2+λj|βj|

自适应套索只是简单地增加了权重,以试图抵消已知的LASSO估计偏差的问题。

Qa(β|X,y,w)=12n||yXβ||2+λjwj|βj|

常,你会看到,其中是一些初始估计(也许从只使用LASSO,或使用最小二乘法,等)。有时,自适应套索可以使用“路径方式”进行拟合,其中权重可以使用进行更改β Ĵ β λwj=1/β~jβ~jβλ

glmnet penalty.factor glmnet

wj(λ)=w(β~j(λ))
。在包装的权重可以与指定参数。我不确定是否可以在指定“按路径方式” 。glmnetpenalty.factorglmnet

您忘记了惩罚条款中的绝对值。
理查德·哈迪

|β|γγβ

因此,基本上,glmnet默认情况下执行LASSO或弹性网,但是您可以通过指定适当的权重将其切换为自适应LASSO(或EN)?如果是这种情况,谢谢百万!
先生验证

@MrValidation,请注意,诸如自适应套索之类的新方法的作者可能会在其网站上有该方法的代码(有时他们只是引用了他们自己编写的R包)。
理查德·哈迪

1
我认为在glmnet的权重参数指的是权重的意见,而不是权重的处罚
JMB

3

自适应LASSO用于一致的变量选择。使用LASSO进行变量选择时,我们遇到的问题是:

  • 选择的收缩参数必须大于预测
  • 较大的非零参数将太小,以至于偏差太大
  • 小的非零参数无法一致检测
  • 预测变量之间的高度相关性导致选择性能不佳

因此,LASSO仅在某些条件下在收缩参数,参数(β-min条件)和相关性(无法表示的条件)下进行变量选择是一致的。有关详细说明,请参见我的硕士论文的第101-106页。

当选择用于预测的调整参数时,LASSO通常包含太多变量,但是真实模型很可能是这些变量的子集。这建议使用诸如自适应LASSO之类的估计的辅助阶段,该阶段使用预测最佳调整参数来控制LASSO估计的偏差。这将导致没有上述条件的一致选择(或oracle属性)。

您可以将glmnet用于自适应LASSO。首先,您需要一个初始估计值,即最小二乘法,岭估计值,甚至是LASSO估计值,才能计算权重。然后,您可以通过缩放X矩阵来实现自适应LASSO。这是一个在训练数据上使用最小二乘方初始估计的示例:

# get data
y <- train[, 11]
x <- train[, -11]
x <- as.matrix(x)
n <- nrow(x)

# standardize data
ymean <- mean(y)
y <- y-mean(y)  
xmean <- colMeans(x)
xnorm <- sqrt(n-1)*apply(x,2,sd)
x <- scale(x, center = xmean, scale = xnorm)

# fit ols 
lm.fit <- lm(y ~ x)
beta.init <- coef(lm.fit)[-1] # exclude 0 intercept

# calculate weights
w  <- abs(beta.init)  
x2 <- scale(x, center=FALSE, scale=1/w)  

# fit adaptive lasso
require(glmnet)
lasso.fit <- cv.glmnet(x2, y, family = "gaussian", alpha = 1, standardize = FALSE, nfolds = 10)
beta <- predict(lasso.fit, x2, type="coefficients", s="lambda.min")[-1]

# calculate estimates
beta <- beta * w / xnorm # back to original scale
beta <- matrix(beta, nrow=1)
xmean <- matrix(xmean, nrow=10)
b0 <- apply(beta, 1, function(a) ymean - a %*% xmean) # intercept
coef <- cbind(b0, beta)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.