这个分层的k-CV是否带有插入符号?

时间:2016-11-12 21:41:37

标签: r machine-learning r-caret

我想知道如何仅使用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中元素的补充?

1 个答案:

答案 0 :(得分:1)

我发现这很有意思,因为我一直使用caret,并且从未考虑过有关indexindexOut的直接问题。 ?trainControl下的帮助文档说indexOut NULL如果index将包含train.default中未包含的唯一样本集,但不会反过来说明。所以我挖到fitControl = trainControl(..., indexOut = ...) 以了解发生了什么。分配

fitControl$index == NULL

你可以自己断言train.default。在createFolds的代码中,有一行(函数定义的第109行)检查此条件,然后使用(#34; cv&#34;)returnTrain = TRUE参数{{1} }。它会在不检查您为indexOut设置的内容的情况下执行此操作。

对于此特定情况,index内似乎没有与indexOuttrain.default相关的其他代码。这表明没有任何保证index$Fold01indexOut$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

来自在问题中运行您的确切代码。因此indexindexOut似乎不是彼此的完美补充。

我建议最安全的方法是指定index而非indexOut以获得预期的效果。