如何用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
相关产品推荐
相关产品推荐

