我有一些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分割生成一组索引。所以我很困惑为什么我会收到这条消息。
答案 0 :(得分:5)
trainControl
不会生成索引,它可以将所有参数传递给您正在训练的每个模型。
当我们搜索有关错误的github问题时,我们可以找到this particular issue。
您需要确保每个型号都与EXACT相同 重新取样褶皱。 caretEnsemble通过合并构建整体 每个交叉验证折叠的测试集合,您将 如果每个折叠中有不同的观察值,则会得到不正确的结果。
在适合模型之前,您需要构建一个trainControl 对象,并手动设置该对象中的索引。
E.g。
myControl <- trainControl(index=createFolds(y, 10))
。我们正在研究处理的caretEnsemble接口 为您构建重采样策略,然后拟合多个 使用这些重新采样的模型,但尚未完成。
重申一下,检查是有原因的。你需要设置 trainControl中的index参数,并将EXACT SAME索引传递给 你想要合奏的每个模特。
那么这意味着当你指定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")