r caretEnsemble警告:未在trControl中定义索引

时间:2017-07-18 01:05:58

标签: r cross-validation r-caret ensemble-learning

我有一些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对象,定义了一个交叉验证结构(3倍5倍交叉验证)将为cv分割生成一组索引。所以我很困惑为什么我会收到这条消息。

1 个答案:

答案 0 :(得分:5)

默认情况下,

trainControl不会生成索引,它可以将所有参数传递给您正在训练的每个模型。

当我们搜索有关错误的github问题时,我们可以找到this particular issue

  

您需要确保每个型号都与EXACT相同   重新取样褶皱。 caretEnsemble通过合并构建整体   每个交叉验证折叠的测试集合,您将   如果每个折叠中有不同的观察值,则会得到不正确的结果。

     

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

     

E.g。 myControl <- trainControl(index=createFolds(y, 10))

     

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

     

重申一下,检查是有原因的。你需要设置   trainControl中的index参数,并将EXACT SAME索引传递给   你想要合奏的每个模特。

那么这意味着当你指定number = 5repeats = 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")