今天在使用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。有人知道这是怎么回事吗?我是不是遗漏了什么?
回答:
我从你的数据和代码中得到了 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)。