首页 文章

caret:结合createResample和groupKFold

提问于
浏览
1

我想用 caret 进行自定义采样 . 我的规格如下:我每天有1次观察,我的分组因子是月份(12个值);所以在第一步中我创建了12个重新采样,在训练中有11个月(11 * 30分),在测试中有1个(30分) . 这样我总共可以获得12个重采样 .

但这对我来说还不够,我想通过添加一些每个分区的训练点的引导来使它变得更复杂一些 . 因此,我不会在Resample01中获得11 * 30点,而是会有这些330点的几个自举重采样 . 所以最后,我想要很多重新采样,但是在训练集中从未有过几个月 .

如何在 train 的调用中指定这个?我尝试了什么:

library(caret)
x = rep(1:12, each=30)
folds = groupKFold(x, k=12)
folds2 = lapply(folds, createResample, times=10)

但这是错误的,因为1 / i得到一个嵌套列表,2 /初始索引在第二步丢失 .
enter image description here

感谢您的帮助(如果您认为它是XY pb,请不要犹豫,告诉我)

1 回答

  • 1

    我相信这会解决你的问题

    library(caret)
    x <- rep(1:12, each = 30)
    folds <- groupKFold(x, k = 12)
    

    folds 中为每个组的嵌套列表中提供10个引导复制 - 这解决了丢失的索引问题 .

    folds2 <- lapply(folds, function(x) lapply(1:10, function(i) sample(x, size = length(x), replace = TRUE)))
    

    将嵌套列表转换为一维列表 - 这解决了嵌套列表问题 .

    folds2 <- unlist(folds2 , recursive = FALSE, use.names = TRUE)
    

    它有用吗?

    df <- data.frame(y = rnorm(360), x = rnorm(360))
    
    lm_formula <- train(
      y ~ ., df,
      method = "lm",
      trControl = trainControl(method = "boot" , index = folds2)
    )
    

    看起来像它 .

    唯一的问题可能是每个重采样的预期 indexOut ,在该示例中,折叠中不存在的所有索引都用作测试 . 如果我理解你想在所持有的月份进行测试,而不是在所有举出的样品上进行测试 . 解决这个问题:

    folds_out <- lapply(folds, function(x) setdiff(1:360, x))
    folds_out <- rep(folds_out, each = 10)
    names(folds_out) <- names(folds2)
    
    lm_formula <- train(
      y ~ ., df,
      method = "lm",
      trControl = trainControl(method = "boot" , index = folds2, indexOut = folds_out)
    )
    

相关问题