使用Caret选择交叉验证折叠内的特征

时间:2017-08-03 18:41:15

标签: r cross-validation r-caret feature-selection

在插入符号包中,有没有办法在trainControl的交叉验证方案的折叠中使用递归特征消除函数,该函数传递给使用调整网格的列车函数?

我喜欢递归特征消除功能,但它确实应该应用于交叉验证中的训练折叠,然后在保持折叠上进行测试。

我已经使用了许多不同的方法来做到这一点,但没有一个是完美的。例如,我可以创建自己的交叉验证折叠并使用method =' none'运行trainControl。但是那不能在列车中使用训练网格(需要一个评估小组)。我也可以制作我自己的cv折叠,并在trainControl中使用method =' cv'(我可以在这里使用调整网格),但最好的调整是在由此生成的保留样本上选择的。 trainControl hold-out,而非我的坚持。

有没有办法告诉插入符号在预先指定的保持折叠(在消除特征之前拍摄的那个)上使用调整网格评估模型?

在我的工作流程中,我正在使用自己的调整网格测试几种不同的模型类型。我非常喜欢有部分插入符号,我花了很多时间在这上面所以我想使用它,但如果我不能使用它,这是一个交易破坏者。我对任何建议持开放态度!

提前致谢 -

解: 我的解决方案可能不是最有效的,但似乎有效。我使用以下信息进行了交叉验证折叠:https://stats.stackexchange.com/questions/61090/how-to-split-a-data-set-to-do-10-fold-cross-validation。 使用createFolds(插入符函数)不会创建相等的折叠,所以我选择了第二个解决方案。看起来你可以用插入符号的分层抽样来做,但我还没有探索过。

此代码在每个cv折叠中使用自举方法,并预测每次迭代的保持折叠中的所有观察。

  ## Make the folds for the cross validation
  folds <- cut(seq(1,nrow(data)), breaks=10, labels=FALSE) %>%
    sample(., length(.), replace= F)

  for(f in 1:10) { 

    testIndexes <- which(folds == f,arr.ind=TRUE)
    trainIndexes <- which(folds != f, arr.ind= T)

    trainIndexList <- replicate(500, sample(trainIndexes, length(trainIndexes), replace = T), simplify = F)
    testIndexList <- replicate(500, testIndexes, simplify = F)

    testData <- data[testIndexes, ]
    trainData <- data[-testIndexes, ]

    ## Make the train control object
    train_control <- trainControl(method = 'boot', 
                                  numbe r= 1,
                                  summaryFunction = modfun,
                                  preProcOptions = c('center', 'scale', newdata= testData),
                                  index = trainIndexList,
                                  indexOut = testIndexList,
                                  classProbs = T,
                                  savePredictions = T)

  ## Feature Selection
    ## Make the control for the recursive feature elimination
  rfe_control <- rfeControl(functions = rfFuncs, method = 'cv', number= 10)

    ## Generate the data frame based on feature selection
  fs_results <- rfe(trainData[,2:ncol(trainData)],
                    trainData[,'target'],
                    sizes=c(2:ncol(trainData)),
                    rfeControl= rfe_control)

  use_features <- c('target', predictors(fs_results))

  features <- predictors(fs_results) %>% data.frame(features= .) %>% mutate(fold= f) %>%
    rbind(features, .) ## Specify features as a data frame ahead of time

  data_min <- data[, use_features] %>% data.frame()

...(建模代码,包括列车功能和所需输出)......

}

我还没有试过做一个lapply而不是for循环。我很感激任何提高效率的建议。

0 个答案:

没有答案