预测评估
时间序列的评估和普通机器学习有一条关键差别:不能随机划分。用未来的数据去预测过去,成绩再好也没有意义。这一页讲三件事:怎么正确地切、用什么指标衡量、以及一个几乎所有人都低估了的问题——你的复杂模型真的赢过"照抄上一期"了吗?
LAB 01
滚动预测
训练窗随时间前移,一步步给出样本外误差
一共做了多少次滚动—
滚动预测的平均 MAE—
只切一刀(最后一段)的 MAE—
各次滚动之间的标准差—
滚动预测(rolling origin)就是把"训练到哪、预测哪一段"这条线一次次往后挪。每挪一次得到一组样本外误差,最后取平均。这么做有两个好处:第一,它模拟了你实际使用模型的方式——永远只用过去预测未来;第二,它给出很多个误差估计,而不是一个。读数里请对比"滚动平均"和"只切一刀"这两个数。单次划分的结果常常和滚动平均差出不少,而且你并不知道自己碰巧切在了容易的一段还是难的一段。默认参数下滚动平均是 2.25,而只切最后一刀是 2.29;把第一个训练窗拉到 100,单次划分变成 3.65,而滚动平均还是 2.25——差了六成,纯粹因为最后那一段恰好难预测。再看"各次滚动之间的标准差":它是 0.85,接近误差本身的四成。用一个数去汇报预测精度,等于扔掉了这个离散度。最后说"固定窗口"这个选项。默认是扩张窗口(训练数据越用越多);勾上之后变成固定长度的滑动窗口。如果你相信系统的规律在变(大多数业务数据都在变),滑动窗口更合适,因为它会主动忘掉太老的数据。这两种做法没有绝对优劣,但必须和你对"规律稳不稳定"的判断一致。
LAB 02
误差指标
MAE、RMSE、MAPE、sMAPE 在同一组数据上的差异与陷阱
MAE / RMSE / MAPE / sMAPE / MASE—
RMSE / MAE 的比值—
哪个指标在这组数据上不可靠—
MASE 的含义—
这几个指标衡量的不是同一件事,换一组数据排名就会变。MAE vs RMSE:RMSE 对大误差的惩罚是平方的,所以只要有一个离谱的预测,RMSE 就会被拉高,而 MAE 基本不动。选"有一个巨大的异常值"看两者的比值:正常数据上 RMSE/MAE 是 1.19,加一个离群误差之后跳到 3.19,而 MAE 只从 1.62 涨到 2.32。RMSE/MAE 这个比值本身就是一个有用的诊断:接近 1.25 说明误差接近正态,明显大于 2 说明有重尾或异常值。MAPE 的坑最深。选"有接近 0 的取值":MAPE 从 3.3% 直接跳到 128%,sMAPE 也到 58%,而 MAE 和 RMSE 一点没变——因为 MAPE 的分母是实际值。而且 MAPE 对低估和高估不对称——预测值比实际大一倍,误差是 100%;小一半,误差只有 50%。这个不对称会系统性地把你的模型推向低估。sMAPE 想修正这一点,但它自己也有别的毛病,并没有真正解决问题。MASE 是这几个里最值得推荐的。它把误差除以"朴素法在训练集上的平均误差",于是变成一个无量纲的数:MASE < 1 表示比朴素法好,> 1 表示还不如。它没有除以零的问题,可以跨不同序列比较,这也是 M4 竞赛选它的原因。
LAB 03
基准模型
朴素法与季节朴素法——比不过它们的复杂模型没有意义
模型的 MASE—
朴素法 / 季节朴素法 / 漂移法的 MAE—
哪个基准最强—
模型赢了吗—
三个基准方法:朴素法(预测 = 最后一个观测值)、季节朴素法(预测 = 上一个周期的同一位置)、漂移法(沿着首尾连线外推)。它们都不需要训练,也没有任何参数。但在合适的数据上,它们非常难打败。选"随机游走":理论上朴素法就是最优预测,任何模型都只能追平,不可能超过——如果你的模型在随机游走上"赢"了朴素法,几乎可以肯定是过拟合或者数据泄漏。选"季节很弱、噪声很大":模型学到的那点季节信号很可能还不够抵消它多出来的方差。选"中途结构变化":三个基准里季节朴素法明显最强(4.08 对 7.29 和 7.36),因为它只看一年前的同期,对水平跳变的适应最快。Holt-Winters 在这组数据上仍然赢了它 1.69 倍——但那是因为跳变发生在六成处,后面还留了四成数据让它重新估参数。跳变越靠近预测点,模型越来不及适应,基准就越容易反超。所以报告结论时,基准不是走过场,而是判断有没有价值的唯一尺子。M 系列预测竞赛几十年来反复证明:在真实业务序列上,简单方法的组合常常打败复杂模型,而很多论文里的"显著提升"在换了基准之后就消失了。
这一页想说的
时间序列评估的三条硬规矩,违反任何一条结论都不可信:一、永远按时间切分,永远只用过去预测未来;二、用滚动预测给出一组误差,并且报告它的离散程度,而不是一个数;三、必须和朴素基准比,并且把基准的成绩一起写出来。这三条都不难做,也都不花什么算力,但它们决定了你报出来的那个数字有没有意义。如果时间只够做一件事,那就做第三条。