插入符号:结合createResample和groupKFold

时间:2018-01-07 23:45:04

标签: r cross-validation r-caret

我想用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 个答案:

答案 0 :(得分: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)
)