2016-11-12 66 views
1

我想知道如何只使用了R中插入符号包请参见下面的示例分层K-CV编程:这是分层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中元素的补充?

+2

createFolds默认分层折叠 –

回答

1

我发现这很有趣,因为我一直在使用caret,并且从未想过关于indexindexOut的这个直接问题。 ?trainControl下的帮助文档说indexOut如果NULL将包含未包含在index中的唯一一组样本,但未反过来说明。所以我挖掘到train.default以了解发生了什么。当你分配

fitControl = trainControl(..., indexOut = ...) 

你可以自己断言fitControl$index == NULL。在train.default的代码中,有一行(函数定义的第109行)检查此条件,然后使用(对于“cv”)createFolds和参数returnTrain = TRUE。它没有检查你为indexOut设置了什么。

对于此特定场景,在train.default内似乎没有其他与indexindexOut相关的代码。这表明没有任何保证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以获得所需的效果。