389. M5 Forecasting - Uncertainty | m5-forecasting-uncertainty
在2019年数据科学碗比赛中,我因为选错了提交文件而错失了金牌区,这次我又以一名之差错过了,真可惜。不过,如果这能成为我继DSB之后的第二个学生第一名奖项,我也非常开心。
以下是我的方案简述:
我主要关注比赛的准确性部分(尽管我最终的私榜排名并不是很好(274/5558)),并决定采用逐日的LGBM模型。用于创建我对时间跨度 h=8 的不确定性预测的笔记本可以在这里找到:
https://www.kaggle.com/tobiit/m5-uncertainty-lgbm-f8-eval/
其他预测时间跨度的笔记本与此类似。
对于每个时间跨度,执行以下步骤:
对于每个分位数 q,我在所有时间序列上训练了一个 LGBM 模型,目标函数为 'quantile','alpha'=q。最后28天留作早停的验证集。训练期间使用了 WSPL 权重,将其传递给 LGBM 数据集:
train = lgb.Dataset(train[features],train[['demand']],weight=train['weight'])
基于我在准确性部分工作中的一些交叉验证测试,我想出了以下针对所有销售时间序列(聚合的和普通的)的标准化方法:
首先,我将每个时间序列除以其非零均值。
其次,为了去除趋势,我考虑了某种形式的差分,并为每个均值标准化的时间序列 a[t] 设定:
a_trendRemoved[t]=a[t]+maxRollMean(28)-laggedRollMean(28,h)
这里 maxRollMean(28) 是时间序列在提供的1941天中任意28天期间的最大滚动平均值。laggedRollMean(28,h) 是 a[t-28-h+1],...,a[t-h] 的平均值。
那么我是怎么想到这个的呢?其实我想用类似这样的东西:
a_trendRemoved[t]=a[t]-rollMean(28)
意思是时间 t 的销售额与过去28天平均值的差异。然而,在预测后撤销这种预处理需要使用 F1,...,F(h-1) 天的预测值来构建 rollMean(28),我希望每个时间跨度的预测独立于所有其他预测,以防止误差传播。因此,我决定用 laggedRollMean(28,h) 代替 rollMean(28)。进一步添加 maxRollMean(28) 项确保所有值保持为正。我以为这不重要,但在我的交叉验证实验中,它给出了更好的结果,所以我使用了它。