我该如何获得Lasso模型的系数?

时间:2017-01-23 00:47:38

标签: r r-caret

这是我的代码:

library(MASS)
library(caret)
df <- Boston
set.seed(3721)
cv.10.folds <- createFolds(df$medv, k = 10)
lasso_grid <- expand.grid(fraction=c(1,0.1,0.01,0.001))
lasso <- train(medv ~ ., 
               data = df, 
               preProcess = c("center", "scale"),
               method ='lasso',
               tuneGrid = lasso_grid,
               trControl= trainControl(method = "cv", 
                                       number = 10, 
                                       index = cv.10.folds))  

lasso

与线性模型不同,我无法从摘要(套索)中找到Lasso回归模型的系数。我该怎么办?或者也许我可以使用glmnet?

2 个答案:

答案 0 :(得分:2)

使用24进行训练时,elasticnet的enet称为:

4

小插图写道:

LARS-EN算法可计算完整的弹性网解 同时对同一收缩参数的所有值 计算成本最小二乘拟合

method="lasso"下,您拥有与lasso$finalModel$call elasticnet::enet(x = as.matrix(x), y = y, lambda = 0) 下的L1范数的16个值相对应的所有16组系数的系数:

lasso$finalModel$beta.pure

您也可以使用预测来查看它:

lasso$finalModel$L1norm

通过插入符号调整的超参数是最大L1范数的分数,因此在您提供的结果中,它将为1,即最大值:

length(lasso$finalModel$L1norm)
[1] 16

dim(lasso$finalModel$beta.pure)
[1] 16 13

要获取最佳分数的系数,请执行以下操作:

predict(lasso$finalModel,type="coef")
$s
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16

$fraction
 [1] 0.00000000 0.06666667 0.13333333 0.20000000 0.26666667 0.33333333
 [7] 0.40000000 0.46666667 0.53333333 0.60000000 0.66666667 0.73333333
[13] 0.80000000 0.86666667 0.93333333 1.00000000

$mode
[1] "step"

$coefficients
          crim        zn       indus      chas        nox       rm        age
0   0.00000000 0.0000000  0.00000000 0.0000000  0.0000000 0.000000 0.00000000
1   0.00000000 0.0000000  0.00000000 0.0000000  0.0000000 0.000000 0.00000000
2   0.00000000 0.0000000  0.00000000 0.0000000  0.0000000 1.677765 0.00000000
3   0.00000000 0.0000000  0.00000000 0.0000000  0.0000000 2.571071 0.00000000
4   0.00000000 0.0000000  0.00000000 0.0000000  0.0000000 2.716138 0.00000000
5   0.00000000 0.0000000  0.00000000 0.2586083  0.0000000 2.885615 0.00000000
6  -0.05232643 0.0000000  0.00000000 0.3543411  0.0000000 2.953605 0.00000000
7  -0.13286554 0.0000000  0.00000000 0.4095229  0.0000000 2.984026 0.00000000
8  -0.21665925 0.0000000  0.00000000 0.5196189 -0.5933941 3.003512 0.00000000
9  -0.32168140 0.3326103  0.00000000 0.6044308 -1.0246080 2.973693 0.00000000
10 -0.33568474 0.3771889 -0.02165730 0.6165190 -1.0728128 2.967696 0.00000000
11 -0.42820289 0.4522827 -0.09212253 0.6407298 -1.2474934 2.932427 0.00000000
12 -0.62605363 0.7005114  0.00000000 0.6574277 -1.5655601 2.832726 0.00000000
13 -0.88747102 1.0150162  0.00000000 0.6856705 -1.9476465 2.694820 0.00000000
14 -0.91679342 1.0613165  0.09956489 0.6837833 -2.0217269 2.684401 0.00000000
15 -0.92906457 1.0826390  0.14103943 0.6824144 -2.0587536 2.676877 0.01948534

答案 1 :(得分:0)

我注意到,如果为超参数调整定义了自己的网格,则使用上述方法可能会出现问题。 Predict.enet似乎强加了自己的网格,该网格通常不对应于为train()定义的网格。

在这种情况下,可以将“模式”参数设置为“分数”,并提供从train()输出到“ s”参数的分数矢量:

predict(lasso$finalModel, type = "coef", mode = "fraction", s = lasso$bestTune)

“ S”也可以是由train()确定的最佳调整参数:

predict(lasso$finalModel, type = "coef", mode = "fraction", s = as.numeric(lasso$bestTune))

reprex package(v0.3.0)于2020-09-11创建