为插入符 CV 创建自定义折叠

Creating Custom Folds For Caret CV

我正在使用 caret 包进行建模和交叉验证

model <- caret::train(mpg  ~ wt
                           + drat
                           + disp
                           + qsec
                           + as.factor(am),
                  data = mtcars,
                  method = "lm",
                  trControl = caret::trainControl(method = "cv",
                                                repeats=5,
                                                returnData =FALSE))

但是,我想向 trainControl 传递一组与我的折叠相关的自定义索引。这可以通过 IndexOut 完成。

model <- caret::train(wt ~  + disp + drat,
                  data = mtcars,     
                  method = "lm",
                   trControl = caret::trainControl(method = "cv",
                                      returnData =FALSE,
                                      index = indicies$train,
                                      indexOut = indicies$test))

我正在苦苦挣扎的是,我只想测试 mtcars.am==0 所在的 mtcars 中的行。因此 createFolds 的使用将不起作用,因为您无法添加条件。有谁知道允许将行索引到 K 折中的任何其他函数,其中可以在创建 indicies$test 时添加 mtcars.am==0 的标准?

我认为这应该可行。只需为索引提供所需的行索引即可。

index = list(which(mtcars$am == 0))

model <- caret::train(
    wt ~  +disp + drat,
    data = mtcars,
    method = "lm",
    trControl = caret::trainControl(
        method = "cv",
        returnData = FALSE,
        index = index
    )
)

index 参数是一个列表,因此您可以通过在索引中创建多个嵌套列表来为该列表提供任意数量的迭代。

感谢您的帮助。我最终通过修改 createFolds 的输出到达那里,而不是最好的例子 mtcars 因为它是一个很小的数据集,但你明白了:

folds<-caret::createFolds(mtcars,k=2)

indicies<-list()

#Create training folds
indicies$train<-lapply(folds,function(x) which(!1:nrow(mtcars) %in% x))

#Create test folds based output "folds" and with criterion added
indicies$test<-lapply(folds,function(x) which(1:nrow(mtcars) %in% x & mtcars[,"am"]==1))