返回列表

7th place (public LB) solution : NN + Survival LGBM

356. NFL Big Data Bowl | nfl-big-data-bowl-2020

开始: 2019-10-09 结束: 2020-01-06 赛事预测 数据算法赛
第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的差距,但最终我们开始对验证集过拟合。事后看来,我们可能处理得太轻率了,有些团队分享了更好的验证方案。

使用LGBM进行生存建模以学习“码数”分布 - 作者 @sebastienconort

在这部分,与许多竞争对手不同,我们没有将问题视为多分类问题,而是视为回归问题,对到达的码数采用生存建模方法。“时间”变量是“目前跑过的码数”,“死亡”事件是跑卫被拦截。
如果您对更多细节感兴趣,请参阅本文末尾的注释:(用于码数预测的生存建模注释)。
根据时间和本文读者的反馈,我们可能会发布一个描述此方法的教程笔记本,这对流失预测或保险定价非常有用 😄
如果没有下述的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 那样将这些视为缺失值。非常遗憾,并对他那出色的数据准备工作表示高度赞扬。
  • 我们尝试预测跑卫实际移动的距离,因为在我们看来这更自然。然而,令我们惊讶的是结果
同比赛其他方案