R caret模型调优结果不一致

今天在使用caret包进行模型调优时,我遇到了这种奇怪的行为:给定一组特定的调优参数组合T*,与T*相关联的度量值(即Cohen的K)如果单独评估T*或作为可能组合网格的一部分评估时会发生变化。以下是使用caret与gbm包接口的实际例子。

# 加载库和数据
library(caret)
data<-read.csv("mydata.csv")
data$target<-as.factor(data$target)
# 数据可从https://www.dropbox.com/s/1bglmqd14g840j1/mydata.csv?dl=0获取

过程1:单独评估T*

# 定义5折交叉验证作为验证设置
fitControl <- trainControl(method = "cv",number = 5)
# 定义本例中T*的调优参数组合
gbmGrid <- expand.grid(.interaction.depth = 1,                   .n.trees = 1000,                   .shrinkage = 0.1, .n.minobsinnode=1)
# 使用T*作为模型参数和K作为评分度量来拟合gbm
set.seed(825)
gbmFit1 <- train(target ~ ., data = data,             method = "gbm",             distribution="adaboost",             trControl = fitControl,             tuneGrid=gbmGrid,             verbose=F,             metric="Kappa")
# 结果显示T*与Kappa = 0.47相关联。记住这个结果和混淆矩阵。
testPred<-predict(gbmFit1, newdata = data)
confusionMatrix(testPred, data$target) # 输出选择
Confusion Matrix and Statistics           Reference
Prediction   0   1         0 832  34         1   0  16
Kappa : 0.4703

过程2:与其他调优配置一起评估T*

这里与过程1相同,唯一的区别是考虑了几组调优参数{T}的组合:

# 注意原始的T*包含在{T}中!
gbmGrid2 <- expand.grid(.interaction.depth = 1,                   .n.trees = seq(100,1000,by=100),                   .shrinkage = 0.1, .n.minobsinnode=1)
# 拟合gbm
set.seed(825)
gbmFit2 <- train(target ~ ., data = data,             method = "gbm",             distribution="adaboost",             trControl = fitControl,             tuneGrid=gbmGrid2,             verbose=F,             metric="Kappa")
# Caret应该选择Kappa最高的模型。
# 由于T*包含在{T}中,我期望最佳模型的K >= 0.47
testPred<-predict(gbmFit2, newdata = data)
confusionMatrix(testPred, data$target) # 输出选择
          Reference
Prediction   0   1         0 831  47         1   1   3
Kappa : 0.1036 

结果与我的预期不一致:{T}中的最佳模型得分为K=0.10。考虑到T*的K = 0.47并且它包含在{T}中,这是怎么可能的?此外,根据下面的图表,在过程2中评估的T*的K现在约为0.01。有人知道这是怎么回事吗?我是不是遗漏了什么?

enter image description here


回答:

我从你的数据和代码中得到了 consistent 的重采样结果。

第一个模型的Kappa = 0.00943

gbmFit1$results  interaction.depth n.trees shrinkage n.minobsinnode  Accuracy       Kappa  AccuracySD1                 1    1000       0.1              1 0.9331022 0.009430576     0.004819004    KappaSD1 0.0589132

第二个模型在n.trees = 1000时的结果相同

gbmFit2$results   shrinkage interaction.depth n.minobsinnode n.trees  Accuracy        Kappa  AccuracySD1        0.1                 1              1     100 0.9421803 -0.002075765 0.0024229522        0.1                 1              1     200 0.9387776 -0.008326896 0.0024683513        0.1                 1              1     300 0.9365049 -0.012187900 0.0026258864        0.1                 1              1     400 0.9353749 -0.013950906 0.0030774315        0.1                 1              1     500 0.9353685 -0.013961221 0.0032442016        0.1                 1              1     600 0.9342322 -0.015486214 0.0052026567        0.1                 1              1     700 0.9319658 -0.018574633 0.0070334028        0.1                 1              1     800 0.9319658 -0.018574633 0.0070334029        0.1                 1              1     900 0.9342386  0.010955568 0.00314485010       0.1                 1              1    1000 0.9331022  0.009430576 0.004819004       KappaSD1  0.0046415532  0.0046549723  0.0039787024  0.0048370975  0.0048782596  0.0074698437  0.0094704668  0.0094704669  0.05782533610 0.058913202

请注意,你第二次运行中的最佳模型的n.trees = 900

gbmFit2$bestTune     n.trees interaction.depth shrinkage n.minobsinnode9     900                 1       0.1              1

由于train根据你的度量选择“最佳”模型,你的第二次预测使用了不同的模型(n.trees为900而不是1000)。

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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