时间序列预测入门到实战(十三)· 概率预测:DeepAR 与 N-BEATS / N-HiTS
本文是「码海寻道」《时间序列预测入门到实战》系列的第 13 篇。前面所有深度模型都在拼一件事:点预测的精度——预测出一个数,越准越好。但真实业务里,一个光秃秃的数往往不够用。这一篇讲两件事:概率预测(DeepAR,给出一个分布而非一个点),以及纯 MLP 的强架构(N-BEATS / N-HiTS,证明不用注意力也能 SOTA,还自带可解释)。

一、为什么点预测不够用
“明天用电量 8000” 和 “明天用电量 90% 概率落在 7000~9000”——后者能回答的问题多得多。
做容量规划要看最坏情况(P90 甚至 P99),做安全库存要权衡缺货成本和积压成本,做风控要知道尾部风险。这些决策都不是靠一个点估计能做的,它们需要不确定性。这就是概率预测:模型输出的不是一个值,而是一个分布,或者一组分位数(P10 / P50 / P90)。
二、DeepAR:让 RNN 输出"分布"
DeepAR(Amazon,2017) 的巧思在于:它还是一个自回归 RNN,但网络最后吐出的不是一个预测值,而是一个概率分布的参数(比如高斯分布的均值 μ 和方差 σ)。
- 训练:目标不是最小化 MSE,而是最大化似然——让真实值在预测分布下的概率尽量大;
- 预测:从分布里采样,一步步滚动生成,跑很多次得到大量可能的未来轨迹,再从这些轨迹里读出任意分位数。
"最大化似然"和 MSE 差在哪? MSE 只盯一件事:预测那个点离真实值有多近——它根本不关心"我有多确定"。最大似然多管一件事:让整个分布形状去贴合数据。模型不光要把均值 μ 对准真实值,还得把方差 σ 调对——数据抖得厉害的时段就把 σ 调大(“这儿我没把握,区间给宽点”),平稳的时段把 σ 调小(“这儿我很有信心”)。σ 太大太小,似然都会惩罚它。于是模型在学"预测多少"的同时,也被逼着学会了"该有多不确定"——这正是点预测模型永远给不出的东西。
为什么要采样一大堆轨迹? 因为是自回归的:每一步都从分布里随机抽一个值当作下一步的输入,一路滚到底就得到一条可能的未来。抽的随机性不同,滚出的轨迹就不同。跑几百上千次,几百条未来轨迹铺开,在每个时刻把这些值排个序,第 10% / 50% / 90% 位置的值就是 P10 / P50 / P90——用蒙特卡洛的笨办法,把不确定性一条条"跑"出来。
DeepAR 还是个全局模型(呼应第 6 篇),一个模型学所有序列,特别适合零售那种"成千上万条相似序列"的场景,也能吃协变量。它是工业界概率预测的经典选择。
三、N-BEATS:纯 MLP 也能封神
N-BEATS(ICLR 2020) 反潮流地证明了一件事:不用 RNN、不用 CNN、不用注意力,纯粹的全连接(MLP)堆叠,也能拿到 SOTA(这个"简单结构就够强"的精神,和第 12 篇的 DLinear 一脉相承)。
它的结构核心是双重残差堆叠:一串 block 首尾相接,每个 block 同时输出两样东西——
- backcast:对已知历史的重构(我理解到的部分,从输入里减掉);
- forecast:对未来的预测(累加起来就是最终结果)。
一层层把"已经解释掉的"从输入里剥离,剩下的交给下一层。可解释变体更妙:把 block 的基函数设计成趋势基和季节基,输出就能自动分解成趋势 + 季节(又是第 2 篇的分解思想,无处不在)。
像剥洋葱一样理解它:第 1 个 block 说"我看懂了历史里这一层规律",就把这层从输入里减掉(backcast),同时按这层规律预测一小部分未来(forecast);剩下的、它没看懂的残差往下传,第 2 个 block 接着啃……每层只负责一层结构,预测就是各层 forecast 的累加。这个"啃掉一层、传下残差"的接力,和第 6 篇梯度提升"一棵接一棵补残差"是同一种智慧——用一串简单模块串行分工,拼出复杂能力。区别是这里连历史重构(backcast)也一起做,逼着每层把话说清楚,可解释性就是这么来的。
四、N-HiTS:N-BEATS 的长序列进化(AAAI 2023)
N-HiTS(AAAI 2023) 是 N-BEATS 的直系进化,专治长序列预测又快又准。两个关键升级:
- 多率采样(multi-rate sampling):不同 block 用不同的采样率看数据——有的 block 关注低频的趋势,有的关注高频的细节,各司其职;
- 分层插值(hierarchical interpolation):预测也分层生成,低频块画大轮廓、高频块补细节,最后插值合成。
这套"分频治理"让 N-HiTS 在长序列上大幅降低计算量,精度还常常优于复杂的 Transformer——又一个"简单高效打败复杂"的例子。
五、怎么用
概率预测和这些模型,neuralforecast 里都有现成实现,还能直接指定输出分位数:
# pip install neuralforecast
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS, DeepAR
from neuralforecast.losses.pytorch import DistributionLoss
nf = NeuralForecast(freq="h", models=[
NHITS(h=24, input_size=168,
loss=DistributionLoss(distribution="Normal", level=[80, 90])), # 直接要 80%/90% 区间
DeepAR(h=24, input_size=168), # DeepAR 内建概率输出,默认即出分位数
])
nf.fit(df) # df: unique_id / ds / y
pred = nf.predict() # 输出含中位数与各分位数区间
参考定位:要不确定性就上 DeepAR 这类概率模型;要一个强而快、还可解释的深度基线,N-BEATS / N-HiTS 非常值得先试——它们常常是性价比最高的选择。
小结
- 概率预测给的是分布/分位数,而非一个点,这是库存、容量、风控等决策的刚需;
- DeepAR:RNN 输出分布参数,最大化似然训练、采样出多条轨迹,全局模型 + 概率预测;
- N-BEATS:纯 MLP + 双重残差堆叠,可解释变体自动分解趋势/季节;
- N-HiTS:多率采样 + 分层插值,长序列又快又准,是极强的性价比基线。
深度学习各大流派讲到这,还差最后一块拼图——面向真实业务的模型。下一篇的 TFT,会把多协变量、已知的未来信息、可解释、概率预测全部揉进一个模型,专为生产环境而生。
思考题:DeepAR 假设预测服从某个分布族(比如高斯)。如果你的数据是销量(非负、常有很多 0、偶尔暴涨),高斯分布合适吗?该换成什么分布?
概率预测讲完了。下一篇看集大成者 TFT,如何把真实业务的所有诉求装进一个模型。



