← 返回作品集

📈 Foresight:四个模型怎么预测下一周的销量

多变量时间序列预测(LSTM / Transformer / XGBoost / 季节朴素基线)。用的真实数据是厄瓜多尔 54 家店 × 33 个品类的日销量(2013–2017),外加油价 / 节日 / 促销三个外生变量。 本页是预测演示器:你调序列长什么样(噪声 / 趋势 / 季节),右侧用项目真实跑出来的模型误差画出四个模型的预测对比。 源码 | 真实结论:XGBoost 夺冠,MAE 0.256、MASE 0.70 —— 比"照搬上周"好约 30%。

① 设置序列 · 这些参数在调什么


② 四个模型预测对比(未来 16 天)

③ 真实模型指标(log1p 销量空间)

以下数字直接来自项目产物 reports/model_results.jsonreports/backtest_results.json,同一个按时间顺序的 16 天留出集上测得(无洗牌、无交叉验证)。

模型MAE ↓RMSE ↓MAPE ↓MASE ↓

它在算什么 · 五步流水线(与真实训练管线同构)

1原始序列

54 店 × 33 品类的日销量,外加油价 / 节日 / 促销三个外生变量。

2特征工程

对数变换后用 shift(1)滞后(1/7/14/28/364天)、滚动均值/标准差(7/14/28/60天)、季节正弦余弦、促销聚合——这套特征就覆盖了大多长程依赖。

3按时间划窗

只用过去预测未来:扩大式训练窗 + 尾部 16 天留出集,5 折 walk-forward 回测,绝不洗牌。

4四个模型

XGBoost / Prophet(基线)、LSTM+嵌入、Transformer+位置编码,全部在同一个留出窗口上评估。

5误差度量

MAE / RMSE / MAPE / sMAPE(log1p 空间)+ MASE / RMSSE 对"照搬上周"基准的缩放误差。

防泄漏在防什么 · 三条真实修过的坑

时间序列评估最阴险的错:把"未来"混进"训练",指标会好看得离谱但上线即崩。这个项目实测修掉了三条泄漏路径——每次都是测试 tests/test_pipeline.py::TestLeakagePrevention 拦下来的


① 滞后特征跨组泄漏(Shift 跨组):油价是一条共享的日序列。早期在长表上直接 shift(1),会滑过 (店, 品类) 分组边界——"昨天的油价"变成了"上一组今天同一天的油价"。修法:先在按日期去重的帧上算滞后再 merge 回来,oil_lag_1 才永远是昨天的油价。

② 双向填充把未来拉进验证窗(前视填充):缺失油价早期用 interpolate(linear),它是双向的,可能用验证窗内的未来油价去填训练窗。改成只 ffill().bfill()(因果填充),某天的油价从此不再来自更晚的观测。

③ 深度学习验证目标越界(目标泄漏)TimeSeriesDataset(min_target_date=val_start) 只发射"预测目标 ≥ 验证起始日"的样本——验证窗前面那 28 天的训练尾部只当窗口输入,绝不当预测目标混进验证 MAE。

一句话:泄漏 = 模型偷看了答案,测试分数虚高,部署必翻车。MASE 的稳定性(0.69±0.01 vs 单点 0.702)就是"修干净了"的旁证。

方法注释(一句人话版)

MASE(缩放均值绝对误差):holdout 的 MAE ÷ 训练集内"照搬上周"基准的 MAE(本项目缩放尺度 ≈ 0.365,log1p 空间)。MASE < 1 才叫打赢朴素基线——本项目四个模型全 < 1。
XGBoost 赢在哪:特征工程覆盖长程依赖后,梯度提升能最高效地利用这些结构化特征;深度学习不一定赢过精心打造的基线——这本身就是一条工程结论。
Rolling-origin 回测:随机 k 折 CV 对时间序列无效(洗牌把未来塞进训练)。本项目在 5 个 16 天原点上重训重评,XGBoost 的 MAE = 0.252 ± 0.004,MASE = 0.690 ± 0.011——模型稳定,单次留出集 0.702 只是那次窗口略"背"而已。
这里演示的曲线:为直观用与项目 mock 生成器同构的公式画了条合成序列,四条预测线的误差带锚定在真实 MAE 上;柱状指标是真实产物数值,未编造。
生产管线:pandas 时间感知 shift(1) 特征 / PyTorch Lightning 训练(LSTM+Transformer)/ XGBoost+Prophet 基线 / 5 折 walk-forward 回测 / pytest 泄漏契约,见仓库 src/foresight/reports/

本页为方法演示。演示曲线为合成数据;MAE/RMSE/MAPE/MASE 为项目真实跑分。