R caret训练glmnet最终模型的lambda值与指定值不符

我在使用caret包来调整glmnet逻辑回归模型的参数。虽然最佳调整得到的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.0143845model$finalModel$lambdaOpt# [1] 0.0143845model$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.0008927408model$finalModel$lambdaOpt %in% lambda.seq# [1] TRUE

最终模型的最优lambda值也不在该模型据称使用的lambda列表中:

model$finalModel$lambdaOpt %in% model$finalModel$lambda# [1] FALSE

这些lambda值的差异是如何解释的?


回答:

最终模型基本上是在使用重采样技术优化alphalambda之后,使用你的整个数据集重新拟合的模型。

如果你打印model$finalModel$call,你会看到调用的命令(为了简短,省略了x, y结构):

    Call:  glmnet(x, y, family = "binomial", alpha = 1)

在这里,alpha被设置(如果你设置了一个序列,它将是找到的最佳alpha),但没有指定lambda来训练,因此会根据你的数据自动生成一个序列,并拟合模型。然后它使用lambdaOpt(以及你提供的序列的其余部分)在相同的训练集上进行预测。请查看glmnet小册子,了解如何在训练后指定不同的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列表以及在整个训练集上使用每个lambda的性能:

 alpha       lambda  Accuracy      Kappa AccuracySD    KappaSD1      1 1.000000e-05 0.5698940 0.15166891 0.09061320 0.171335242      1 1.832981e-05 0.5698940 0.15166891 0.09061320 0.171335243      1 3.359818e-05 0.5698940 0.15166891 0.09061320 0.171335244      1 6.158482e-05 0.5698940 0.15166891 0.09061320 0.171335245      1 1.128838e-04 0.5698940 0.15166891 0.09061320 0.171335246      1 2.069138e-04 0.5698940 0.15166891 0.09061320 0.171335247      1 3.792690e-04 0.5698940 0.15166891 0.09061320 0.171335248      1 6.951928e-04 0.5698940 0.15166891 0.09061320 0.171335249      1 1.274275e-03 0.5675708 0.14690433 0.09071728 0.1708566510     1 2.335721e-03 0.5643334 0.14059590 0.09153010 0.1720403611     1 4.281332e-03 0.5629588 0.13822063 0.09403553 0.1771544112     1 7.847600e-03 0.5694974 0.15221600 0.08791315 0.1643392213     1 1.438450e-02 0.5700431 0.15448347 0.08864353 0.1650933214     1 2.636651e-02 0.5695053 0.15189752 0.08113581 0.1518461915     1 4.832930e-02 0.5635977 0.14112303 0.05833646 0.1161722616     1 8.858668e-02 0.5305835 0.08983718 0.08116759 0.1475230717     1 1.623777e-01 0.4800871 0.01124082 0.05827521 0.0571529818     1 2.976351e-01 0.4725241 0.00000000 0.04488500 0.0000000019     1 5.455595e-01 0.4725241 0.00000000 0.04488500 0.0000000020     1 1.000000e+00 0.4725241 0.00000000 0.04488500 0.00000000

总结caret+glmnet中发生的事情:

  1. 使用你提供的tuneGrid中的重采样技术优化alphalambda

  2. 使用最优alpha整个训练集上重新拟合模型;

  3. 使用在步骤1中找到的lambdaOpt以及tuneGrid中的其他lambda序列,在整个训练集上进行预测。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注