【问题标题】:Cross-validation predictions from caret in assigned to different folds插入符号的交叉验证预测分配给不同的折叠
【发布时间】:2018-01-26 21:54:20
【问题描述】:

我想知道为什么来自“Fold1”的预测实际上是来自我预定义折叠中的第二个折叠的预测。我附上一个例子来说明我的意思。

# load the library
library(caret)
# load the cars dataset
data(cars)
# define folds
cv_folds <- createFolds(cars$Price, k = 5, list = TRUE, returnTrain = TRUE)
# define training control
train_control <- trainControl(method="cv", index = cv_folds, savePredictions = 'final')
# fix the parameters of the algorithm
# train the model
model <- caret::train(Price~., data=cars, trControl=train_control, method="gbm", verbose = F)

model$pred$rowIndex[model$pred$Resample == 'Fold1'] %in% cv_folds[[2]]

【问题讨论】:

  • 你能附上一些输出数据吗?也许平均交叉验证分数作为第一个索引返回?

标签: r cross-validation r-caret


【解决方案1】:

'Fold1' 的重采样数据是不在cv_folds[[1]] 中的记录。这些记录包含在cv_folds 2-5 中。这是正确的,因为您正在运行 5 折交叉验证。重新采样折叠 1 是针对在折叠 2-5 上训练模型进行测试的。重采样折叠 2 是针对折叠 1、3-5 等上的训练进行测试的。

总之:Fold1 中的预测是在 cv_folds 2-5 上训练模型的测试预测。

编辑:根据评论

所有需要的信息都在 model$pred 表中。我添加了一些代码以进行澄清:

model$pred %>% 
  select(rowIndex, pred, Resample) %>%
  rename(predection = pred, holdout = Resample) %>% 
  mutate(trained_on = case_when(holdout == "Fold1" ~ "Folds 2, 3, 4, 5",
                                holdout == "Fold2" ~ "Folds 1, 3, 4, 5", 
                                holdout == "Fold3" ~ "Folds 1, 2, 4, 5", 
                                holdout == "Fold4" ~ "Folds 1, 2, 3, 5", 
                                holdout == "Fold5" ~ "Folds 1, 2, 3, 4"))

  rowIndex predection holdout       trained_on
1      610   13922.60   Fold2 Folds 1, 3, 4, 5
2      623   38418.83   Fold2 Folds 1, 3, 4, 5
3      604   12383.55   Fold2 Folds 1, 3, 4, 5
4      607   15040.07   Fold2 Folds 1, 3, 4, 5
5       95   33549.40   Fold2 Folds 1, 3, 4, 5
6      624   40357.35   Fold2 Folds 1, 3, 4, 5

基本上,进一步堆叠预测所需的是 model$pred 表中的 pred 和 rowIndex 列。

rowIndex 引用原始数据中的行。所以 rowIndex 610 指的是汽车数据集中的记录 610。您可以比较 obs 中的数据,即汽车数据集中 Price 列的值。

【讨论】:

  • 我感兴趣的是获得关于保持折叠的预测以进一步堆叠。所以我想知道当模型在折叠 2-5 上训练时对折叠 1 的预测。这就是为什么我认为来自'Fold1' 的重采样数据的行索引应该与来自cv_folds[[1]] 的行索引匹配。这个逻辑有什么缺陷吗?
  • @abu 如果您对堆叠 mlr 库感兴趣,那么它具有非常好的包装器。这是tutorial - 下载链接。在主题上,cv_folds[[1]] 具有除 Fold1 之外的所有行索引,因为 Fold1 是测试,cv_folds[[1]] 是训练。
  • 当然,没错。我应该早点看到的!谢谢
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2018-03-20
  • 2016-12-11
  • 2019-03-18
相关资源
最近更新 更多