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

HTS预测精度与训练测试拆分方法咨询:两种方式孰对孰错?

关于HTS训练与测试实施方式的正确选择

嘿,这个问题问到点子上了——时间序列预测里的训练测试拆分逻辑可是关乎模型可靠性的核心,尤其是HTS这种带层级结构的场景!

直接给结论:第一种方式(先拆分训练集/测试集,再对训练集应用HTS)才是正确且符合规范的做法,第二种方式存在严重的“数据泄露”问题,完全不可取。

为什么第一种方式正确?

时间序列预测的核心原则是「样本外验证」——模型只能基于过去已知的数据(训练集)学习规律,然后用未见过的未来数据(测试集)评估真实性能。对于HTS来说:

  • 先拆分训练集,意味着你是基于历史层级数据构建模型、学习层级间的关联规律,再用测试集检验模型对未来层级数据的预测能力,这完全贴合真实业务场景(你不可能提前拿到未来的层级数据来建模)。
  • 这种方式得到的评估指标(比如MASE、RMSE)能真实反映模型的泛化能力,指导后续的模型优化或上线。

为什么第二种方式不可取?

如果先对完整序列应用HTS再拆分训练/测试集,本质上是让模型在训练阶段就「偷看」了测试集的信息:

  • HTS的层级聚合、分解逻辑会用到完整序列的分布特征(比如各层级的整体趋势、波动),这相当于把未来数据的信息提前融入了模型,导致测试集的评估结果被严重高估,完全无法代表模型在真实未知数据上的表现。
  • 举个简单例子:如果测试集里某一层级出现了突发增长,提前用完整数据构建HTS会让模型「提前适应」这个增长,而真实场景下你不可能预知这个突发情况,这样的模型上线后必然失效。

附R中正确操作的极简示例

library(hts)
library(forecast)

# 1. 拆分原始时间序列为训练集和测试集
# 假设你的原始层级时间序列是my_ts,这里用前80%作为训练集
train_period <- floor(length(my_ts) * 0.8)
train <- window(my_ts, end = train_period)
test <- window(my_ts, start = train_period + 1)

# 2. 基于训练集构建HTS对象
# nodes参数替换为你的层级结构,比如c(3,2)表示第一层3个节点,每个下分2个
train_hts <- hts(train, nodes = c(3, 2))

# 3. 训练HTS模型并生成预测(这里用组合预测方法)
hts_forecast <- forecast(train_hts, method = "comb", h = length(test))

# 4. 用测试集评估预测效果
accuracy(hts_forecast, test)

如果你还有具体的后续问题(比如HTS的聚合方法选择、模型调优、特定业务场景的适配等),随时补充细节,我再帮你深入拆解!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:02