【问题标题】:caret: combine createResample and groupKFold插入符号:结合 createResample 和 groupKFold
【发布时间】:2018-06-16 23:29:15
【问题描述】:

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

但这对我来说还不够,我想通过为每个分区的训练点添加一些引导来使其更复杂一些。因此,不是在 Resample01 中有 11*30 个点,而是对这 330 个点进行几个自举重采样。 所以最后,我想要很多重采样,但其中一个月份 NEVER 在训练集中。

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

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

但这是错误的,因为 1/ 我得到了一个嵌套列表,2/ 初始索引在第二步中丢失了。

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

【问题讨论】:

  • 我最初建议purrr::map_df(folds, createResample, times = 10, .id = "id"),但这不适用于caret::trainControl()
  • @Phil 谢谢你的帮助,我很高兴发现这个map 函数

标签: r cross-validation r-caret


【解决方案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)
)

【讨论】:

  • 感谢您的回答@missuse。你说得对,我确实希望测试集中只有第 12 个月。顺便说一句,很好地使用setdiff。如果我做对了,插入符号中没有内置函数可以实现我想要的。
  • @agenis 很高兴为您提供帮助。我不确定是否有内置的插入符号功能,据我所知,此功能不是内置的,但您可能想检查 createTimeSlicestrainControl(method = "timeslice"... 对我来说,它们似乎能够形成集合,所以只能预测未来的数据是可能的,我从未进行过认真的 ts 分析,所以我在这方面缺乏知识。同样从我所见,您的示例并不严格属于 ts 分析,因为您也想在以后的观察中预测以前的时间。
  • 你说得对,我不在时间序列框架中,我在这里不使用特定于时间序列的模型。
猜你喜欢
  • 2018-06-21
  • 2019-06-02
  • 2020-12-19
  • 2018-01-09
  • 2017-02-03
  • 1970-01-01
  • 2023-03-11
  • 2013-06-02
  • 2016-01-30
相关资源
最近更新 更多