8

我有一些 r/caret 代码可以将多个交叉验证模型与某些数据相匹配,但我收到一条警告消息,提示我无法找到任何相关信息。这是我应该关心的事情吗?

library(datasets)
library(caret)
library(caretEnsemble)

# load data
data("iris")

# establish cross-validation structure
set.seed(32)
trainControl <- trainControl(method="repeatedcv", number=5, repeats=3, savePredictions=TRUE, search="random")

# fit several (cross-validated) models 
algorithmList <- c('lda',         # Linear Discriminant Analysis 
                   'rpart' ,      # Classification and Regression Trees
                   'svmRadial')   # SVM with RBF Kernel

models <- caretList(Species~., data=iris, trControl=trainControl, methodList=algorithmList)

日志输出:

Warning messages:
1: In trControlCheck(x = trControl, y = target) :
  x$savePredictions == TRUE is depreciated. Setting to 'final' instead.
2: In trControlCheck(x = trControl, y = target) :
  indexes not defined in trControl.  Attempting to set them ourselves, so each model in the ensemble will have the same resampling indexes.

...我认为我的 trainControl 对象定义了一个交叉验证结构(3x 5 折交叉验证)将为 cv 拆分生成一组索引。所以我很困惑为什么我会收到这个消息。

4

1 回答 1

14

trainControl默认情况下不会为您生成索引,它充当将所有参数传递给您正在训练的每个模型的一种方式。

当我们搜索有关错误的 github 问题时,我们可以找到这个特定问题

您需要确保每个模型都适合完全相同的重采样折叠。caretEnsemble 通过将每个交叉验证折叠的测试集合并在一起来构建集成,如果每个折叠都有不同的观察结果,您将得到不正确的结果。

在拟合模型之前,您需要构造一个 trainControl 对象,并手动设置该对象中的索引。

例如myControl <- trainControl(index=createFolds(y, 10))

我们正在开发 caretEnsemble 的接口,该接口为您构建重采样策略,然后使用这些重采样拟合多个模型,但尚未完成。

重申一下,检查是有原因的。您需要在 trainControl 中设置索引参数,并将完全相同的索引传递给您希望集成的每个模型。

所以这意味着当您指定number = 5并且repeats = 3模型实际上并没有为每个折叠的样本获得预定索引时,而是独立地生成它们自己的索引。

因此,为了确保模型在哪些样本属于哪些折叠方面彼此一致,您必须index = createFolds(iris$Species, 5)trainControl对象中指定

# new trainControl object with index specified
trainControl <- trainControl(method = "repeatedcv",
                             number = 5,
                             index = createFolds(iris$Species, 5),
                             repeats = 3,
                             savePredictions = "all",
                             search = "random")
于 2018-04-26T01:47:34.920 回答