这是我的代码:
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?
答案 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创建