7.1 评估指标:MAE / RMSE / MAPE


7.1 评估指标:MAE / RMSE / MAPE

本节摘要:评估时序模型需要把"预测误差"量化成可比较的数字。本节系统介绍 MAE、RMSE、MAPE、SMAPE、MASE、R² 六类指标,并讨论各自的适用场景、单位敏感性、对异常值的反应。

学习目标

阅读完本节,你应当能够:

  1. 写出 MAE、RMSE、MAPE 的数学定义。
  2. 根据数据特征(量级、异常值、是否过零)选择合适的指标。
  3. 用 sklearn 或 statsmodels 算所有指标,并解释结果。

一、为什么需要多个指标

没有任何一个指标能完整描述"预测得好不好"。比如:

  • 模型 A:MAE=5,RMSE=8(少数大误差拉高 RMSE)
  • 模型 B:MAE=5,RMSE=5.2(误差均匀)
  • 模型 C:MAE=4,RMSE=4.3

A 和 C 的 MAE 差 1,但 A 在业务上可能更危险(RMSE 高说明存在"少数极端预测错误")。单一指标会掩盖模型的真实特征

二、五个核心指标

1. MAE(Mean Absolute Error,平均绝对误差)

MAE = (1/n) Σ |y(t) - ŷ(t)|
  • 单位与原数据一致。
  • 对所有误差等权(无论大小)。
  • 业务上最易理解:"平均预测偏离 X 个单位"。

2. RMSE(Root Mean Squared Error,均方根误差)

RMSE = √((1/n) Σ (y(t) - ŷ(t))²)
  • 单位与原数据一致。
  • 对大误差更敏感(平方放大大误差)。
  • 适合"少数大错误会出大事"的场景(如风控、运维)。

3. MAPE(Mean Absolute Percentage Error,平均绝对百分比误差)

MAPE = (100%/n) Σ |y(t) - ŷ(t)| / |y(t)|
  • 量纲无关,跨数据集可比。
  • 致命问题:y(t) 接近 0 时 MAPE 爆炸。对销量有 0 的业务,MAPE 不可用。
  • 替代:SMAPE(Symmetric MAPE),对 0 值更稳。

4. SMAPE(Symmetric MAPE)

SMAPE = (100%/n) Σ 2|y(t) - ŷ(t)| / (|y(t)| + |ŷ(t)|)
  • 解决 MAPE 的"零值爆炸"问题。
  • 上界是 200%(理论)。
  • 业务上常用,但仍有"低估极端误差"的倾向。

5. MASE(Mean Absolute Scaled Error)

MASE = MAE_model / MAE_naive

其中 MAE_naive = (1/n) Σ |y(t) - y(t-1)|(朴素季节性预测的 MAE)。

  • 量纲无关。
  • MASE < 1 表示模型比朴素预测好。这是比 MAPE / SMAPE 更公平的"相对指标"。
  • 推荐用于跨数据集、跨业务线的模型对比。

三、用 sklearn 算指标

import numpy as np from sklearn.metrics import mean_absolute_error, mean_squared_error y_true = np.array([100, 110, 105, 120, 115]) y_pred = np.array([98, 112, 103, 118, 117]) mae = mean_absolute_error(y_true, y_pred) rmse = np.sqrt(mean_squared_error(y_true, y_pred)) mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100 smape = np.mean(2 * np.abs(y_true - y_pred) / (np.abs(y_true) + np.abs(y_pred))) * 100 # 朴素基线 naive_mae = np.mean(np.abs(np.diff(y_true))) mase = mae / naive_mae print(f"MAE = {mae:.2f}") print(f"RMSE = {rmse:.2f}") print(f"MAPE = {mape:.2f}%") print(f"SMAPE = {smape:.2f}%") print(f"MASE = {mase:.3f}")

四、指标选择的工程建议

业务场景 推荐指标
给非技术 stakeholder 汇报 MAE(单位直观)
异常值很关键(风控、运维) RMSE(敏感于大误差)
跨业务线对比 MASE(相对朴素基线)
销量有 0 或接近 0 SMAPE(不用 MAPE)
量级差异大的多模型 MAPE 或 MASE
学术 / 比赛 MAPE + RMSE 双指标

五、几个常见误区

  • MAPE 越低越好:错。MAPE 对低 y 值敏感,业务上"对高销量预测准"更有价值。
  • RMSE 一定要比 MAE 大:是,因为 RMSE 对大误差更敏感;差距大说明有极端误差。
  • R² 高就说明模型好:错。R² 衡量"模型解释了方差的比例";时序数据有强趋势时 R² 容易虚高。
  • MASE < 1 就好:不完全对。MASE < 1 是必要条件,不是充分条件——还要看误差方向(系统性高估 vs 低估)。

六、误差方向分析

除了误差大小,业务上还关心方向

# 系统性高估 / 低估 errors = y_true - y_pred mean_error = np.mean(errors) # MBE (Mean Bias Error) print(f"系统偏差 = {mean_error:.2f}") # 正 = 预测偏低

如果 MBE 显著不为 0 → 模型系统性高估或低估。MAE / RMSE 只看绝对值,不看方向

本节要点回顾

  • MAE:单位直观,对所有误差等权。
  • RMSE:对大误差更敏感。
  • MAPE:量纲无关,但 0 值爆炸。
  • SMAPE:解决 MAPE 的零值问题。
  • MASE:相对朴素基线,跨数据集公平。
  • 指标选择:看业务场景(异常敏感、量级、零值)+ 看汇报对象。
  • 下一节线索:7.2 进入"预测区间"——把单点预测扩展为区间估计,反映不确定性。

侦探笔记:5 个指标 + 1 个反直觉

指标 公式 单位 适合场景
MAE mean(abs(y - ŷ)) 同原数据 通用 对极端值不敏感
MSE mean((y - ŷ)²) 同原数据² 训练时 单位不可解释
RMSE sqrt(MSE) 同原数据 报告 对极端值敏感
MAPE mean(abs((y - ŷ)/y)) % 跨量级比较 y=0 时爆炸
1 - SSE/SST 无量纲 解释力 趋势数据会虚高

反直觉:R² = 0.95 听起来很好,但若数据是单调上升,预测"等于上一个值"的 R² 也是 0.95。R² 必须配合残差图看,不能单独信。

选指标流程

  • 业务关心相对误差(销量、价格)→ MAPE
  • 业务关心绝对误差(能耗、库存)→ RMSE 或 MAE
  • 多个模型横向比 → 同时给 MAE + RMSE + MAPE,看稳定性
  • 模型上线监控 → 单一指标(如 RMSE)+ 阈值报警

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U