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

时间序列中‘Future data set is incomplete’警告的解决方法

解决fabletools::accuracy()中未来数据集不完整的警告问题

我在学习《Forecasting Principles and Practice, 3rd Edition》的时间序列内容时,使用aus_accommodation数据集做时间序列交叉验证,执行以下代码后触发了警告:

执行代码

加载依赖与数据集:

library(fpp3)
library(tidyverse)
accommodations <- aus_accommodation

构建交叉验证训练集:

train <- accommodations %>%
  slice(-n()) %>% 
  stretch_tsibble(.init = 36, step = 1)

拟合TSLM模型:

fit <- train %>%
  model(
    TSLM(CPI ~ trend() + season())
  ) 

生成1步预测:

forecast1 <- fit %>% 
  forecast(h=1)

评估预测准确率:

final <- forecast1 %>% 
  fabletools::accuracy(accommodations)

触发的警告信息

Warning message:
The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
1 observation is missing at 2016 Q3

排查后确认:forecast1与final中无缺失值,但原数据集aus_accommodation确实没有2016 Q3及之后的观测。修改.init(1至36)、step(1至4)甚至移除这些参数,警告依旧出现。


问题原因

警告的核心是accuracy()函数在对比预测值与真实值时,会默认检查目标数据集(accommodations)是否包含所有预测时间段之后的观测。你的交叉验证训练集是通过slice(-n())去掉了原数据集的最后一行(2016 Q2),最后一个拉伸训练集的时间范围到2016 Q1,对应的预测期是2016 Q2。但accuracy()内部逻辑会额外检查是否存在2016 Q3的数据,而原数据集没有这部分,因此触发警告。

解决方法

方法1:限制对比的真实值范围

调用accuracy()时,只取与预测期完全匹配的真实值部分:

final <- forecast1 %>% 
  fabletools::accuracy(accommodations %>% slice(37:n()))

这里slice(37:n())对应的是每个拉伸训练集预测的下一期真实值,刚好和forecast1的预测期一一对应,避免函数检查不存在的2016 Q3数据。

方法2:明确指定预测的时间点

生成预测时,用new_data参数明确传入要预测的时间点集合,替代h=1的自动推断:

# 提取所有需要预测的时间点(对应每个训练集的下一期)
test_points <- accommodations %>% 
  slice(37:n()) %>% 
  select(Quarter)

# 基于指定时间点生成预测
forecast1 <- fit %>% 
  forecast(new_data = test_points)

# 再执行准确率评估
final <- forecast1 %>% 
  fabletools::accuracy(accommodations)

为什么修改.init/step没用?

问题根源不在交叉验证训练集的构建参数,而是accuracy()对目标数据集的完整性检查逻辑,因此调整.init或step无法消除警告。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:35:24