第7名(公共LB)解决方案:NN + Survival LGBM
第7名(公共LB)解决方案:NN + Survival LGBM
作者: Lam Dang, Sebastien Conort
发布时间: 2019-11-28
首先非常感谢组织者举办这场非常有趣的比赛。任务具有挑战性,球员的追踪数据非常迷人。
以下是我们最终解决方案的总结。它是自动特征学习和手动特征工程的结合。
最终解决方案是1个深度学习模型和1个LGBM的混合。DL模型和文章主要由我负责,而Sebastien负责使用LGBM进行生存建模。
感谢 @sebastienconort,很高兴能一起参加这次比赛。
验证
我们使用最后2000个 play_id 作为验证。开始时与LB(排行榜)有稳定的0.0001的差距,但最终我们开始对验证集过拟合。事后看来,我们可能处理得太轻率了,有些团队分享了更好的验证方案。
在这部分,与许多竞争对手不同,我们没有将问题视为多分类问题,而是视为回归问题,对到达的码数采用生存建模方法。“时间”变量是“目前跑过的码数”,“死亡”事件是跑卫被拦截。
如果您对更多细节感兴趣,请参阅本文末尾的注释:(用于码数预测的生存建模注释)。
根据时间和本文读者的反馈,我们可能会发布一个描述此方法的教程笔记本,这对流失预测或保险定价非常有用 😄
如果没有下述的NN嵌入,以及按距离跑卫排序的防守和进攻球员的描述性变量,此LGBM方法在公共LB上达到了0.0131。
神经网络架构
LGBM将NN的一些中间嵌入与其他变量一起作为输入。
深度学习架构包含不同部分:
- 一个MLP(多层感知器),为每对(player_i, player_j)生成交互嵌入。
- 这些交互嵌入为每个player_i求和,然后与player_i的其他输入连接。然后将其输入另一个MLP以创建players_embedding。
- 所有球员嵌入的总和与比赛级别特征连接,然后输入最终分类器。
总体而言,交互部分就像具有1轮消息传递的图神经网络(GNN)。
将球员特征、上下文特征和场地限制特征(YardLine和DistancetoYardline)分开处理,使得网络更容易正则化。
特征
- 大多数值来自球员的位置和速度,我们发现比赛级别变量有一点帮助。
- 我们通过速度将位置投影到0.5s、1s、1.5s,这些是LGBM的最佳特征。然而,我们在NN中这样做并没有看到改善。
我们在距离之上添加Voronoi特征也没有看到改善。
- 对于NN,我们发现将player_j的相对位置投影到从player_i到跑卫的方向中包含在交互特征中有很大增益。
部署
比赛的挑战之一是部署。我们最终修改了代码以使其相当保守。我们还选择将权重粘贴在内核中,并从该权重开始微调模型。
LGBM总是重新训练,因为它很快(约1分钟)。
最后对于2次提交,我们选择了1次进行NN微调,1次不进行。
有用的技巧
- 对于深度学习,我们拟合了随机搜索找到的10个最佳参数的混合,然后将输出蒸馏到1个DL模型。该最终模型的权重被粘贴在解决方案中。
- 我们在某个时候犯了一个错误,即对输入进行BatchNorm。这意味着X和Y轴的测量值被不同地缩放。这使得学习非常不稳定。移除这个并手动缩放输入有所帮助。
- 每次都有点帮助的一些技巧:
- 通过翻转Y轴增强数据
- 在训练中给目标添加噪声
- 在softmax的连续bins输出中添加l1惩罚(fused lasso)
- 在2017年数据中将方向旋转90°
没有帮助的方法
- 我们多次尝试Transformer,但效果不如我们的架构。也许我们应该在阅读其他解决方案后再试一次 :)
- 我们尝试增加更多球员之间的交互层,但似乎也没有帮助
- 我们测试了不同的激活函数,如ELU和SELU,但ReLU效果好得多。
- 在2017年数据中标准化S和A对我们不起作用。我们没有想到像 https://www.kaggle.com/wimwim 那样将这些视为缺失值。非常遗憾,并对他那出色的数据准备工作表示高度赞扬。
- 我们尝试预测跑卫实际移动的距离,因为在我们看来这更自然。然而,令我们惊讶的是结果