LASSO 是否遇到与逐步回归相同的问题?

机器算法验证 回归 特征选择 套索 回归策略 逐步回归
2022-01-31 04:04:35

逐步算法变量选择方法倾向于选择对回归模型中的每个估计或多或少有偏差的模型( s 及其 SE、p值、F统计量等),并且排除真实预测变量的可能性与根据相当成熟的模拟文献,包括错误的预测器。β

LASSO 在用于选择变量时是否以相同的特定方式受到影响?

2个回答

对于 LASSO 模型和逐步回归的可能性、p 值等的常客表达式的概率解释是正确的。

这些表达式高估了概率。例如,某个参数的 95% 置信区间应该表示您有 95% 的概率该方法将产生一个区间,该区间内的真实模型变量。

然而,拟合模型不是由典型的单一假设产生的,相反,当我们进行逐步回归或 LASSO 回归时,我们是在挑选(从许多可能的替代模型中选择)。


  1. 评估模型参数的正确性几乎没有意义(尤其是当模型可能不正确时)。

    在下面的示例中(稍后解释),该模型适用于许多回归变量,并且它“遭受”多重共线性。这使得很可能在模型中选择了一个相邻的回归量(它是强相关的),而不是模型中真正存在的回归量。强相关性导致系数具有较大的误差/方差(与矩阵相关)。(XTX)1

    但是,由于多重共线性导致的这种高方差在诊断中没有“看到”,例如 p 值或系数的标准误差,因为这些是基于具有较少回归(并且没有直接的方法来计算 LASSO 的这些类型的统计数据)X

    示例:下图显示了某个信号的玩具模型的结果,该信号是 10 条高斯曲线的线性和(例如,这可能类似于化学分析,其中光谱的信号被认为是几个组件)。使用 LASSO 将 10 条曲线的信号与 100 个分量的模型(具有不同均值的高斯曲线)进行拟合。信号被很好地估计(比较相当接近的红色和黑色曲线)。但是,实际的基础系数没有得到很好的估计,并且可能完全错误(将红色和黑色条与不同的点进行比较)。另见最后 10 个系数:

                  91     91     92     93     94     95     96     97     98     99     100
     true model   0      0      0      0      0      0      0      142.8  0      0      0
     fitted       0      0      0      0      0      0      129.7  6.9    0      0      0
    

    LASSO模型确实选择了非常近似的系数,但是从系数本身的角度来看,当一个应该非零的系数被估计为零并且一个应该为零的相邻系数被估计为时,这意味着一个很大的误差非零。系数的任何置信区间都没有多大意义。

    套索配件

    示例套索/glmnet

    逐步拟合

    作为比较,可以用逐步算法拟合相同的曲线,从而得到下图。(有类似的问题,系数接近但不匹配)

    示例 nnls

  2. 即使您考虑曲线的准确性(而不是参数,在前一点中明确表示它没有意义),您也必须处理过度拟合。当您使用 LASSO 进行拟合程序时,您会使用训练数据(以拟合具有不同参数的模型)和测试/验证数据(以调整/找到最佳参数),但您还应该使用第三个单独的集合测试/验证数据以找出数据的性能。

    p 值或类似的东西是行不通的,因为您正在研究一个调谐模型,该模型是樱桃采摘并且与常规线性拟合方法不同(更大的自由度)。


逐步回归遇到同样的问题吗?

您似乎指的是诸如、p 值、F 分数或标准误差等值的偏差之类的问题。我相信 LASSO 不是用来解决这些问题的。R2

