[英]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
正在减少。
你能再解释一下吗? 例如,
i
和j
是什么意思?@i
和@p
是什么意思?
@i
和@p
与fit$beta
的存储格式有关,它是一个“Csparse”矩阵。 你可以忽略这部分。 用几句话来解释这一点并不容易。
生成的ToZero
和ToNonZero
中的i
和j
是可以在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
ToZero
和ToNonZero
中的lambda
列只不过是fit$lambda[j]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.