R caret train glmnet 最终模型 lambda 值与指定不符
Posted
技术标签:
【中文标题】R caret train glmnet 最终模型 lambda 值与指定不符【英文标题】:R caret train glmnet final model lambda values not as specified 【发布时间】:2014-09-13 21:31:47 【问题描述】:我正在使用 caret
包来调整 glmnet 逻辑回归模型。虽然 best tune 中的 lambda
值是我在 tuneGrid
中指定的值之一,但最终模型的 lambda
值完全不同:
require(caret)
set.seed(1)
x <- matrix(runif(1000), nrow = 100)
y <- factor(rbinom(100, 1, 0.5))
lambda.seq <- exp(seq(log(1e-5), log(1e0), length.out = 20))
model <- train(x, y,
method ="glmnet",
family = "binomial",
tuneGrid = expand.grid(alpha = 1,
lambda = lambda.seq))
model$bestTune
# alpha lambda
# 13 1 0.0143845
model$finalModel$lambdaOpt
# [1] 0.0143845
model$finalModel$lambda
# [1] 0.1236344527 0.1126511087 0.1026434947 0.0935249295 0.0852164325 0.0776460395
# [7] 0.0707481794 0.0644631061 0.0587363814 0.0535184032 0.0487639757 0.0444319185
# [13] 0.0404847094 0.0368881594 0.0336111170 0.0306251980 0.0279045398 0.0254255774
# [19] 0.0231668392 0.0211087610 0.0192335169 0.0175248642 0.0159680036 0.0145494502
# [25] 0.0132569171 0.0120792091 0.0110061255 0.0100283716 0.0091374787 0.0083257303
# [31] 0.0075860954 0.0069121676 0.0062981097 0.0057386030 0.0052288013 0.0047642890
# [37] 0.0043410427 0.0039553964 0.0036040099 0.0032838396 0.0029921123 0.0027263013
# [43] 0.0024841042 0.0022634233 0.0020623470 0.0018791337 0.0017121967 0.0015600899
# [49] 0.0014214958 0.0012952140 0.0011801508 0.0010753094 0.0009797819 0.0008927408
model$finalModel$lambdaOpt %in% lambda.seq
# [1] TRUE
最终模型的最优值lambda
也不在同一模型应该使用的lambda
列表中:
model$finalModel$lambdaOpt %in% model$finalModel$lambda
# [1] FALSE
是什么解释了lambda
中的这些差异?
【问题讨论】:
【参考方案1】:在使用重采样技术优化 alpha
和 lambda
之后,最终模型基本上是对您的整个数据集的改装。
如果您打印model$finalModel$call
,您会看到正在调用(省略 x, y 结构以求简洁):
Call: glmnet(x, y, family = "binomial", alpha = 1)
这里设置了alpha
(如果您设置了序列,它将是找到的最佳alpha
),但没有设置指定的lambda来训练,因此会根据您的数据和模型已安装。然后,它使用 lambdaOpt
(以及您给出的其余序列)使用相同的训练集进行预测。看看glmnet vignette 以及如何在训练后指定不同的lambda
。
如果你输入:
> names(model$modelInfo)
[1] "label" "library" "type" "parameters" "grid" "loop"
[7] "fit" "predict" "prob" "predictors" "varImp" "levels"
[13] "tags" "sort" "trim"
然后浏览每个部分,您可以看看train
正在做什么。您可以在 model$modelInfo$predict
中看到它如何预测 lambdaOpt
以及您的序列的其余部分。
当您打印model$results
时,您实际上会得到lambda
的列表以及每个人在整个训练集上的表现:
alpha lambda Accuracy Kappa AccuracySD KappaSD
1 1 1.000000e-05 0.5698940 0.15166891 0.09061320 0.17133524
2 1 1.832981e-05 0.5698940 0.15166891 0.09061320 0.17133524
3 1 3.359818e-05 0.5698940 0.15166891 0.09061320 0.17133524
4 1 6.158482e-05 0.5698940 0.15166891 0.09061320 0.17133524
5 1 1.128838e-04 0.5698940 0.15166891 0.09061320 0.17133524
6 1 2.069138e-04 0.5698940 0.15166891 0.09061320 0.17133524
7 1 3.792690e-04 0.5698940 0.15166891 0.09061320 0.17133524
8 1 6.951928e-04 0.5698940 0.15166891 0.09061320 0.17133524
9 1 1.274275e-03 0.5675708 0.14690433 0.09071728 0.17085665
10 1 2.335721e-03 0.5643334 0.14059590 0.09153010 0.17204036
11 1 4.281332e-03 0.5629588 0.13822063 0.09403553 0.17715441
12 1 7.847600e-03 0.5694974 0.15221600 0.08791315 0.16433922
13 1 1.438450e-02 0.5700431 0.15448347 0.08864353 0.16509332
14 1 2.636651e-02 0.5695053 0.15189752 0.08113581 0.15184619
15 1 4.832930e-02 0.5635977 0.14112303 0.05833646 0.11617226
16 1 8.858668e-02 0.5305835 0.08983718 0.08116759 0.14752307
17 1 1.623777e-01 0.4800871 0.01124082 0.05827521 0.05715298
18 1 2.976351e-01 0.4725241 0.00000000 0.04488500 0.00000000
19 1 5.455595e-01 0.4725241 0.00000000 0.04488500 0.00000000
20 1 1.000000e+00 0.4725241 0.00000000 0.04488500 0.00000000
总结 caret+glmnet 中发生的事情:
使用重采样技术在您提供的 tuneGrid 内优化 alpha
和 lambda
;
用最佳 alpha
调整模型,现在在整个训练集上;
使用在 1. 中找到的 lambdaOpt
预测整个训练集,以及 tuneGrid 中的其余 lambda 序列。
【讨论】:
以上是关于R caret train glmnet 最终模型 lambda 值与指定不符的主要内容,如果未能解决你的问题,请参考以下文章
r:来自 glmnet 和 caret 的系数对于相同的 lambda 是不同的
R语言使用caret包对GBM模型进行参数调优实战:Model Training and Parameter Tuning
R语言使用caret包的train函数构建支持向量机SVM模型模型调优自定义设置trainControl函数和tuneLength参数
R语言使用caret包的train函数构建随机森林(random forest)模型模型调优自定义设置trainControl函数和tuneLength参数
R语言使用caret包的train函数构建多元自适应回归样条(MARS)模型查看模型输出结构最优超参数及对应模型评估指标