我认为使用 LASSO 代替逐步回归的主要原因是 LASSO 允许较少贪婪的参数选择,即受多重共线性的影响较小。(LASSO 和 stepwise 的更多区别:LASSO 在模型的交叉验证预测误差方面优于前向选择/后向消除


示例图像的代码

# settings
library(glmnet)
n <- 10^2        # number of regressors/vectors
m <- 2         # multiplier for number of datapoints
nel <- 10        # number of elements in the model
set.seed(1)   
sig <- 4
t <- seq(0,n,length.out=m*n)

# vectors
X <- sapply(1:n, FUN <- function(x) dnorm(t,x,sig))

# some random function with nel elements, with Poisson noise added
par <- sample(1:n,nel)
coef <- rep(0,n)
coef[par] <- rnorm(nel,10,5)^2
Y <- rpois(n*m,X %*% coef)

# LASSO cross validation
fit <- cv.glmnet(X,Y, lower.limits=0, intercept=FALSE, 
                 alpha=1, nfolds=5, lambda=exp(seq(-4,4,0.1)))
plot(fit$lambda, fit$cvm,log="xy")
plot(fit)
Yfit <- (X %*% coef(fit)[-1])

# non negative least squares 
# (uses a stepwise algorithm or should be equivalent to stepwise)
fit2<-nnls(X,Y)


# plotting
par(mgp=c(0.3,0.0,0), mar=c(2,4.1,0.2,2.1))
layout(matrix(1:2,2),heights=c(1,0.55))


plot(t,Y,pch=21,col=rgb(0,0,0,0.3),bg=rgb(0,0,0,0.3),cex=0.7,
     xaxt = "n", yaxt = "n", 
     ylab="", xlab = "",bty="n")      
#lines(t,Yfit,col=2,lwd=2)                        # fitted mean
lines(t,X %*% coef,lwd=2)                        # true mean
lines(t,X %*% coef(fit2), col=3,lwd=2)           # 2nd fit

  # add coefficients in the plot
for (i in 1:n) {
  if (coef[i] > 0) {
    lines(c(i,i),c(0,coef[i])*dnorm(0,0,sig))
    points(i,coef[i]*dnorm(0,0,sig), pch=21, col=1,bg="white",cex=1)
  }
  if (coef(fit)[i+1] > 0) {
#    lines(c(i,i),c(0,coef(fit)[i+1])*dnorm(0,0,sig),col=2)
#    points(i,coef(fit)[i+1]*dnorm(0,0,sig), pch=21, col=2,bg="white",cex=1)
  }
  if (coef(fit2)[i+1] > 0) {
    lines(c(i,i),c(0,coef(fit2)[i+1])*dnorm(0,0,sig),col=3)
    points(i,coef(fit2)[i+1]*dnorm(0,0,sig), pch=21, col=3,bg="white",cex=1)
  }

}

#Arrows(85,23,85-6,23+10,-0.2,col=1,cex=0.5,arr.length=0.1)
#Arrows(86.5,33,86.5-6,33+10,-0.2,col=2,cex=0.5,arr.length=0.1)
#text(85-6,23+10,"true coefficient", pos=2, cex=0.7,col=1)
#text(86.5-6,33+10, "fitted coefficient", pos=2, cex=0.7,col=2)

text(0,50, "signal versus position\n true mean (black), fitted with nnls (green)", cex=1,col=1,pos=4, font=2)



plot(-100,-100,pch=21,col=1,bg="white",cex=0.7,type="l",lwd=2,
     xaxt = "n", yaxt = "n", 
     ylab="", xlab = "",
     ylim=c(0,max(coef(fit)))*dnorm(0,0,sig),xlim=c(0,n),bty="n") 
#lines(t,X %*% coef,lwd=2,col=2)      

for (i in 1:n) {
  if (coef[i] > 0) {
    lines(t,X[,i]*coef[i],lty=1)
  }
  if (coef(fit)[i+1] > 0) {
#    lines(t,X[,i]*coef(fit)[i+1],col=2,lty=1)
  }
  if (coef(fit2)[i+1] > 0) {
    lines(t,X[,i]*coef(fit2)[i+1],col=3,lty=1)
  }

}

text(0,33, "illustration of seperate components/curves", cex=1,col=1,pos=4, font=2)

我有一个新的演讲来解决这个问题。底线:套索选择“正确”变量的概率很低。幻灯片位于 http://fharrell.com/talk/stratos19

——弗兰克·哈雷尔

与“底线:套索选择“正确”变量的可能性低”相关:在稀疏性统计学习中有一个关于同一主题的部分(https://web.stanford.edu/~hastie/StatLearnSparsity_files/SLS_corrected_1。 4.16.pdf ), 11.4.1 Variable-Selection Consistency for the Lasso

– 阿德里安

也与“底线:套索选择“正确”变量的可能性低”有关:参见 https://statweb.stanford.edu/~candes/teaching/stats300c/Lectures/Lecture24.pdf 案例研究 1 和 2

– 阿德里安