第7名解决方案
第7名解决方案
作者:Eugene Tang | 比赛:M5 Forecasting - Accuracy
在这次比赛中,我从社区学到了很多东西,所以我想分享我的解决方案以及我在比赛中的一些心得。
在深入探讨之前,我想先感谢主办方、Kaggle以及整个社区。我从这次经历中学到了很多,很高兴能参与其中。还要感谢以下两个笔记本,我的很多灵感都来源于此:
解决方案
我的解决方案本身并不算太创新,但我达成目标的过程可能比较有趣。我在这次比赛中学到的一个重要点就是拥有可靠且快速的交叉验证方法的重要性。与其他帖子中的主题一致,我最终发现越简单越好。通过交叉验证,我删减了许多我发现没有带来太大收益的特征,以保持模型简单。
算法
梯度提升树,每个商店一个模型。
特征
- 商品ID、部门ID、类别ID
- 价格特征:当前价格、相对于过去价格的比率、价格统计数据(最大值、最小值、标准差、平均值等)
- 销量特征:递归的7天、14天滞后滚动平均值 + 28天滞后滚动平均值。没有使用滞后滚动标准差。
- 日期特征:日期属性(例如:月份、年份、是否周末、星期几等)、最近的即将到来/过去的事件名称、事件名称1、事件名称2、SNAP(补充营养援助计划)、无事件类型。
交叉验证 / 超参数优化
- 我花了一段时间才找到一种既满意又能平衡准确性和速度的交叉验证方法。为了提高训练速度,我选取了商店 CA1、TX2 和 WI3 的数据,并使用时间段 d1550-d1577、d1858-d1885、d1886-d1913 作为我的交叉验证期。对于每个时期,我使用该时期之前的所有数据训练一个模型,然后使用这些模型预测该时期内的销量。
- 我通过使用不同的种子在同一个模型上运行来测试该方法的敏感性,以观察分数因随机机会而产生的波动范围。
- 即使进行了这些优化,交叉验证仍然需要一段时间:40组参数大约需要24小时。
- 我使用 hyperopt 来调整 LightGBM 参数。
- 还要感谢 这个帖子,它帮助将 LightGBM 的训练速度提高了约2倍。
尝试过但未采用的方法
我认为以下方法如果做得更好,可能会有所帮助。但是,我发现这些改进带来的收益微乎其微,因此为了简单起见,我选择不使用它们。
- 预测每天的总销量并据此调整预测值。我确实注意到,如果我能完美预测每天的总销量,分数会大幅提高。
- 对数据点进行加权。
- 改为预测每个商品的消费金额。
- 从训练数据集中移除“缺货”时期。
感兴趣的话,我还写了一篇简短的博客文章,总结了一些高层次的收获。
希望这些想法对您有所帮助,我很乐意回答任何问题!