繁体   English   中英

glmnet:在 lambda 处,每个系数都缩小到 0?

[英]glmnet: at what lambda is each coefficient shrunk to 0?

我正在使用 LASSO(从 package glmnet )到 select 变量。 我已经安装了glmnet model 并绘制了针对 lambda 的系数。

library(glmnet)
set.seed(47)
x = matrix(rnorm(100 * 3), 100, 3)
y = rnorm(100)
fit = glmnet(x, y)
plot(fit, xvar = "lambda", label = TRUE)

阴谋

现在我想得到系数变为0的顺序。换句话说,每个系数在lambda处变为0?

我在 glmnet 中找不到function来提取这样的结果。 我怎么才能得到它?

这是一个 function 来做到这一点:

## only use it for LASSO or elastic net, not ridge regression
## it is very efficient, without converting `fit$beta` to a dense matrix
ScanPath <- function (fit) {
  b <- fit$beta
  ind <- which(!duplicated(b@i))
  i <- b@i[ind] + 1L
  j <- findInterval(ind, b@p, left.open = TRUE)
  ToNonZero <- data.frame(i = i, lambda = fit$lambda[j], j = j)
  j <- j - 1L
  ToZero <- data.frame(i = i, lambda = fit$lambda[j], j = j)[length(i):1, ]
  list(ToZero = ToZero, ToNonZero = ToNonZero)
}

将其应用于您安装的 model:

ScanPath(fit)
#$ToZero
#  i     lambda  j
#3 1 0.02211941 23
#2 2 0.03522036 18
#1 3 0.17126258  1
#
#$ToNonZero
#  i     lambda  j
#1 3 0.15604809  2
#2 2 0.03209148 19
#3 1 0.02015439 24

ToZero的解读

随着lambda增加,变量 1、2、3 依次清零。

  • 变量 1 在 lambda = 0.02211941 处归零,这是fit$lambda中的第 23 个值;

  • 变量 2 在 lambda = 0.03522036 处归零,这是fit$lambda中的第 18 个值;

  • 变量 3 在 lambda = 0.17126258 处归零,这是fit$lambda中的第一个值。

ToNonZero的解释

随着lambda减小,变量 3、2、1 依次出现。

  • 变量 3 出现在 lambda = 0.15604809, fit$lambda中的第二个值;

  • 变量 2 出现在 lambda = 0.03209148, fit$lambda中的第 19 个值;

  • 变量 1 显示在 lambda = 0.02015439,即fit$lambda中的第 24 个值。

请记住: fit$lambda正在减少。


你能再解释一下吗? 例如, ij是什么意思? @i@p是什么意思?

@i@pfit$beta的存储格式有关,它是一个“Csparse”矩阵。 你可以忽略这部分。 用几句话来解释这一点并不容易。

生成的ToZeroToNonZero中的ij是可以在fit$beta上使用的行和列索引。 本质上, i是自变量的 ID, j是 lambda 的 ID。

为了进一步解释这些指标,以变量 2 为例。 它在j = 18 处变为 0,在j = 19 处变为非零。您可以验证这一点:

fit$beta[2, 1:18]
## all zeros

fit$beta[2, 19:ncol(fit$beta)]
## all non-zeros

ToZeroToNonZero中的lambda列只不过是fit$lambda[j]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM