我写了一个函数glmnetPath
去做这个。它最初出现在我对最近 Stack Overflow 问答的回答 https://stackoverflow.com/a/73312496/4891738(抱歉,我后来发现了这个问答),但随后以RGitHub 上的包。
## you may need to first install package "remotes" from CRAN
remotes::install_github("ZheyuanLi/solzy")
## Zheyuan Li's R functions on Stack Overflow
library(solzy)
该功能适用于安装的模型glmnet
and cv.glmnet
.
它的计算效率很高。它是完全矢量化的,无需使用循环。它也不会将稀疏系数矩阵转换为稠密矩阵进行处理。
它提供了非常丰富的系数路径摘要。这是一个可重现的演示示例。
library(glmnet)
library(solzy)
set.seed(42)
x <- matrix(rnorm(100 * 20), 100, 20)
y <- rnorm(100)
fit <- glmnet(x, y)
ans <- glmnetPath(fit)
## Try this if you want. It also works!!
## cvfit <- cv.glmnet(x, y)
## glmnetPath(cvfit)
所结果的ans
是 3 个数据框的列表:enter
, leave
and ignore
.
解读enter
As lambda
减少,变量(参见i
对于数字 ID 和var
对于变量名称)依次输入模型(参见ord
对于订单)。相应的lambda
因为该事件是fit$lambda[j]
.
ans$enter
# i j ord var lambda
#1 2 2 1 V2 0.16479873
#2 4 2 1 V4 0.16479873
#3 13 4 2 V13 0.13681880
#4 9 8 3 V9 0.09430389
#5 11 9 4 V11 0.08592619
#6 15 9 4 V15 0.08592619
#7 7 11 5 V7 0.07133744
#8 18 11 5 V18 0.07133744
#9 20 12 6 V20 0.06500001
#10 5 13 7 V5 0.05922559
#11 16 13 7 V16 0.05922559
#12 17 14 8 V17 0.05396415
#13 6 16 9 V6 0.04480199
#14 3 17 10 V3 0.04082190
#15 10 18 11 V10 0.03719540
#16 19 19 12 V19 0.03389106
#17 1 22 13 V1 0.02563735
#18 12 26 14 V12 0.01767083
#19 14 26 14 V14 0.01767083
解读leave
As lambda
增加,变量(参见i
对于数字 ID 和var
对于变量名)依次离开模型(参见ord
对于订单)。相应的lambda
因为该事件是fit$lambda[j]
.
ans$leave
# i j ord var lambda
#1 14 25 1 V14 0.01939371
#2 12 25 1 V12 0.01939371
#3 1 21 2 V1 0.02813695
#4 19 18 3 V19 0.03719540
#5 10 17 4 V10 0.04082190
#6 3 16 5 V3 0.04480199
#7 6 15 6 V6 0.04917013
#8 17 13 7 V17 0.05922559
#9 16 12 8 V16 0.06500001
#10 5 12 8 V5 0.06500001
#11 20 11 9 V20 0.07133744
#12 18 10 10 V18 0.07829275
#13 7 10 10 V7 0.07829275
#14 15 8 11 V15 0.09430389
#15 11 8 11 V11 0.09430389
#16 9 7 12 V9 0.10349840
#17 13 3 13 V13 0.15015846
#18 4 1 14 V4 0.18086640
#19 2 1 14 V2 0.18086640
解读ignored
如果非空,它会列出从未进入模型的变量。也就是说,它们实际上被忽略了。是的,这可能会发生!
ans$ignored
# i var
#1 8 V8
Notes:
-
fit$lambda
正在减少,所以j
是按升序排列的enter
但按降序排列leave
.
-
多个变量可以同时进入或离开模型!这ord
专栏对此提供了非常丰富的信息。例如,变量 2 和 4 同时进入模型。
最后,让我附上由glmnet:
plot(fit, label = TRUE)
plot(fit, xvar = "lambda", label = TRUE)