如何对不同行数的时序任务使用遵守时间顺序的自定义重采样做基准测试
问题原因
你收到的报错核心是传入benchmark_grid()的resampling_backtest是已实例化的重采样对象,它绑定了初始生成时所用任务的行数和索引规则,无法直接适配其他行数不同的任务。同时你自定义的按行号切分的逻辑,也会因为不同任务的行号对应时间不同,出现时序切分错误。
推荐解决方案:使用内置滚动原点重采样
你的需求完全匹配mlr3内置的rolling_origin(滚动原点)重采样,不需要自定义实现,还能自动适配你给每个任务设置的Date顺序列,不会出现行号对应时间错乱的问题:
# 定义未实例化的滚动原点重采样,参数和你自定义的逻辑完全对齐 resampling_rolling = rsmp("rolling_origin", initial = 30, # 初始训练集长度为30 horizon = 1, # 每次测试集长度为1 gap = 0, # 训练集和测试集之间无时间间隔 fixed = TRUE # 训练集持续累积,而非滑动窗口 ) # 直接传入未实例化的重采样即可,benchmark_grid会自动给每个任务单独实例化适配 design = benchmark_grid( tasks = list_of_tasks, learners = list_of_learners, resamplings = resampling_rolling )
备选方案:自定义重采样配对传入
如果你一定要保留自己写的切分逻辑,可以按以下步骤实现:
- 封装生成自定义重采样的函数
- 给每个任务单独生成对应的重采样
- 调用
benchmark_grid()时设置paired = TRUE,让任务和重采样一一配对,不交叉组合
# 封装自定义重采样生成函数 get_backtest_resampling = function(task) { resampling_backtest = rsmp("custom") train_sets = list(1:30) test_sets = list(31) for (testmonth in (32:task$nrow)) { train_sets <- append(train_sets, list(c(1:(testmonth-1)))) test_sets <- append(test_sets, list(c(testmonth))) } resampling_backtest$instantiate(task, train_sets, test_sets) return(resampling_backtest) } # 为每个任务生成对应的重采样 list_of_resamplings = lapply(list_of_tasks, get_backtest_resampling) # 生成基准测试设计,paired=TRUE表示任务和重采样一一配对 design = benchmark_grid( tasks = list_of_tasks, learners = list_of_learners, resamplings = list_of_resamplings, paired = TRUE )
内容的提问来源于stack exchange,提问作者ds_col
相关产品推荐
相关产品推荐

