389. M5 Forecasting - Uncertainty | m5-forecasting-uncertainty
我很惊讶能在 M5 预测竞赛中获得第 7 名和学生组第 1 名。这是我第一次参加 Kaggle 竞赛,也是我第一次在这里获得排名。很高兴能在这里分享我的解决方案(虽然可能有点晚了)。
在本次比赛中,我首先专注于准确率竞赛(即产生均值预测),然后利用在准确率竞赛中建立的模型来产生不确定性估计(即分位数预测)。
我建立了两个 seq2seq LSTM 模型来预测未来 28 天的均值。一个试图在商店-商品级别进行预测,另一个试图在部门-商店级别进行预测。最终的准确率预测由两个模型的简单平均组成。不确定性估计是利用两个模型的估计残差构建的,同时假设预测残差是独立同分布的正态分布。
我认为本次比赛的关键收获是可靠的本地验证方案的重要性,加上模型集成技术,这使我的模型在本地和公共/私人排行榜上都能提供稳定的性能。在比赛的早期阶段,人们都在优化公共排行榜,我的模型在公共排行榜上的表现实际上无法与那些顶级解决方案相比。然而,我的解决方案的关键优势在于它在本地和公共/私人排行榜上都能提供稳定的性能。
由于只有 28 天的验证窗口(即公共排行榜),WRMSSE / WSPL 指标可能会波动,因为它对所有聚合级别进行等权重加权(这意味着顶级聚合级别预测,即使只有少量观察值,也已经占据了损失的很大一部分)。如果我们过于关注优化公共排行榜,而没有可靠的本地验证方案,可能会潜在地过拟合。
seq2seq LSTM 模型采用 28 天的输入窗口和 28 天的输出窗口。基本上它类似于用于机器翻译的编码器-解码器模型,不同之处在于我向模型添加了一些外生特征,并避免在解码器输入中使用任何预测信息(即无条件训练和预测)。无条件训练背后的基本原理是确保模型在推理时的表现与训练时相似。在下图中,y 表示时间序列(即销售额),z 表示外生特征(例如工作日、假期事件、是否 SNAP、商品 ID),h 表示隐藏状态(以及单元状态)。
我没有使用任何特殊的特征。基本上特征是日历特征(例如假期事件、假期类型、工作日)、ID 特征(商品 ID、部门 ID、商店 ID)和价格特征。通过 SHAP 值分析,ID 特征和工作日对模型性能很重要。具有高基数的分类特征使用嵌入层进行后处理。
一些重要的特征处理步骤是:
LSTM 模型使用 Adam 算法进行训练。部门-商店模型使用加权 MSE 损失进行训练。商店-商品模型使用未加权的零膨胀泊松损失进行训练(以处理许多 0 的情况)。
在训练期间,观察到模型不稳定的问题,类似于这里的观察结果。下图显示了 WRMSSE 指标(用于准确率测量)在训练时期期间的变化。
为了解决不稳定性问题,每个 seq2seq LSTM 模型实际上由在 20 个不同检查点(即训练时期)训练的模型组成,并且是 20 个检查点模型的简单平均。提交模型是盲目训练的,没有任何提前停止,并被观察到具有稳定的性能。
部门-商店级别的预测首先使用 28 天历史平均比率转换为商店-商品级别预测。然后将两个模型的预测简单平均,并通过自下而上的方法转换为所有聚合级别的预测。
我的本地验证方案由 4 折数据组成,每折为 28 天。具体来说: