套索与自适应套索

机器算法验证 套索 网络 弹性网 甲骨文
2022-01-28 13:44:01

LASSO 和自适应 LASSO 是两个不同的东西,对吧?(对我来说,处罚看起来不同,但我只是在检查我是否错过了什么。)

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

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

自适应 LASSO 适用于较温和的条件,对吗?两者都在合适的数据中具有 oracle 属性,对吗?

3个回答

简要回答您的问题:

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

参考:

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

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

自适应套索只是为此添加权重,以试图抵消已知的套索估计有偏差的问题。

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

经常你会看到wj=1/β~j, 在哪里β~j是一些初步估计β(可能只是使用 LASSO,或者使用最小二乘法等)。有时自适应套索使用“路径方法”拟合,其中允许权重随λ

wj(λ)=w(β~j(λ))
. 在里面glmnet包装重量可以用penalty.factor争论。我不确定您是否可以在glmnet.

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

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

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

在为预测选择调整参数时,LASSO 通常包含太多变量,但真正的模型很可能是这些变量的子集。这建议使用第二阶段的估计,如自适应 LASSO,它使用预测最优调整参数控制 LASSO 估计的偏差。在没有上述条件的情况下,这会导致一致的选择(或预言机属性)。

您可以使用 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)