返回列表

54th place solution [No lottery - just a baseline]

390. M5 Forecasting - Accuracy | m5-forecasting-accuracy

开始: 2020-03-03 结束: 2020-06-30 销量与需求预测 数据算法赛
第54名方案 [非运气 - 仅仅是一个基线]

第54名方案 [非运气 - 仅仅是一个基线]

作者:Izmaylov Konstantin
排名:54th

首先,我要感谢整个 Kaggle 社区:在这里,你几乎在每场比赛中都能学到很多新东西,而且社区非常热情。

在这篇文章中,我想分享我的方法,对我来说,这个结果并不令人惊讶。

当比赛刚宣布时,我非常有动力投入大量时间以获得高名次,但我在工作中遇到了一些挑战,因此我的比赛开始时间推迟了。我在截止日期前大约 1 个月才开始着手这项比赛,当时公共 LB(Leaderboard)已经发布了。

基于我的 CV(交叉验证)分数以及许多带有自定义乘数的顶级公共 Notebook,我决定只构建一个优秀的基线模型。

验证 (Validation)

在我看来,这是最重要的部分。

我在 3 个折上进行验证:

  • (2016-03-27; 2016-04-24]
  • (2016-04-24; 2016-05-22]
  • (2015-05-17; 2015-06-14]

在我的第 3 个验证折中,我试图选择大约与最终评估部分相同的时期——即一年中的同一时间段。

预处理 (Pre-processing)

在每个单独的时间序列中存在一些异常值和峰值,所以我做了一些平滑处理:使用过去 180 天的 MAD(中位数绝对偏差)来发现异常值,并将其替换为 7 天前的值——如果没有这种平滑处理,包含假期(如圣诞节)的滚动均值特征将无法正常工作。

模型 (Models)

  • 标准的 LGBM,使用 Tweedie 损失函数(所有日期使用 1 个模型)

    params = {
        'boosting_type': 'gbdt',
        'objective': 'tweedie',
        'tweedie_variance_power': 1.1,
        'metric': 'rmse',
        'subsample': 0.75,
        'subsample_freq': 1,
        'learning_rate': 0.03,
        'num_leaves': 2**11-1,
        'min_data_in_leaf': 2**12-1,
        'feature_fraction': 0.7,
        'max_bin': 100,
        'n_estimators': 1400,
        'boost_from_average': False,
        'verbose': -1,
    }
  • 带有 GRU 部分的 Wavenet 模型

最终提交是模型的加权平均值,系数分别为 0.8 和 0.2。

目标 (Target)

对于我的 LGBM 模型,我没有使用需求量 (Demand)作为目标——相反,我使用了需求量与 28 天前需求量的差值 (Difference)——对于基于树的模型来说,这是处理趋势的一个很好的技巧。

后处理 (Post-processing)

没有使用自定义系数 :)

特征 (Features)

非常标准,大多数可以在公共 Notebook 中找到。在我的 CV 中,滚动均值和中位数的比率效果很好。

data['ratio_mean_60'] = data['rolling_mean_t60'] / data['rolling_median_t60']

哪些方法无效 (What didn't work)

  • 带有 WRMSSE 梯度的自定义损失函数
  • 缺货预测(在这方面花了很多时间——但这并不是正确的方法)
  • 均值编码 (Mean encodings)
  • 带有上层修正的 HTS 方法 (层次时间序列方法)
  • 以及许多来自以往比赛的想法和公开的想法

参与这次比赛是一段非常棒的旅程——像往常一样学到了很多技巧,不知何故,这次比赛让我想起了 LANL 比赛,同样有着巨大的排名震荡和自定义乘数。

热烈祝贺获奖者,也非常感谢 @kyakovlev, @girmdshinsei, @sibmike,我在解决方案中引用了他们的 Notebook 和想法。

同比赛其他方案