LASSO 何时选择相关预测变量?

机器算法验证 相关性 特征选择 套索 正则化 岭回归
2022-02-02 01:29:51

我在 R 中使用包 'lars' 和以下代码:

> library(lars)
> set.seed(3)
> n <- 1000
> x1 <- rnorm(n)
> x2 <- x1+rnorm(n)*0.5
> x3 <- rnorm(n)
> x4 <- rnorm(n)
> x5 <- rexp(n)
> y <- 5*x1 + 4*x2 + 2*x3 + 7*x4 + rnorm(n)
> x <- cbind(x1,x2,x3,x4,x5)
> cor(cbind(y,x))
            y          x1           x2           x3          x4          x5
y  1.00000000  0.74678534  0.743536093  0.210757777  0.59218321  0.03943133
x1 0.74678534  1.00000000  0.892113559  0.015302566 -0.03040464  0.04952222
x2 0.74353609  0.89211356  1.000000000 -0.003146131 -0.02172854  0.05703270
x3 0.21075778  0.01530257 -0.003146131  1.000000000  0.05437726  0.01449142
x4 0.59218321 -0.03040464 -0.021728535  0.054377256  1.00000000 -0.02166716
x5 0.03943133  0.04952222  0.057032700  0.014491422 -0.02166716  1.00000000
> m <- lars(x,y,"step",trace=T)
Forward Stepwise sequence
Computing X'X .....
LARS Step 1 :    Variable 1     added
LARS Step 2 :    Variable 4     added
LARS Step 3 :    Variable 3     added
LARS Step 4 :    Variable 2     added
LARS Step 5 :    Variable 5     added
Computing residuals, RSS etc .....

我有一个包含 5 个连续变量的数据集,我正在尝试将模型拟合到单个(因)变量 y。我的两个预测变量彼​​此高度相关(x1,x2)。

正如您在上面的示例中看到的那样,带有“逐步”选项的 lars 函数首先选择与 y 最相关的变量。进入模型的下一个变量是与残差最相关的变量。确实,它是 x4:

> round((cor(cbind(resid(lm(y~x1)),x))[1,3:6]),4)
    x2     x3     x4     x5 
0.1163 0.2997 0.9246 0.0037  

现在,如果我执行“套索”选项:

> m <- lars(x,y,"lasso",trace=T)
LASSO sequence
Computing X'X ....
LARS Step 1 :    Variable 1     added
LARS Step 2 :    Variable 2     added
LARS Step 3 :    Variable 4     added
LARS Step 4 :    Variable 3     added
LARS Step 5 :    Variable 5     added

它在前两个步骤中将两个相关变量添加到模型中。这与我在几篇论文中读到的相反。大多数人说,如果有一组变量之间的相关性非常高,那么“套索”倾向于从组中随机选择一个变量。

有人可以提供这种行为的例子吗?或者解释一下,为什么我的变量 x1、x2 一个接一个(一起)添加到模型中?

2个回答

共线性问题被高估了!

托马斯,你表达了一个共同的观点,如果预测变量是相关的,即使是最好的变量选择技术也只是从一堆中随机挑选一个。幸运的是,这低估了回归发现真相的能力!如果您有正确类型的解释变量(外生),多元回归有望找到每个变量保持其他变量不变的效果。现在,如果变量完全相关,那么这实际上是不可能的。如果变量是相关的,可能会更难,但就当今典型数据集的规模而言,这并没有那么难。

共线性是一个低信息问题。看看 Art Goldberger 在Dave Giles 的博客上对共线性的模仿。如果应用于均值而不是偏回归系数,我们谈论共线性的方式听起来很愚蠢。

还是不服气?是时候写一些代码了。

set.seed(34234)

N <- 1000
x1 <- rnorm(N)
x2 <- 2*x1 + .7 * rnorm(N)
cor(x1, x2) # correlation is .94
plot(x2 ~ x1)

我创建了高度相关的变量 x1 和 x2,但您可以在下图中看到,当 x1 接近 -1 时,我们仍然可以看到 x2 的可变性。 在此处输入图像描述

现在是时候添加“真相”了:

y <- .5 * x1 - .7 * x2 + rnorm(N) # Data Generating Process

在强大的共线性问题中,普通回归能否成功?

summary(lm(y ~ x1 + x2))

