① 设置序列 · 这些参数在调什么
② 四个模型预测对比(未来 16 天)
③ 真实模型指标(log1p 销量空间)
以下数字直接来自项目产物 reports/model_results.json 与 reports/backtest_results.json,同一个按时间顺序的 16 天留出集上测得(无洗牌、无交叉验证)。
| 模型 | MAE ↓ | RMSE ↓ | MAPE ↓ | MASE ↓ |
|---|
多变量时间序列预测(LSTM / Transformer / XGBoost / 季节朴素基线)。用的真实数据是厄瓜多尔 54 家店 × 33 个品类的日销量(2013–2017),外加油价 / 节日 / 促销三个外生变量。 本页是预测演示器:你调序列长什么样(噪声 / 趋势 / 季节),右侧用项目真实跑出来的模型误差画出四个模型的预测对比。 源码 | 真实结论:XGBoost 夺冠,MAE 0.256、MASE 0.70 —— 比"照搬上周"好约 30%。
以下数字直接来自项目产物 reports/model_results.json 与 reports/backtest_results.json,同一个按时间顺序的 16 天留出集上测得(无洗牌、无交叉验证)。
| 模型 | MAE ↓ | RMSE ↓ | MAPE ↓ | MASE ↓ |
|---|
54 店 × 33 品类的日销量,外加油价 / 节日 / 促销三个外生变量。
对数变换后用 shift(1) 造滞后(1/7/14/28/364天)、滚动均值/标准差(7/14/28/60天)、季节正弦余弦、促销聚合——这套特征就覆盖了大多长程依赖。
只用过去预测未来:扩大式训练窗 + 尾部 16 天留出集,5 折 walk-forward 回测,绝不洗牌。
XGBoost / Prophet(基线)、LSTM+嵌入、Transformer+位置编码,全部在同一个留出窗口上评估。
MAE / RMSE / MAPE / sMAPE(log1p 空间)+ MASE / RMSSE 对"照搬上周"基准的缩放误差。
时间序列评估最阴险的错:把"未来"混进"训练",指标会好看得离谱但上线即崩。这个项目实测修掉了三条泄漏路径——每次都是测试 tests/test_pipeline.py::TestLeakagePrevention 拦下来的:
shift(1),会滑过 (店, 品类) 分组边界——"昨天的油价"变成了"上一组今天同一天的油价"。修法:先在按日期去重的帧上算滞后再 merge 回来,oil_lag_1 才永远是昨天的油价。interpolate(linear),它是双向的,可能用验证窗内的未来油价去填训练窗。改成只 ffill().bfill()(因果填充),某天的油价从此不再来自更晚的观测。TimeSeriesDataset(min_target_date=val_start) 只发射"预测目标 ≥ 验证起始日"的样本——验证窗前面那 28 天的训练尾部只当窗口输入,绝不当预测目标混进验证 MAE。src/foresight/ 与 reports/。