插入符号:组合 createResample 和 groupKFold

caret: combine createResample and groupKFold

我想用 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/ 我得到了一个嵌套列表,2/ 初始索引在第二步丢失了。

感谢您的帮助(如果您认为它是 XY pb,请随时告诉我)

我相信这会解决您的问题

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

folds 中的每个组在嵌套列表中提供 10 bootstrap 个副本 - 这解决了丢失索引的问题。

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)
)