哦,是的,它可以:

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0005334  0.0312637  -0.017    0.986    
x1           0.6376689  0.0927472   6.875 1.09e-11 ***
x2          -0.7530805  0.0444443 -16.944  < 2e-16 ***

现在我没有谈论你的问题所关注的 LASSO。但是让我问你这个。如果带有向后消除的老式回归不会被共线性所迷惑,那么您为什么认为最先进的 LASSO 会呢?

Ben 的回答激励我在他提供的道路上更进一步,如果“真相”,y,在其他情况下会发生什么。

在原始示例中,y 取决于两个高度相关的变量 x1 和 x2。假设还有另一个变量 x3,比如说

x3 = c(1:N)/250 #之前定义了N,N = 1000,x3与x1的尺度相似,x3的尺度对下面的线性回归结果有影响。

“真相” y 现在定义如下

y = .5 * x1 - .7 * x3 + rnorm(N) # 数据生成过程

回归会发生什么?

摘要(lm(y ~ x1 + x2))

存在强共线性效应。x2 的标准误差太大。但是,线性回归将 x2 识别为非显着变量。

     Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.39164    0.04172 -33.354  < 2e-16 ***
x1           0.65329    0.12550   5.205 2.35e-07 ***
x2          -0.07878    0.05848  -1.347    0.178 

vif(lm(y ~ x1 + x2))

x1       x2 
9.167429 9.167429 

另一个回归案例呢?

摘要(lm(y ~ x1 + x2 + x3))

Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.02100    0.06573   0.319    0.749    
x1           0.55398    0.09880   5.607 2.67e-08 ***
x2          -0.02966    0.04604  -0.644    0.520    
x3          -0.70562    0.02845 -24.805  < 2e-16 ***

变量 x2 不显着,建议通过线性回归去除。

vif (lm(y ~ x1 + x2 + x3))

x1       x2       x3 
9.067865 9.067884 1.000105 

从上面的结果来看,线性回归中共线性不是问题,检查VIF也不是很有帮助。

让我们看看另一种情况。x3 = c(1:N) # N是之前定义的,N = 1000,x3和x1不在同一个尺度。

“真相” y 的定义与上述相同

y = .5 * x1 - .7 * x3 + rnorm(N) # 数据生成过程

回归会发生什么?

摘要(lm(y ~ x1 + x2))

存在强共线性效应。x1、x2 的标准误过大。线性回归无法识别重要变量 x1。

   Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept) -350.347      6.395 -54.783   <2e-16 ***
x1            25.207     19.237   1.310    0.190    
x2           -12.212      8.963  -1.362    0.173  

vif(lm(y ~ x1 + x2))

    x1       x2 
9.167429 9.167429 

另一个回归案例呢?

摘要(lm(y ~ x1 + x2 + x3))

Coefficients:
          Estimate Std. Error   t value Pr(>|t|)    
(Intercept)  0.0360104  0.0610405     0.590    0.555    
x1           0.5742955  0.0917555     6.259 5.75e-10 ***
x2          -0.0277623  0.0427585    -0.649    0.516    
x3          -0.7000676  0.0001057 -6625.170  < 2e-16 ***

变量 x2 不显着,建议通过线性回归去除。

vif (lm(y ~ x1 + x2 + x3))

x1       x2       x3 
9.182507 9.184419 1.001853 

注意:y 在 x1 和 x3 上的回归。请注意,x1 的标准误差仅为 0.03。

摘要(lm(y ~ x1 + x3))

Coefficients:
              Estimate Std. Error   t value Pr(>|t|)    
(Intercept) -0.1595528  0.0647908    -2.463    0.014 *  
x1           0.4871557  0.0321623    15.147   <2e-16 ***
x3          -0.6997853  0.0001121 -6240.617   <2e-16 ***

基于以上结果,我的结论是

  • 当预测变量处于相似尺度时,线性回归中不存在共线性问题;
  • 当预测变量不在相似的范围内时,
    • 当两个高度相关的变量都在真实模型中时,共线性不成问题;
    • 当两个高度相关的变量中只有一个在真实模型中时,
      • 如果其他“真实”变量包含在线性回归中,则线性回归将识别与显着变量相关的非显着变量。
      • 如果线性回归中不包括其他“真实”变量,则共线性问题很严重,导致标准误差膨胀。