我想知道如何仅使用R中的插入符包来编程分层的k-CV。请参阅下面的示例:
library(mlbench)
library(caret)
data(Sonar)
set.seed(998)
inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing <- Sonar[-inTraining,]
folds <- createFolds(factor(training$Class), k = 10, list = TRUE)
fitControl <- trainControl(## 10-fold CV
method = "cv",
indexOut=folds,
savePredictions="all")
set.seed(825)
gbmFit1 <- train(Class ~ ., data = training,
method = "gbm",
trControl = fitControl,
## This last option is actually one
## for gbm() that passes through
verbose = FALSE)
d=gbmFit1$pred
请注意,我并未指定index
,而只指定indexOut
。插入符号是否每次都以IndexOut
的补码训练模型?通过检查d
,我可以看到rowIndex匹配每个折叠的定义,但是如何确认每次训练集是折叠i中元素的补充?
答案 0 :(得分:1)
我发现这很有意思,因为我一直使用caret
,并且从未考虑过有关index
和indexOut
的直接问题。
?trainControl
下的帮助文档说indexOut
NULL
如果index
将包含train.default
中未包含的唯一样本集,但不会反过来说明。所以我挖到fitControl = trainControl(..., indexOut = ...)
以了解发生了什么。分配
fitControl$index == NULL
你可以自己断言train.default
。在createFolds
的代码中,有一行(函数定义的第109行)检查此条件,然后使用(#34; cv&#34;)returnTrain = TRUE
参数{{1} }。它会在不检查您为indexOut
设置的内容的情况下执行此操作。
对于此特定情况,index
内似乎没有与indexOut
和train.default
相关的其他代码。这表明没有任何保证index$Fold01
和indexOut$Fold01
之间没有交集。
我们可以进一步研究这个
intersect(x$control$index$Fold01,x$control$indexOut$Fold01)
## [1] 12 18 33 34 53 58 67 95 109 111 115 120 137 143 156
来自在问题中运行您的确切代码。因此index
和indexOut
似乎不是彼此的完美补充。
我建议最安全的方法是指定index
而非indexOut
以获得预期的效果。