资讯动态

时序模型选型实战:从ARIMA到深度学习的完整路线

发布时间:2026/10/14 11:45:24 来源:尧图企业网站定制
最近帮朋友评估一个预测需求对方开口就是“常见的时序模型你都帮我跑一遍看哪个效果最好”。这话听起来很朴素但真正做起来完全不是那回事。我前后做了几年时间序列相关的东西从销售数据、线上流量到设备运行指标都有涉及一个很深刻的体会是常见的时序模型翻来覆去就是那几类但选型背后的逻辑比想象中复杂得多。这篇文章我会基于自己的实操经验把时序模型按路线拆开讲清楚包括每个模型解决什么问题、适合什么数据、有什么坑以及我实际落地时怎么选希望你看完能少走弯路。1. 先别急着建模把三类时序预测路线摊开看新手面对“时序预测”最容易犯的错是一上来就问“哪个模型最厉害”。这个问题的前提就不对因为时序模型不是一个排排坐的排行榜而是分路线的每条路线解决的是不同限制条件下的问题。1.1 统计路线数据少、要解释、业务要听懂的场景统计路线包括我们常听到的 ARIMA、SARIMA、指数平滑以及它们的各种变体。这类模型的共同点是先假设时间序列是由趋势、季节性、周期和噪声叠加或组合出来的然后用数学函数去拟合这些成分。这类模型最大的优势不是精度而是透明。预测结果可以拆解成“趋势项上升了多少”“季节性贡献了多少”“随机波动占多少”业务方听得懂也愿意信。另一个隐藏优势是数据量门槛低哪怕只有一百来个历史点也能跑出一个能用的模型。我在处理月度销售数据时经常先拿统计模型做基线。它不需要昂贵的训练资源几分钟出结果还能给后续的复杂模型提供一个“及格线”。后面哪怕上深度学习我也会拿统计模型的结果做参照防止复杂模型连简单基线都跑不赢。1.2 机器学习路线特征多、外生变量多、数据量中等的场景机器学习模型跑时序预测本质上是不再把“时间”当成特殊的东西而是把预测问题改造成常规的监督学习。什么意思呢就是构造一个特征矩阵每一行对应一个历史时刻列是滞后值、滚动统计量、星期几、月份、节假日等目标是下一个时间点的值。然后丢给 LightGBM、XGBoost、随机森林这类回归器去拟合。这条路线非常适合有大量外生变量的场景。比如预测某个零售门店的日销量你不光有历史销量还有天气、促销活动、门店类型、周边客流等额外信息。统计模型想把这些变量塞进去会比较别扭但树模型很自然把外部变量当特征即可。数据量方面机器学习比统计模型更“贪吃”。我的经验是至少要有几千行有效样本才值得走这条路。太少的话学不出规律跟统计模型比没有优势。1.3 深度学习与概率路线多序列、长周期、要区间预测的场景深度学习路线包括 LSTM、GRU、Transformer 系还有 DeepAR 这类概率预测模型。它适合下面几种情况第一你有大量相似序列可以一起训练比如几万个商品的销量曲线第二序列特别长需要捕捉远程依赖第三业务不满足于一个预测点还要不确定性区间。很多人以为深度学习一定比前两条路线准这是误解。深度学习只是能力上限高前提是数据量和算力要跟上。序列数据量小的时候它的表现经常不如一个调好参数的 SARIMA。所以我把这三条路线看成“并列关系”而不是“进步关系”。选哪条取决于你的数据条件、业务约束和解释需求。后面几节我会逐个展开讲。2. 统计模型的看家本领ARIMA、SARIMA 与指数平滑统计模型是一类看起来简单、细抠起来很深的模型。很多人用 ARIMA 就是调个库跑一遍遇到效果不好就换模型这其实浪费了统计模型的解释力。2.1 ARIMA 的三个字母到底在说什么ARIMA 是三个部分的组合。AR 是自回归意思是“用过去的自己预测未来的自己”本质是拿历史值做线性回归I 是差分用来把不平稳的序列变平稳最简单的是计算相邻点的差值MA 是移动平均这里特指对“过去的预测误差”做回归不是简单把数据抹平。写出来就长这样ARIMA(p, d, q)p 是自回归阶数d 是差分次数q 是误差项阶数。实操中 p 和 q 我不会手动猜一般是画自相关图ACF和偏自相关图PACF初步判断再用 AIC 或 BIC 在候选参数里自动选。差分次数 d 则需要先做单位根检验比如 ADF 检验看序列是否平稳。我遇到过一种很典型的情况原始数据本身就不含趋势只是有轻微波动结果自动定阶流程还是给了一个 d1。这属于过度差分会把原本有用的信息削弱导致预测误差反而变大。后来我的做法是先看时序图和 ADF 的 p 值如果原始序列已经平稳就直接把 d 设为 0不要让模型盲目差分。2.2 季节性问题交给 SARIMAARIMA 处理不了周期性明显的序列。比如零售数据每周有周末高峰每天有早晚高峰这种固定周期的变化如果不建模残差里就会残留明显的周期性。SARIMA 在 ARIMA 的基础上加了一组季节项专门用来捕捉以一定周期重复出现的模式。这里要特别注意“季节周期”的定义。它不一定是自然季节而是数据中反复出现的时间间隔。日粒度数据常见的是周期 7周也有周期 30 或 365 的尝试小时粒度数据常见的是周期 24。周期设错了模型基本跑不出理想效果。我拿某类行业平台的访问量做过测试同样是小时粒度数据把季节周期设成 24 后预测曲线能准确还原每天的峰谷结构而忽略季节项时预测结果就像一条平滑的曲线完全抓不住重点。所以看到周期性数据优先考虑 SARIMA它的季节项是这类问题的标准解法。2.3 指数平滑趋势和季节的另一种拆解思路指数平滑和 ARIMA 是两种不同的哲学。它不讲“自回归”而是直接对水平、趋势、季节做加权平均权重按时间衰减越近的数据权重越大。一次指数平滑处理无趋势无季节的数据二次加上趋势三次Holt-Winters再加上季节。和 ARIMA 相比指数平滑的优点是参数直观、训练速度快、对短期趋势变化更敏感。我在预测门店周销量时经常先用 Holt-Winters 跑一个版本因为它允许我直接告诉模型“趋势是加性的还是乘性的”“季节是加性的还是乘性的”四个组合都试一遍挑表现最好的简单有效。但统计模型的共同短板也很明显对外生变量支持弱。你想加入节假日、促销事件、宏观指标ARIMA 和指数平滑都会很吃力。这时候就该切到机器学习路线了。3. 机器学习路线把时间轴变成特征矩阵再用回归器硬拟合机器学习做时序预测第一步不是选模型而是做特征工程。特征做得对不对直接决定效果上限。3.1 滑窗和滞后特征的标准做法核心思想是把时间序列转成监督学习数据。假设我们要预测第 t 天的值那特征可以包括前 1 天的值、前 7 天的值、前 30 天的平均值、上周同一天的值、月份、星期几、是否节假日、是否促销等。我一般会构造这么几类特征滞后特征t-1, t-2, t-7, t-30 的具体值捕捉短期和周期性依赖。滚动统计量过去 7 天/14 天的均值、标准差、最大值、最小值刻画近期水平。时间编码星期几、小时、第几周、月份、是否月末以及用正弦余弦编码的周期变量。外生变量天气、温度、活动标记等直接作为普通特征。这段代码展示了一个非常基础的滞后特征构造方式窗口设为 7 天import pandas as pd df pd.DataFrame({y: [100, 102, 105, 103, 108, 110, 112, 115]}) for lag in [1, 2, 7]: df[flag_{lag}] df[y].shift(lag) df[rolling_mean_7] df[y].shift(1).rolling(7).mean() df df.dropna() print(df)注意滚动均值里我多写了一个shift(1)这是为了防止特征里混入当天目标值。很多人在这里踩坑滚动统计量直接用当天数据结果是训练集上精度极高一上真实预测就崩。3.2 树模型为什么在实战里这么能打LightGBM、XGBoost 这类梯度提升树在时序预测里表现经常出人意料地好原因不是它们能理解时间而是它们擅长拟合复杂的特征交互。树模型可以把“星期几”和“是否促销”组合成很强的信号。比如数据揭示周六加促销的销量是普通工作日的三倍树模型能自动发现这种规则而统计模型需要你手动建模。树模型的另一个优点是鲁棒性。异常值不会像深度模型那样产生连锁影响缺失值也能自己处理一部分。我处理某渠道流量预测时用 LightGBM 只做了三小时的特征工程效果就超过了调了一周的 LSTM。但树模型有个致命弱点无法外推趋势。它对特征空间之外的目标值完全没有概念。如果你预测未来 30 天而整体趋势是持续上升的树模型的预测曲线往往会趋于平缓甚至会回落因为训练数据里根本没见过这么高的值。3.3 多步预测的三种输出策略机器学习模型原生只预测“下一步”。要预测未来 30 天常见有三种做法递归预测把预测出来的 t1 当作特征继续预测 t2。实现简单但误差会逐步累积预测越远越飘。直接预测训练 30 个模型分别预测第 1 天、第 2 天……第 30 天。每个模型只用真实历史特征没有误差累积但需要维护多个模型且忽略了预测值之间的关联。多输出预测让单个模型输出一个长度为 30 的向量。树模型做不了直接的多输出但神经网络很自然也是我把机器学习和深度学习衔接起来的桥梁。我的建议是序列周期短、预测步数少时用递归预测步数多且特征稳定时用直接法如果业务要求预测曲线保持内部一致性优先考虑深度模型的多输出结构。4. 深度模型LSTM、GRU、Transformer 系谁更适合你的数据量深度学习在时序预测里被讨论最多但真正落地时要冷静。它不是“无脑胜利”的银弹。4.1 RNN 系的记忆机制LSTM 与 GRURNN 的初衷是处理序列靠的是隐藏状态在时间步之间传递信息。但传统 RNN 在序列较长时会出现梯度消失或爆炸记不住太久之前的信息。LSTM 通过输入门、遗忘门、输出门来控制信息的写入和遗忘GRU 则是 LSTM 的简化版把三个门合并成两个门参数更少训练更快。LSTM 对中等长度的序列比如几十到几百个时间步效果不错。我接过一个设备温度预测的小项目用 LSTM 滑窗长度为 48输入输出都是温度值预测下一小时温度效果明显优于 ARIMA。但 LSTM 的训练稳定性是老大难。同样的代码换一个随机种子结果都可能差很多。我的习惯是固定随机种子多跑几组不同初始种子取平均才敢把模型拿去对比。4.2 Transformer 系长距离依赖的突破口LSTM 的问题在于信息必须一步一步传递长序列时早期信息容易丢。Transformer 用自注意力机制理论上每个位置都能直接看到序列中的任何其他位置长程依赖能力比 RNN 强得多。这几年出现的 Transformer 变体比如 Informer、Autoformer、PatchTST 等都在尝试降低注意力计算复杂度同时提升长序列预测效果。它们的共同思路是通过稀疏注意力、分解趋势季节性、切分 patch 等方式让模型更适配时间序列的特征而不是照搬自然语言处理的结构。不过我也要泼一盆冷水Transformer 系模型对数据量和训练技巧要求很高。数据量没有上万条序列或者序列长度不够长你很难体会到它们相对 LSTM 的优势。很多项目用 LSTM 就够盲目上 Transformer 只会增加训练和调参成本。我做过的某个指标预测实验里数据大概有一年半的小时数据大约一万三千个点。LSTM 和 Transformer 效果基本打平甚至 Transformer 在训练早期还因为收敛慢被反超。反而是把数据从单序列扩展到几百条相关序列一起训练后Transformer 才展现出明显优势。这说明深度模型的优势来自“数据规模”不来自“更贵的架构”。4.3 深度模型的门槛和成本深度模型的门槛主要有四个数据量、算力、调参时间和可解释性。其中可解释性最容易被低估。业务方问一句“为什么预测下个月销量这么高”深度模型很难给出让人信服的回答只能靠特征归因去解释。所以我给深度模型的定位是当统计模型和机器学习都试过、效果还是不满足或者你有大规模相似序列需要统一建模时才轮到它们上场。5. 概率预测不只预测一个数而是预测一个分布前面讨论的模型输出基本是单点值也就是“预测下周销量是 1000 件”。但实际业务里1000 这个数本身没那么重要重要的是“大概率落在 900 到 1100 件之间”。概率预测解决的就是这个问题。5.1 点预测的局限在哪里点预测最大的问题是掩盖了不确定性。预测结果是 1000 件但真实的置信区间可能是 800 到 1200也可能是 500 到 1500两者含义完全不同。库存管理里按 1000 件备货如果不确定性很大缺货风险会很高。统计模型其实天然带有不确定性信息比如 ARIMA 可以输出预测区间但实际效果经常偏窄因为它只考虑了模型本身的误差没考虑未来外生变量的波动。机器学习树模型虽然可以靠分位数损失输出区间但需要专门设计。5.2 概率模型怎么做DeepAR 与分位数损失DeepAR 是一种自回归概率模型用的是 RNN 或 Transformer 编码器但输出不是直接的值而是每个时间步上目标分布的参数。比如假设目标服从高斯分布那模型输出每个时间步的均值和方差如果是计数型数据可以用负二项分布。训练时用极大似然估计预测时通过采样得到多条轨迹再汇总成预测分布。如果不想引入复杂的概率模型还有一个轻量级办法使用分位数损失训练模型同时输出 10%、50%、90% 分位数。这个技巧也适用于 LightGBM通过设置目标为分位数回归就能得到多分位数的预测结果。import lightgbm as lgb params { objective: quantile, alpha: 0.9, # 预测90%分位数 learning_rate: 0.05, num_leaves: 31, }这样训练出来的模型每个时间点输出“有 90% 概率实际值低于该值”配合 10% 分位数模型就能构造出预测区间。5.3 概率预测的典型应用场景我遇到的两个典型场景一个是电商安全库存按 90% 分位数备货保证不缺货的同时避免过度库存另一个是异常检测如果真实值落在预测区间之外就触发告警而不是简单看是否超过固定阈值。概率预测不是要替代点预测而是给决策层提供更完整的信息。同一个项目里我给运营看的还是点预测曲线但给供应链系统的却是分位数结果两边各取所需。6. 落地选型与避坑实录从参数到评估的完整闭环最后这部分我把前面提到的模型放到同一张决策表里再讲评估和踩坑经验。这才是真正动手时最需要的东西。6.1 不同场景下的模型选型对照下面这张表是我这几年的经验总结不敢说绝对正确但能覆盖大部分常见情况场景特征推荐路线首选模型替换或补充方案数据点少几百要解释无外生变量统计模型Holt-Winters / SARIMAARIMA有季节性周期固定数据中等统计模型SARIMAProphet 类分解模型数据中等外生变量多特征丰富机器学习LightGBM / XGBoost递归或直接多步多条相关序列需要统一建模深度学习LSTM / GRUDeepAR超长序列长程依赖明显数据量大深度学习Transformer 系Informer 变体业务要区间和风险控制概率预测分位数 LightGBMDeepAR实时性要求高重训练频繁统计或轻量MLARIMA / 指数平滑LightGBM 增量训练注意这个表不是严格的阶梯而是一种“由简入繁”的参考。我的原则是永远先用简单模型建立基线再根据业务差距决定是否升级。大部分情况下基线模型已经能满足需求根本不用走到深度模型那一步。6.2 评估指标别只看一个也不能乱用时序预测常用指标有 MAE、RMSE、MAPE、SMAPE 等。很多人只盯 RMSE但 RMSE 对异常点特别敏感一个偶发大误差会把整体数值拉得很高导致你误以为模型很差。MAE 更稳健但无法体现大误差的惩罚。MAPE 有个隐藏陷阱当真实值接近 0 时MAPE 会趋近无穷大剧烈波动会让指标失真。如果你的数据里有大量接近 0 的值建议改用 SMAPE或者干脆用 MAE 和 RMSE 组合看。评估时还有一个容易忽视的点切分方式。时序数据绝对不能随机打乱否则未来信息会泄露进训练集。要使用时间序列切分比如训练集取前 80% 的时间段验证集取后 20%或者用滚动时间窗做交叉验证。6.3 我踩过的三个坑以及补救办法第一个坑是特征里混进了未来信息。有一次我用树模型预测活动期间的流量随手把“活动开始天数”整列作为特征结果训练集效果极好验证集一塌糊涂。原因是这个特征在训练时已经暴露了活动时间点信息模型直接“记住”了哪几天是活动期换了新活动数据就失效。补救方式是检查所有特征的生成逻辑确保特征只依赖历史时刻之前的信息。第二个坑是过度差分。前面提过某个平稳序列被自动定阶流程做了一个差分模型效果反而变差。从那以后我对所有自动定阶结果都会人工复核一次看看差分阶数是否合理宁可保守也不要过度处理。第三个坑是预测结果滞后。表现是预测曲线整体比真实曲线晚了一两个时间点看起来“很像”但误差一直不小。这个问题的根源在于模型学会了“近似用上一个点当预测”因为大部分时序数据的短期变化很小。解决办法是强化对周期特征的依赖而不是让模型过度依赖 lag_1。可以把 lag_1 去掉强制模型从更长周期变量里学习规律。这些年下来我最大的变化是面对新需求时不再急着选模型而是先做三件事画出数据图看趋势和周期、明确业务要的是点预测还是区间预测、用简单模型跑一个基线。这三件事做完模型选型其实已经确定了一大半。希望这篇关于常见时序模型的梳理能帮你少走一些我当年走过的弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