You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试集仅含单样本时Tidymodels脚本报错的解决与重采样实现

解决tidymodels自定义数据拆分报错与时间序列滚动重采样问题

一、修复自定义数据拆分(最新1条为测试集)的报错

常见报错原因与解决步骤

  1. 必须按时间维度排序:未按year(或更细粒度时间列)排序会导致测试集并非最新数据,引发后续模型适配的逻辑错误。
  2. 生成tidymodels兼容的拆分对象:直接拆分的数据集无法被tidymodels工作流识别,需转换为rsplit类型对象。

修复后的拆分代码

library(tidymodels)
library(dplyr)

# 假设数据集名为df,包含year列及预测/响应变量
# 第一步:按时间排序(核心操作)
df_sorted <- df %>% arrange(year)

# 第二步:拆分最新1条为测试集
train_df <- df_sorted %>% slice(-n())
test_df <- df_sorted %>% slice(n())

# 第三步:转换为tidymodels兼容的rsplit对象
custom_split <- make_splits(
  splits = list(train = train_df, test = test_df),
  data = df_sorted
)

# 验证拆分结果
custom_split

额外排查要点

  • 检查训练集缺失值:train_df %>% summarise(across(everything(), ~sum(is.na(.))))
  • 确认变量类型匹配模型要求:比如分类模型的响应变量需为因子类型

二、实现非累积滚动预测原点重采样

针对带时间维度的数据,使用rsample包的rolling_origin()函数实现滑动窗口式非累积重采样,设置分析集大小8、评估集大小2:

完整重采样代码

# 确保数据已按时间排序
df_sorted <- df %>% arrange(year)

# 配置非累积滚动重采样
rolling_resamples <- rolling_origin(
  data = df_sorted,
  initial = 8,          # 分析集固定大小
  assess = 2,           # 评估集固定大小
  cumulative = FALSE,   # 非累积滑动窗口模式
  skip = 0              # 每次滑动步长为1,可按需调整
)

# 查看重采样结果
rolling_resamples

# 示例:结合工作流使用重采样
# 1. 定义模型
lm_spec <- linear_reg() %>% set_engine("lm") %>% set_mode("regression")

# 2. 创建工作流
wf <- workflow() %>% 
  add_formula(y ~ .) %>%  # 替换为你的响应变量与预测变量公式
  add_model(lm_spec)

# 3. 在滚动重采样上拟合模型并评估
rolling_fits <- fit_resamples(
  wf,
  resamples = rolling_resamples,
  metrics = metric_set(rmse, rsq)
)

# 查看评估指标
collect_metrics(rolling_fits)

参数说明

  • cumulative = FALSE:关闭累积模式,每次分析集仅保留最近8个样本(而非从起始点累积)
  • initial = 8:固定分析集大小为8
  • assess = 2:固定评估集大小为2
  • skip:设置滑动步长,比如skip=1会跳过1个样本以减少重采样次数

内容的提问来源于stack exchange,提问作者larry77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18