返回列表

24th position solution - with code

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

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

第24名方案 - 含代码

作者:Jacques Peeters | 发布时间:2020年7月

全局思考

我原本的目标是金牌,没能拿到让我非常失望。看到像这样的帖子,人们用基础的解决方案就能获得高排名,我很嫉妒。由于私有数据集的不同,那些具有更宽分位数的模型可能占了便宜。

同时,当阅读像第一名方案这样的文章时,我只能承认他们更强,并避免成为一个输不起的人 :)

无论如何,既然很少有人发布他们的代码库、基准测试,而且我的方法与大多数人不同,我认为值得与大家分享。我原本打算发布一份更详细的图文报告(也许发表我的第一篇论文?),既然没拿到金牌,我有点泄气 :)

我还花了1.5个月的时间优化Pinball损失的方向搞反了(用了 < 而不是 >=)。这真不太聪明。

写完这篇文章后,我刚刚提交了一个经过0.97调整的分数(没试过其他调整)。这本来能让我拿第一名。我更受挫了 ^^

系数调整图

代码

我的 GitLab 仓库。

数据中的偏差

通过绘制随时间变化的活跃商品数量,我们可以看到全球增长并不是由于沃尔玛门店的增长,而可能是由于数据集构建方式的偏差。

因此,当预测聚合序列时,实际上它不是该序列的历史总销售额,而是当时活跃的选定产品的销售额。

有趣的是,总销售额在上升,但每个产品的平均销售额在下降。这大概可以用生存偏差来解释。销售多年的商品之所以是“幸存者”,是因为它们是畅销品。早年(2012/13年)表现较差的商品被淘汰,并在我们的数据集中被新产品取代。

数据增强

一个日期可以从不同的时间跨度(1到28天)进行预测。每个时间序列都是小数据,因此我期望通过数据增强获得显著更好的结果。

注意:我仅对与商品无关的粒度执行了此操作。

数据下采样

我假设商品粒度可以被视为一种逐点方法。出于性能原因,我允许自己将这些粒度的数据下采样一半。我们倾向于随机采样而不是删除部分数据(两个日期之间),因为我们假设未解释的方差主要归因于季节性因素而不是商品行为。

数据集

我经常在特征工程(FE)上花很多精力,在这次比赛中我想先专注于基准测试部分和软件工程,然后才是FE。我还是做了很多FE。如果你感兴趣,可以找到我描述关于水平扩展理念的中型文章。

注意:当使用“分层”形容词时,意味着特征被“传播”到更低的粒度。例如:total_id 的 event_trend 可以添加到 category_id 粒度。

天气_[state_id, total_id]

我试图用预测日期的温度/过去平均温度来消除过去销售数据的偏差。似乎帮助不大。我没有使用预测日期的温度,因此符合规则。

Fe_sales_historical

序列在不同时间窗口 [3, 7, 14, 28, 56, 112] 上的历史平均销售额。

不同时间窗口 [28, 56, 112] 上的历史分位数 [要预测的9个分位数,某种程度上的目标编码]。

序列在窗口 [1, 2, 3, 4] 上同一周几的历史平均销售额。

多个窗口的历史平均价格。

Dayofyear_trend_hierarchical

date_to_predict / date_from 的 day_of_year 平均趋势的包外(每年被视为一折)目标编码。

看到圣诞节前后爱好类别的趋势很有趣。

预测日期 t 取决于:

  1. 历史销售额计算的是该月的哪几天(包括该月的第一个星期六有巨大影响)
  2. 预测的时间跨度(我们预测的是该月的第一个还是最后一个星期六)

这是一个对于树模型来说极难处理的

同比赛其他方案