一场谁都没说谎的争吵
季度复盘会。数据同事兴冲冲地宣布:「模型 MAPE 4.8%,行业优秀水平!」
供应链同事冷冷回一句:「那为什么我仓里这个月还是缺了 600 件?」
两人吵了二十分钟,谁也没说服谁。散会后我把两边的数字拉到一起看了半小时,结论是:两个人都没说谎,他们只是用了不同的尺子,而其中一把尺子量错了方向。 这篇把六把尺子一次讲清,顺便做一场反直觉实验:两个 MAE 完全相同的模型,一个没事,一个在稳定漏货。
六把尺子,各量一件事,也各有一个骗法
人话 + 骗法对照:
| 指标 | 量什么 | 会被什么骗 |
|---|---|---|
| MAE | 平均每期错多少件 | 不能跨量级比较;大错被平均稀释 |
| RMSE | 有没有灾难性大错 | 对异常值过敏,一个离群点就能拉爆 |
| MAPE | 相对错百分之几 | 分母接近 0 时爆炸;天然偏爱低估 |
| WMAPE | 销量加权的相对误差 | 被头部大 SKU 主导(这通常正是想要的) |
| Bias | 误差的方向 | 正负互相抵消,单独看毫无意义 |
| MASE | 相对「抄上一期」的改善 | 分母选错(如季节性数据用 naive)会失真 |
手算一遍:手感是算出来的
6 期数据 y = [120, 132, 125, 141, 138, 150],某模型给 ŷ = [112, 140, 123, 130, 145, 152]:
| t | y | ŷ | e=y−ŷ | |e| | e² | |e|÷y | | -- | --- | --- | ----- | ----- | --- | ------- | | 1 | 120 | 112 | +8 | 8 | 64 | 6.667% | | 2 | 132 | 140 | −8 | 8 | 64 | 6.061% | | 3 | 125 | 123 | +2 | 2 | 4 | 1.600% | | 4 | 141 | 130 | +11 | 11 | 121 | 7.801% | | 5 | 138 | 145 | −7 | 7 | 49 | 5.072% | | 6 | 150 | 152 | −2 | 2 | 4 | 1.333% | | 合计 | 806 | — | −4 | 38 | 306 | 28.534% |
-
MAE = 38 ÷ 6 = 6.3333
-
RMSE = √(306 ÷ 6) = √51 = 7.1414
-
MAPE = 28.534% ÷ 6 = 4.7557%
-
WMAPE = 38 ÷ 806 = 4.7146%
-
Bias = −4 ÷ 806 = −0.4963% (负 = 整体略低估)
-
MASE:分母 = mean(12, 7, 16, 3, 12) = 50 ÷ 5 = 10 → 0.6333
再加一场敏感性实验:把第 4 期的误差从 11 改成 60(一次灾难性错判),其余不变。新误差列 [8, −8, 2, 60, −7, −2]:
-
Σ|e| = 87 → MAE = 14.5(原来的 2.29 倍)
-
Σe² = 64+64+4+3600+49+4 = 3785 → RMSE = √630.83 = 25.12(原来的 3.52 倍)
一次大错,MAE 涨 2.3 倍、RMSE 涨 3.5 倍。这就是「RMSE 对大错敏感」的定量含义:如果你最怕断货式灾难,看 RMSE;如果你怕的是日常平庸的错误,看 MAE。
MAPE 的两个致命陷阱,用两个数字说清
陷阱一,分母爆炸:某期 y = 2、ŷ = 6,单期 MAPE = |2−6| ÷ 2 = 200% 。长尾 SKU 一年里只要有几十天低销量,MAPE 就能冲到几千 percent——数字失去意义,但汇报 PPT 上它很吓人。
陷阱二,天然偏爱低估:
-
低估 50%:y=100, ŷ=50 → |e|÷y = 50%
-
高估 100%:y=50, ŷ=100 → |e|÷y = 100%
同样「错一倍」,高估的惩罚是低估的两倍。于是以 MAPE 为目标优化的模型会系统性偏低——而偏低在补货场景里就是缺货。这不是理论担忧:我用 MAPE 做损失函数训过一版模型,Bias 稳定在 −6%,仓库用脚投票反对了它。
所以实务标准是 WMAPE + Bias 成对看:前者管大小,后者管方向。
对照实验:MAE 相同,命运不同
构造两个模型:A 的误差 ±26 交替(一期高估一期低估),B 的误差恒定低估 26。两者每期 |误差| 完全相同:
| 模型 | MAE | RMSE | WMAPE | Bias |
|---|---|---|---|---|
| A(±26 交替) | 26.0 | 26.0 | 4.87% | 0.00% |
| B(恒定低估 26) | 26.0 | 26.0 | 4.87% | −4.87% |
所有「只看大小」的指标严格相等。但把每期缺口累加:
A 的累计缺口原地踏步(0 件),B 在 24 期里累计漏掉 624 件货。单期看「一样准」,累计看一个在正常波动、一个在稳定缺货。
把 Bias 换算成业务语言还有一个好用的公式:每天漏货件数 ≈ |Bias| × 日均销量。本例 4.87% × 约 535 ≈ 26 件/天 × 24 天 = 624 件——和累计曲线严丝合缝。以后看到 Bias = −3%,直接乘日均销量,就知道仓库每天在悄悄漏多少。
准确率告诉你方法有多精,Bias 告诉你它往哪个方向错。 监控里 Bias 必须带符号、设阈值;只看 WMAPE 的看板,是在给慢性缺货打掩护。
MASE:唯一能回答「值不值得存在」的指标
MASE 的分母是「用上一期预测本期」在训练段上的平均绝对误差。读法:
-
MASE = 1.0:和「抄上一期」一样好——等于没做;
-
MASE < 1:真学到了东西;
-
MASE > 1:还不如不建模,立刻下线排查。
两个坑:
- 分母必须用训练段,不能用测试段——否则门槛随测试集漂移。
- 强季节数据的分母应换成 Seasonal Naive(抄上周同天)的误差,否则 naive 分母太大,MASE 会虚假地好看。第 4 篇的实验里,日销数据上 Seasonal Naive 的 MAE 只有 naive 的一半,这个差别直接决定门槛松紧。
回测:折数、窗口、步长怎么定
时序数据不能随机切(用未来验过去是作弊)。滚动起点回测的四步操作见下图;但真正容易错的是三个参数:
| 参数 | 规则 | 理由 |
|---|---|---|
| 最小训练长度 | ≥ 2 个完整季节周期(日销 ≥ 14 天,月销 ≥ 24 月) | 少于一个周期学不出季节 |
| 折数 | ≥ 4,越多越稳;相邻折可重叠 | 折太少,误差估计自身波动大 |
| 预测步长 h | = 决策提前期(补货 7 天就验 7 天) | 验 1 天却用 7 天的决策,是自欺 |
| 报告口径 | 平均 + 最坏折 + 折间标准差 | 库存扛的是坏日子,不是平均日子 |
一个真实教训:我们曾按 h=1 回测选出模型,上线后做 7 天补货,误差比回测值高 60%。原因很简单——1 步误差和 7 步误差根本不是一个东西(误差随步长长大,第 7 篇的 √h 规律)。从那以后,回测步长写进了需求文档。
一页纸误差报告模板(可直接抄)
| 区块 | 内容 | 示例 |
|---|---|---|
| 头部 | 周期、口径(需求/销量)、分层 | 2026-W35,还原需求,A 类 |
| 主指标 | WMAPE(本周期 / 上周期 / 目标) | 6.8% / 7.4% / ≤8% |
| 方向 | Bias(带符号,换算成件/天) | −2.1%(≈ −11 件/天) |
| 基线对照 | MASE vs Seasonal Naive | 0.71 |
| 灾难检查 | RMSE÷MAE 比值、最大单期误差 | 1.6、−38%(8/21,已归因:直播未登记) |
| 分层明细 | A/B/C 三层各自 WMAPE 与 Bias | A 5.9/−1.2;B 12.4/−2.8;C 只看总量 |
| 区间校准 | P10~P90 实际覆盖率(名义 80%) | 77% |
| 行动项 | owner + 截止日 | 直播日历补登记 @运营 9/8 |
告警阈值怎么定? 别拍脑袋。取过去 28 天该指标分布的 P95 作为告警线:例如历史 28 天 WMAPE 的 P95 = 9.2%,则阈值设 9.2%——它意味着「比过去 95% 的日子都差」才报警,既不麻木也不过敏。
读者问答
Q1:为什么不用 R² 这种「越大越好」的指标? R² 衡量「解释方差占比」,在销量这种高季节数据上很容易到 0.9+,看起来皆大欢喜,但它对方向性偏差完全不敏感——一个恒定低估 10% 的模型 R² 依然很高。补货 cares 的是方向和尾部,不是方差解释率。
Q2:WMAPE 和「1 − 准确率」是一回事吗? 很多公司把「预测准确率 = 1 − WMAPE」写进 KPI。可以,但要记住它是销量加权的:头部 SKU 主导。于是长尾再烂也不影响 KPI——这有时是好事(聚焦头部),有时是坏事(长尾积压无人管)。所以必须配分层明细。
Q3:误差指标需要按金额加权吗? 需要,当你关心钱而不是件数时:用「误差件数 × 单价」或「误差 × 毛利」加权。高单价 SKU 错 10 件和低单价 SKU 错 10 件,财务意义差十倍。第 14 篇的代价结构会把这条路走到底。
实操清单
- 把六指标做成每日自动计算,落库保留 13 个月(覆盖同比)。
- Bias 永远带符号展示,并附「≈ 件/天」换算列。
- 回测步长 = 决策提前期,写进需求文档;报告平均 + 最坏折。
- 告警阈值用历史 28 天 P95 设定,每季度复核一次。
- 上线一页纸报告模板,周会只讲这一页 + 行动项。
- 任何「准确率」汇报,先问一句:方向呢?尾部呢?分层呢?
带走三句话:WMAPE 管大小、Bias 管方向、MASE 管存在意义,三者缺一不可;MAPE 会爆炸且偏爱低估,慎用;回测步长必须等于决策提前期,并报告最坏折。
下一篇:在碰任何模型之前,先请四位「笨选手」上场——它们是你的考官、兜底和脚手架,而且常常比你想象的难打。