返回列表

48th place solution - seq2seq

389. M5 Forecasting - Uncertainty | m5-forecasting-uncertainty

开始: 2020-03-03 结束: 2020-06-30 销量与需求预测 数据算法赛
第48名方案 - seq2seq

第48名方案 - seq2seq

作者:Arshjot Khehra
发布时间:2020年7月1日

首先,祝贺所有的获奖者,也感谢大家在比赛期间和赛后分享的见解。这是我第一次参加预测比赛/项目,所以我学到了很多新东西。

我最好的方案让我获得了第48名的成绩,它是两种架构的简单集成——一个扩张 LSTM 序列到序列模型和一个带有注意力机制的序列到序列 LSTM 模型(应用于编码器的所有输出到解码器每一步的隐藏状态)。

我已经在 GitHub 上分享了我用于准确性和不确定性比赛的代码,下面将分享更多细节。

特征

  • 日历特征 (42):

    • 月份、日期和星期的循环编码(解释见此处)- 6
    • 相对年份 (2016 - year) - 1
    • event_name 的16维嵌入。两个事件字段通过同一个嵌入层,然后连接起来 - 32
    • Snap 字段,值为0或1 - 3
  • 序列ID (63):
    所有ID字段的嵌入 - item_id (50), dept_id (4), cat_id (2), store_id (5), 和 state_id (2)。对于聚合序列(层级1-11),分组字段作为单独的类别保留。例如 - 州 CA 的第2层级序列分类如下:

    item_id dept_id cat_id store_id state_id
    All All All All CA
  • 前一天的销量
  • 销售价格(对于层级1-11,使用其组成序列的平均销售价格)

归一化

只有价格和销量特征被归一化。这是通过将每个序列的销量和价格除以输入窗口中的平均值来完成的。

训练

使用过去2年数据的长度为28*13天的滑动窗口(步长为28天)进行训练。这意味着对于每个窗口,28*13个时间步作为编码器的输入,随后的28天作为解码器的预测范围。

训练使用 SPL 损失函数,配合 RMSProp 优化器,学习率衰减和早停机制。

我最终也尝试了一些滞后/滚动特征以及在训练期间添加噪声,尽管这些修改并没有显著改善验证分数。

验证

使用了一个简单的3折传统时间序列验证分割(最后3个28天的周期),每个折的预测取平均值作为最终提交。


有趣的是,无论是在验证分数还是排行榜分数上,我的模型在不确定性赛道的表现都优于准确性赛道。

我也曾想尝试表征学习和图学习算法(以考虑层级结构),但没有投入足够的时间让它们跑通。

希望我的帖子/代码对大家有所帮助。如果有任何问题,请告诉我 :)

同比赛其他方案