ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ARIMA+LSTM双模型融合,破解大促销售预测难题

ARIMA+LSTM双模型融合,破解大促销售预测难题 先说个我每年都要经历一遍的事618和双十一还没到运营、供应链、客服的老大就排着队来问我——“这次大促日均单量预测多少库存备多少仓库要加几个人”你要是拿一套“拍脑袋”的模型糊弄他们备货备少了爆款秒断备多了整仓库的货压到年底都清不完这个锅最后一定算在数据团队头上。我最早用的是ARIMA模型平时跑周维度、月维度的销售预测还算稳可一到大促就崩得没法看。后来把LSTM加进来做了一套“ARIMALSTM”组合预测方案才真正把大促期间的预测精度拉到了业务能用的水平。这篇文章就把这套方案的完整思路、模型原理、调参细节和我在实战中踩过的坑都写下来希望能给正在被大促预测折磨的数据同行一点参考。1. 为什么大促预测这么难又这么重要1.1 大促预测难的三个核心原因先说结论大促预测不是“时间序列预测”的常规题目它更像是一道“突发事件下的序列突变预测”题这也是ARIMA、LSTM这些模型单独用会翻车的根本原因。第一个原因是数据分布突变。平时你的日销量可能稳定在10万上下双十一当天直接冲到100万10倍甚至20倍的跳跃序列的均值、方差、自相关结构全部被打乱。统计学模型的基础假设是“历史会重演”大促恰好把这条路堵死了。很多经典时序模型对这种量级突变几乎无能为力预测结果往往严重滞后或极度低估。第二个原因是有效历史样本太少。大促一年才一两次能作为“相似样本”的历史大促记录少得可怜。LSTM这类深度模型是数据饥渴型的给它3到5条历史大促记录去学“大促规律”它大概率会过拟合到某一次特定的大促形态上。你让它预测下一次大促看起来学到了什么实际上学到的全是上一次促销的“偶然”。第三个原因是影响因素高度多维。大促销量不单纯是历史销量的延续它跟折扣力度、预热天数、平台流量策略、竞品动作、物流时效、天气、甚至直播带货的突发流量都有强关系。这些外部变量一个没处理好模型再先进也是瞎子摸象。1.2 预测做不好业务端代价有多大预测这事业务方嘴上不说心里都在拿真金白银衡量。库存备多了仓储租金、资金占用成本都是实打实的亏损库存备少了爆款断货直接损失GMV和用户口碑。客服排班也依赖预测排少了咨询电话打不进来排多了人力成本白花。冷链生鲜类目更狠备货过量就是直接报废损耗率往上一拉毛利全被吞掉。我后来算过一笔账把大促首日的销量预测误差从正负30%压到正负10%以内单次大促光库存周转这一块就能省下一笔非常可观的仓储和资金成本。这也是为什么团队值得花时间搭一套“双模型融合”方案而不是随便拿一个模型糊弄过去——精度每提升一个百分点都是直接的钱。2. 双剑合璧之前先搞懂两个模型各自的“脾气”2.1 ARIMA统计学派的老牌选手强在线性趋势ARIMA全称是自回归积分滑动平均模型它由三部分组成AR自回归、I差分、MA移动平均对应的三个超参数是p、d、q。p自回归阶数用过去p个时刻的观测值来解释当前值d差分次数对非平稳序列做差分让它变成平稳序列q移动平均阶数用过去q个时刻的预测误差来修正当前值。它的核心假设是时间序列的当前值可以由过去的观测值、过去预测误差的线性组合来刻画。对于周期性较强、趋势平稳的序列ARIMA确实非常能打。但它的短板也很明显——它是线性模型对非线性关系和突发突变不敏感。大促当天销量曲线会产生一个陡峭的尖峰ARIMA在数学上会把这种尖峰解释为“异常”或者通过滑动平均把尖峰“抹平”一部分。你以为它在做预测实际上它在大促当天给出的预测值大概率会偏低一截且反应滞后。我在实操中给ARIMA做对比实验时发现单用ARIMA预测大促首日误差经常在30%到50%之间而且对促销结束后第二天的“回吐”现象销量跌回谷底预测得极不准确。2.2 LSTM深度学习序列模型擅长捕捉非线性依赖LSTM长短期记忆网络是循环神经网络RNN的一种改进结构核心设计是引入了一个“记忆单元”和三个门控机制遗忘门、输入门、输出门。记忆单元让网络可以选择记住哪些长期信息、遗忘哪些短期噪声从而缓解普通RNN在长序列上的梯度消失问题。通俗理解ARIMA只会拿最近几天的数据进行加权平均LSTM却能一边看最近几天的数据一边记住“去年大促前三天流量就开始上涨”这种周期性的长期规律还能把折扣力度、库存水位、活动剩余时间这类外部特征一起塞进模型里学习。它不需要你显式定义特征间的关系而是从大量历史数据里自己学出一套映射。LSTM的短板也同样明显——数据量不够时非常容易过拟合。你用三五百天的日常数据去训练它它能把平时的波动模拟得很好但遇到大促这种极端样本它对幅度的外推能力很差。训练到后面你会发现损失在训练集上很低验证集上一测直接飞了。而且LSTM对输入特征的尺度非常敏感归一化没做好训练直接发散。2.3 为什么要“双剑合璧”而不是只选一个更好的答案很简单大促预测场景下两个模型都不是“更好的那个”而是互为补充。ARIMA擅长捕捉时间序列自身的趋势和周期性对日常数据的拟合很稳但它“看不远”预测大促这种突变时会系统性低估LSTM擅长融合多维特征、捕捉非线性关系但它依赖数据量和特征工程样本少时容易被某次大促的偶然性带偏。把它们放在一起本质上是把“统计先验”和“深度学习表达能力”做一个叠加ARIMA负责守住时间序列本身的线性趋势和周期规律LSTM负责修正ARIMA在大促尖峰、非线性波动上的残差。这种“总模型粗模型残差修正器”的架构在样本稀缺的异常预测场景下效果远好于任何单一模型。3. 双模型融合的几种架构我为什么选了“残差修正”3.1 先看看常见的融合思路市面上做组合预测主要有三种思路我一个个试过优缺点都很鲜明。方案一加权平均融合。分别用ARIMA和LSTM预测出两个结果然后给它们分配权重比如0.4和0.6加权求和得到最终预测值。这种方案实现最轻但问题在于权重怎么定。你可以用网格搜索找最优权重也可以让权重随着预测时间点动态变化——比如日常预测时给ARIMA更高权重大促期间提高LSTM的权重。可实操下来大促期间模型波动极大固定权重很容易翻车。方案二分类切换。做一个分类器判断“当前是大促还是日常”日常用ARIMA大促切到LSTM。听着合理但实际操作中“切换”会产生很严重的断层效应比如大促前一天还在用ARIMA预测值100万到了大促当天切到LSTM直接跳到500万这种断崖式的预测结果运营根本不敢用。方案三残差修正。先用ARIMA对序列做一个整体拟合得到初步预测值然后把“真实值-ARIMA预测值”形成的残差序列作为学习目标交给LSTM去预测。最终预测值ARIMA预测值LSTM残差预测值。这种做法的好处是ARIMA把序列中最难学、但最有“惯性”的那个主趋势部分吃掉了LSTM只需要集中精力学“主趋势之外的那部分偏差”学习难度大幅降低对数据量的要求也柔和很多。3.2 我的最终选型残差修正为主滚动权重为辅我实际落地的是残差修正方案然后在融合环节做一个小的滚动权重调整。整体流程拆成四步用历史数据对序列做差分平稳化建立ARIMA基准模型计算ARIMA在历史样本上的残差序列把残差序列和外部特征折扣力度、预热天数、流量指数等一起喂给LSTM让LSTM学习残差的规律最终预测值 ARIMA预测值 LSTM残差预测值并对大促期间的预测结果做一个基于置信区间的上下限约束防止模型过度外推。这种结构在工程上很好理解也方便做模型监控如果某一天ARIMA残差突然变大说明市场环境出现了模型没见过的变化可以及时人工介入而不是无脑相信一个“黑盒”深度学习模型。4. 实操全流程从数据准备到模型融合落地4.1 数据准备与特征工程先说数据粒度。我做的是“SKU日期”粒度的预测但如果你是为大促备货做总预算建议先做店铺级或类目级别的汇总预测再做SKU级分摊。SKU级直接预测噪声太大单品的随机波动会淹没模型信号。我需要准备的核心数据分三类目标变量每日销售额或订单量注意要做异常值清洗退款、刷单、价格异常波动导致的极端值历史时序特征最近7天、14天、30天的销量均值、增长率、同比和环比活动相关特征是否为大促日、距离大促开始的天数、折扣力度、预热期流量、会场曝光位、竞品价格指数等。这里有个容易忽略的细节大促前的预热数据太重要了。用户在大促前会大量收藏、加购流量曲线会提前抬升这些流量特征必须作为LSTM的外部输入特征否则模型只能靠“猜”大促冲击。4.2 ARIMA部分的建模与调参细节ARIMA的建模流程我固定走这几步对原始序列做ADF单位根检验如果p值大于0.05说明序列非平稳需要差分d从0开始试验通常取1就到平稳了对差分后的序列绘制ACF和PACF图初步确定p和q的范围在候选参数区间内我用p∈[0,5]、q∈[0,5]遍历所有组合以AIC或BIC最小为准则选出最优参数对残差做Ljung-Box检验如果残差还有显著自相关说明模型没有提取干净信息需要增加p或q。这是我当年第一个大促项目跑出来的一组参考参数对日销量序列做了log变换后ADF检验p值0.32非平稳一阶差分后p值0.001平稳了ACF显示1阶截尾PACF显示2到3阶截尾网格搜索后选出了ARIMA(3,1,2)。这个参数不是通用的但整个选参流程是通用的强烈建议读者不要直接抄参数而是抄方法论。提示做ARIMA之前如果数据方差波动很大比如大促前后方差差异悬殊可以先对序列做对数变换或Box-Cox变换让数据分布更接近正态这对ARIMA的拟合效果提升非常显著。4.3 LSTM部分的网络搭建与训练细节我用的框架是KerasTensorFlow 2.x。LSTM的输入需要构造成三维矩阵(样本数, 时间步长, 特征维度)。时间步长我取的是14天特征维度包含了历史销量、流量指数、折扣力度等大约8到10个特征。网络结构我用了一个很小但有效的配置一层LSTM64个单元 Dropout0.2 一层Dense32个单元ReLU激活 输出层1个单元。大促场景的数据量本身不大网络太深反而会过拟合没必要一上来就堆多层LSTM深度网络的收益在样本只有几百条的场景下几乎为零。关键步骤from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout from tensorflow.keras.callbacks import EarlyStopping from sklearn.preprocessing import MinMaxScaler # 归一化 scaler MinMaxScaler(feature_range(0, 1)) scaled_data scaler.fit_transform(data_with_features) # 构造样本用前14天预测未来1天 def create_dataset(data, look_back14): X, y [], [] for i in range(len(data) - look_back): X.append(data[i:ilook_back, :]) y.append(data[ilook_back, 0]) return np.array(X), np.array(y) # 划分训练集和验证集 train_size int(len(X) * 0.8) X_train, X_val X[:train_size], X[train_size:] y_train, y_val y[:train_size], y[train_size:] model Sequential([ LSTM(64, return_sequencesTrue, input_shape(X_train.shape[1], X_train.shape[2])), Dropout(0.2), LSTM(32, return_sequencesFalse), Dropout(0.2), Dense(32, activationrelu), Dense(1) ]) model.compile(optimizeradam, lossmse) early_stop EarlyStopping(monitorval_loss, patience20, restore_best_weightsTrue) history model.fit(X_train, y_train, epochs100, batch_size16, validation_data(X_val, y_val), callbacks[early_stop], verbose0)说几个我是从坑里爬出来的经验归一化必须在全量数据上做而不是在训练集上做否则验证集的尺度会失真导致预测结果不稳定batch_size别设太大大促数据量小batch_size设成8或16就够了设64的话一个epoch就几轮迭代模型学不到什么东西EarlyStopping的patience要留够大促数据噪声大loss曲线震荡很厉害patience给得小了模型很早停下来效果反而不如多跑几个epoch。4.4 融合输出与预测结果约束融合这一步就很简单了ARIMA产出预测值LSTM产出残差预测值两者相加就是最终预测结果。我还会做两件事让结果更贴近业务第一给预测结果套一个“可置信区间”。基于ARIMA本身可以输出置信区间我用它来定义预测值的上下限范围。比如ARIMA预测大促首日是500万置信区间是400万到600万那我要求LSTM的残差修正最多把结果推到你设定的合理边界内不允许模型为了拟合历史某次大促而做出3倍于ARIMA基线的外推。这是防止LSTM在大促极端样本上过拟合的最后一道保险。第二按业务时间轴做“分段调整”。大促前30天、预热期、大促当天、返场期每一段的序列特征完全不同我在融合之后会分别设置一个误差阈值。如果预测值和业务方的预期他们通常会有一个草算盘子差距超过阈值就会触发人工复核。这个“人机复核”机制看着土但在大促这种容错率极低的场景它真的能救命。5. 效果评估、常见问题与实测心得5.1 评估指标不要只盯MAPE做预测模型很容易只盯MAPE平均绝对百分比误差。但在大促场景里MAPE有个天然缺陷——当真实值极高比如大促当天销售额1000万时即使预测成800万绝对误差200万百分比误差也才20%而当真实值极低比如大促次日销售额回升到50万时预测偏差20万就变成了40%的误差。所以大促预测的评估必须同时看多个指标指标计算方式大促场景下的意义MAE平均绝对误差直接反映备货误差的总量级MAPE绝对百分比误差均值反映整体相对精度但会被低值拉偏P50/P90误差误差分布分位数判断极端误差有多严重利于风险控制方向准确率预测值上涨/下跌方向是否准确大促阶段切换时比数值精度更能指导运营我在实际项目里日常期主要看MAE和MAPE大促期重点看P90误差。因为大促期间如果80%的SKU预测都挺准但某一个爆款SKU的P90误差高达100%那一款就能拖垮整个库存健康度。5.2 我踩过的几个典型问题下面这几个坑基本每个都是“模型上线前发现不了上线后业务找上门”的典型问题一LSTM训练时损失低预测时输出严重偏移。有一次我贪图方便直接用全量数据的均值做归一化结果大促当天输入的特征值远超训练集范围归一化后的值落在0.95以上LSTM在训练时几乎没见过这个区间预测值直接外推到离谱。解决方法是归一化时要留足“缓冲带”用训练集的5%和95%分位数来定归一化的上下限宁可让日常数据压缩一点也要保证大促数据不越过边界。问题二ARIMA在大促前就开始被“脏数据”污染。预热期的销量已经开始涨ARIMA还没反应过来把预热期的增量当成噪声平滑掉了。后来我在ARIMA的差分序列里加了一个“距大促开始天数”的外部回归项让模型提前感知大促临近的冲击效果立刻改善。这个做法本质上是把ARIMA扩展成了ARIMAX带外部变量的ARIMA。问题三残差LSTM学了个寂寞。一开始我把ARIMA预测后剩下的残差直接喂给LSTM没做任何特征拼接结果LSTM学到的只是残差的均值回归等于白学。后来我给LSTM的输入拼上了流量指数、折扣力度、加购人数等外部特征残差的规律才真正被提取出来。残差修正不是让LSTM去学噪声而是让它去学“噪声中被遗漏的因果线索”。5.3 我的几点实战心得如果把整套方案浓缩成几句话我想说这几条第一模型复杂度要匹配数据量。大促预测的数据量天然受限不要一上来就上Transformer、上超大模型。Transformer在长期依赖和全局特征提取上确实强但在样本量只有几百条、又极度不均衡的场景下LSTM和ARIMA的组合反而更稳、更好监控、更容易解释。第二解释性是大促预测的隐藏需求。业务方拿到预测结果一定会问“为什么预测是800万依据是什么”ARIMA能讲清楚“这是过去14天的趋势外推加季节因子得出的”LSTM残差修正能讲清楚“因为今年的预热流量比去年高了20%所以我在基线上又上调了80万”。两个模型各司其职给业务方解释起来比“这是一个深度模型跑出来的”要容易得多。第三大促结束之后一定要做复盘和参数回测。大促预测模型不是上线就完事了每次大促都是一个新的样本你需要把这次的数据喂回模型做增量训练重新校准ARIMA的参数和LSTM的阈值。我最近一次大促复盘时发现上次大促后模型对“返场期销量”的预测明显偏乐观仔细排查才发现是折扣力度的特征工程在返场期没有区分“日常折扣”和“返场限时折扣”修掉这个问题之后返场期的P90误差下降了6个百分点。最后分享一个关于细节的小技巧如果你也在做类似的预测项目我想特别建议你花时间去做一样东西——建立一个“大促档案表”。每一年的大促把起始日期、预热天数、折扣档位、主推品类、流量渠道占比、价格弹性、活动玩法这些信息全部记下来作为后续模型训练和预测的特征依据。模型的结构大家都会搭但真正让预测精度拉开差距的是对业务活动本身的理解有没有沉淀到特征和流程里。大促年年有模型会老但档案和复盘机制会越来越值钱。这是我做预测这几年最深的体会希望能帮你少走几段弯路。
返回列表