在插入符号中获取测试数据集的预测以进行 k 折交叉验证

Obtaining predictions on test datasets for k-fold cross validation in caret

我有点困惑插入符号如何在 k 折交叉验证中对测试折进行评分。

我想生成一个数据框或矩阵,其中包含十个测试数据集在 10 折交叉验证中的评分记录。

例如使用鸢尾花数据集训练决策树模型:

install.packages("caret", dependencies=TRUE) 

library(caret)

data(iris)

train_control <- trainControl(method="cv", number=10, savePredictions = TRUE), 

model <- train(Species ~ ., data=iris, trControl=train_control, method="rpart")

model$pred

model$pred 命令列出 450 条记录中十次折叠的预测。

这似乎不对 - model$pred 不应该为十个测试折叠中的 150 条记录 生成预测(1/10 * 150 = 15 条记录每个测试折叠)? 450条记录是如何生成的?

默认情况下,train 迭代 rpart 的复杂性参数 cp 的三个值(参见 ?rpart.control):

library(caret)
data(iris)
train_control <- trainControl(method="cv", number=10, savePredictions = TRUE) 

model <- train(Species ~ ., 
               data=iris, 
               trControl=train_control, 
               method="rpart")
nrow(model$pred)
# [1] 450
length(unique(model$pred$cp))
# [1] 3

您可以更改它,例如通过明确指定 cp=0.05

model <- train(Species ~ ., 
               data=iris, 
               trControl=train_control, 
               method="rpart", 
               tuneGrid = data.frame(cp = 0.05))
nrow(model$pred)
# [1] 150
length(unique(model$pred$cp))
# [1] 1

或者使用 tuneLength=1 而不是默认的 3

model <- train(Species ~ ., 
               data=iris, 
               trControl=train_control, 
               method="rpart", 
               tuneLength = 1)
nrow(model$pred)
# [1] 150
length(unique(model$pred$cp))
# [1] 1