测试集仅含单样本时Tidymodels脚本报错的解决与重采样实现
解决tidymodels自定义数据拆分报错与时间序列滚动重采样问题
一、修复自定义数据拆分(最新1条为测试集)的报错
常见报错原因与解决步骤
- 必须按时间维度排序:未按
year(或更细粒度时间列)排序会导致测试集并非最新数据,引发后续模型适配的逻辑错误。 - 生成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:固定分析集大小为8assess = 2:固定评估集大小为2skip:设置滑动步长,比如skip=1会跳过1个样本以减少重采样次数
内容的提问来源于stack exchange,提问作者larry77
相关产品推荐
相关产品推荐

