我想用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 /初始索引在第二步丢失。
感谢您的帮助(如果您认为它是XY pb,请不要犹豫告诉我)
答案 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)
)