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

如何用PyTorch的TimeSeriesDataSet与TemporalFusionTransformer避免目标泄露?

问题分析与解决方案

你的问题核心是数据泄露:你创建的price_lagged列是当前日期14天后的价格,这导致模型在训练时,encoder窗口(历史时间序列窗口)内的每条样本都包含了未来的价格信息(比如窗口内第t-1天的price_lagged是t+13天的价格),模型直接利用这些未来信息做预测,所以即使没有其他特征也能得到“好结果”——这属于作弊,不是真正的预测能力。

解决步骤

1. 修正数据处理逻辑

删除price_lagged列,目标变量直接用原始的price。我们要让模型学习的是:基于t日及之前的历史数据,预测t+14日的价格。

2. 正确配置TimeSeriesDataSet

确保模型只能获取到预测时刻之前的历史特征,修改后的代码示例:

# 假设max_encoder_length是你选定的历史窗口长度,比如30天
training = TimeSeriesDataSet(
    dataset[lambda x: x.day <= training_cutoff - 14],  # 训练数据截止日提前14天,保证能获取14天后的目标值
    time_idx="day",
    target="price",
    group_ids=["group_id"],
    min_encoder_length=max_encoder_length,
    max_encoder_length=max_encoder_length,
    max_prediction_length=14,  # 预测未来14天,后续只取第14天的结果作为最终预测值
    static_categoricals=[],
    static_reals=[],
    time_varying_known_categoricals=[],
    time_varying_unknown_reals=["price"],  # 明确输入特征为历史价格
    time_varying_unknown_categoricals=[],
    time_varying_known_reals=[],
    target_normalizer=EncoderNormalizer(),
    lags={"price": [1, 7, 14]},  # 可选:添加历史滞后特征,比如前1/7/14天的价格,提升模型能力
    add_relative_time_idx=True,
    allow_missing_timesteps=False,
    add_target_scales=True,
)

关键配置说明:

  • 把历史price加入time_varying_unknown_reals,模型只会用encoder窗口内的历史价格作为输入,不会接触未来价格。
  • 训练数据截止日提前14天,避免出现无法获取14天后目标值的无效样本。
  • 若只想输出14天后的单值,设置max_prediction_length=14后,在预测阶段提取第14个时间步的结果即可。

TFT是否支持这种用法?

完全支持。TFT的设计初衷就是处理多步时间序列预测,也能完美适配单步远期预测场景。只要数据集构建正确,确保模型训练时只能获取预测时刻之前的历史特征,就能实现“用历史数据预测14天后价格”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:35:14