【算法比赛】NFL Big Data Bowl 数据挖掘比赛回顾

2020-04-03 18:52:56 浏览数 (2)

本文原作者:孙雨豪,经授权后发布。

导语

NFL Big Data Bowl是Kaggle上的一个数据比赛,本文旨在通过回顾比赛,梳理和学习其中的建模思路(点数据挖掘、图挖掘)、数据处理技巧(对抗验证、数据增强)、模型集成技巧(Snapshot Ensembles)。

一.背景

笔者之前与队友derkechao参加了Kaggle举办的NFL Big Data Bowl比赛并有幸跻身金牌区,本文旨在对比赛进行回顾总结以及学习其他参赛者的建模经验。

1. NFL(National Football League)

职业橄榄球大联盟(National Football League)简称NFL,居北美四大职业体育运动联盟之首,也是世界上规模最大的职业橄榄球大联盟

2. 美式橄榄球规则

美式橄榄球由相互竞争的两队各11人进行对抗,拿到控球权的一方是进攻方,目标是尽可能将球向对方阵地推进,争取越过得分线进入对方端区得分。进攻的方法有两种,持球球员(Rusher)带球向前跑阵(冲球,rushing)或将球向前抛传(传球,passing)。防守方的目的则是尽可能阻止对方进攻得分,并迫使其丧失控球权。如果进攻一方得分成功或丧失控球权,双方队伍互换攻防,比赛就这样轮流攻防的进行下去,直到四节比赛时间结束。

3. 预测冲球(rushing)结果

本次比赛的目的是通过持球瞬间的数据,预测该次冲球获得的码数(跑的距离)。预测结果为冲球不同距离的概率分布,即-99码~99码这199个距离分段下每个分段的概率,最终以Continuous Ranked Probability Score (CRPS)对预测结果进行评价,指标值越低效果越好。

可获取的信息包括队员信息、比赛信息、环境信息,详细字段可以参考(https://www.kaggle.com/c/nfl-big-data-bowl-2020/data)。根据前期的EDA(https://www.kaggle.com/jaseziv83/comprehensive-cleaning-and-eda-of-all-variables)我们可以发现冲球结果主要与队员信息相关(包括队员画像特征、比赛站位、瞬时速度和加速度等),因而之后的建模中也主要考虑使用队员的信息进行建模。

二.建模

1. 数据预处理

1.1 缓解空间数据稀疏性-特征相对化

由于原始的空间数据存在稀疏的性质(某人恰好在某个位置的概率很小),我们通常会使用相对位置、速度替代绝对位置、速度作为特征,减小数据稀疏性带来的难学习问题。在NFL比赛中我们将所有球员的位置、速度特征都取持球球员的相对值。

1.2 特征选择-对抗验证(Adversarial Validation)

特征选择相信大家都非常熟悉,不管是通过KS、AUC等指标筛选特征还是利用树模型筛选特征,其实都是对特征区分度进行测试。然而有时我们会发现某个特征区分度很高但放在模型中却让结果变差了,这时我们可以通过对抗验证的方法对特征在训练数据和验证数据中的分布一致性进行检测。具体的,通过将训练数据标为1,验证数据标为0并利用xgboost或lgbm建立二分类模型,通过模型AUC和特征重要性我们可以发现某些特征能准确区分训练集和测试集,而这些特征往往会对模型产生不好的影响,通常我们会进行处理或直接丢弃。

在NFL比赛中通过对抗验证我们可以发现角度特征在17年和18年的比赛中分布不一致,进一步分析可以发现两年的0度方向不一致,若直接建模会导致结果较差。通过对该特征进行旋转修正可以获得较大的分数提升。

从上图可以看出2017年数据分布和2018-2019年数据分布不同,需要对特征进行修正

1.3 数据增强-坐标翻转

在机器学习任务中,当样本量较小时,可能导致训练数据分布与真实数据分布差别较大,从而导致学出来的模型无可避免地存在一定偏差。针对这种情况,我们一般可以采用迁移学习或者数据增强的方法来缓解问题,而在这个任务中由于没有外部数据我们只能通过数据增强来缓解训练数据存在偏差的问题。在图像类任务中我们可以采用平移、旋转、翻转、缩放、裁剪等操作,对于数值类任务可以用SMOTE等插值算法进行数据增强,而位置类数据增强方法则和图像类似。这个任务中由于我们使用的特征是相对于持球球员的,等价于进行平移增强,除此之外我们发现比赛在y轴方向存在对称性,因而可以通过翻转的方式进行增强。

垂直翻转数据增强示例垂直翻转数据增强示例

2. 模型选择分析

2.1 表格数据比赛常用技术方案

目前kaggle社区中针对于表格数据最热门的模型莫过于梯度提升树模型(xgboost,lgbm,catboost等),梯度提升树模型的优势在于不需要像nn一样对模型结构和超参进行大量调试,同时计算速度也相对较快。相对的,树模型对于前期特征工程质量特别敏感,特征处理的不同会对最终结果造成非常大的影响。表格数据类比赛常用的方法就是:使用树模型做主模型并在其基础上进行特征工程,之后使用特征这些特征(可能有微调)用NN、SVM、KNN建模,由于这些模型结构原理差异较大,学出来的结果偏差不同,通过集成(Blending或Stacking)能一定程度上减小结果方差,从而提升最终效果。

2.2 NFL比赛相对于其他表格数据比赛的区别

(1)需要刻画多个对象之间的关系

在对多个对象建模时,不仅需要对对象本身的属性进行刻画,还需要对对象之间的关系进行刻画。当研究对象数量较少时,采用手工提取特征的方式通常可以满足需求,如针对两个对象我们常常使用pairwise的模型进行建模。然而针对有22个队员的任务来说,手工提取特征变得十分困难,效果也难以保证。

相比于每个队员本身的特征,队员之间的站位配合等因素对最终结果影响更大

(2)样本缺失和结果平滑

由于xgboost和lgbm多分类任务需要每个类别都有样本数据,而NFL比赛的训练数据中缺少某些类别的样本,故不能直接使用199分类模型,需要进行结果聚合(把199分类合并成20分类)或扔掉缺失类别,这导致了模型输出结果不够平滑,在crps指标上效果不太好。此外,如果将问题转化成回归问题,则会导致预测的概率密度集中在一个点上,也无法很好地适应crps指标。

(3)时间有限

由于整个模型训练和预测需要在kaggle提供的服务上运行,且规定整体耗时不超过4小时。模型复杂度受到了一定限制,且无法进行太多模型的集成。因而效果好的单模型成了比赛制胜的关键。

结论:相对于梯度提升树模型,nn模型在复杂关系建模和输出结果连续性上更具有优势。

3. 建模思路分析

3.1 抛砖引玉:MLP Attention

整个比赛可以看作是1个持球球员(Rusher)和10个队友突破敌方11个防守队员的游戏,一个基本思路是通过对这三部分信息分别表征,然后融合建模得到最终结果。一开始我们想到的方法是对于持球队伍和敌方队伍,分别使用不同的Dense层作为编码器对每个球员的特征进行Embedding,由于我们需要保证球员之间的无序性(在输入层的顺序不影响最终结果)所以需要在上层对每个队伍球员的特征进行聚合,而最通用的办法就是Embedding求和得到队伍的Embedding,之后再将两个队伍的Embedding拼接后通过Dense层 Softmax得到最终结果,网络结构如下图所示。

然而这样的结构在实验的时候结果始终不够理想,其中很大一个原因就是从球员Embedding生成球队Embedding这步建模太过简单,仅仅将所有队员加和无法突出某些处在关键位置的球员对局势的影响,为了解决这个问题笔者引入了Attention机制来建模每个球员的重要性,网络结构如下。

首先我们依旧通过Dense层对每个球员的特征进行编码,之后利用一个Attention层求取每个球员的重要性,再按照重要性对球员加权求和得到队伍的Embedding。通过引入Attention机制笔者的队伍排名最终前进了5名。

该模型的优点:

1. 结构简单,计算速度快

2. 对持球球员、队友、对方分别表征,特征选择比较灵活

该模型的缺点:

1. 只是对整个球队进行表征,缺乏对球员之间关系的描述

2. 模型结构简单,学习能力有限

3.2 增加模型复杂度:引入Transformer多头注意力

由于MLP Attention的模型存在结构过于简单,且计算Attention Weight的时候缺乏对手的信息,导致整个模型存在一定的信息损失,而最近在NLP领域大火的Transformer则恰好能解决这个问题。

transformer的多头注意力机制能学习更加复杂的对象间关系

Transformer的多头注意力机制能从不同角度对每个对象的重要性进行评价,从而能更好的学习输入对象中存在的各种关系并对其进行表征。与LSTM等RNN单元不同的是,Transformer一次性读取一整句话的内容并通过position embedding对词的位置进行标定,而对于本次比赛任务来说,由于队员间并没有明确的排序,所以我们在使用Transformer的时候只要舍弃position embedding就能将其作为一个无顺序的带注意力机制的编码器。整体网络结构示意图如下。

模型采用了2层Encoder 2层Decoder的结构。Encoder的输入为22个队员(类比于22个词)的特征(类比于22个词向量)输入除了没有position embedding之外和NLP任务一致。而Decoder侧稍有不同,在NLP任务中Query使用的是前一个位置Decoder的输出,而NFL比赛中使用的是rusher的feature作为Query,一方面是增强了对rusher信息的关注,另一方面舍弃了顺序信息,保证只输出一个向量。

该模型的优点:

 大量注意力机制使模型学习能力强

该模型的缺点:

仍然缺乏对球员之间关系的描述

3.3 问题的关键还是关系:用CNN进行图建模

橄榄球比赛的本质是球员之间的合作和竞争,缺少了对关系的建模必然无法实现准确的预测,而一说到关系我们很容易想到通过图模型对问题进行建模。而相对于其他图挖掘任务来说,由于比赛的人数固定,球员之间关系网络的拓扑结构也就固定,因而我们可以直接通过cnn对关系进行建模。

回到MLP Attention模型,我们仍然将球员分为持球球员、队友、对手三部分,但现在我们不急着将这三部分信息进行表征,而是思考这三者的关系,持球球员仍是我们关注的核心,而队友和对手,其实本质上是持球球员的Ego Network里的两类节点,而对球员关系建模其实就是对这两类节点形成的二部图进行建模。

从图的视角来看,其实就是对以持球球员为中心的队友-对手二部图进行建模

本次比赛第一名的队伍使用了CNN对这个二部图进行建模,CNN的每个channel为队友和对手的邻接矩阵,矩阵中每个元素为对应队友-队友Pair对的特征,每个channel对应不同特征。模型结构如下图所示。

注:def指对手(denfense),off指进攻队友(offense),rusher指持球球员,Sxy指速度的xy分量,X,Y为球员位置

输入数据为(11x10x10)的Tensor(11个对手,10个队友,10个特征,每个channel可以看作是11个对手和10个队友的邻接矩阵),模型中使用了1x1卷积 Relu对每个队友-对手Pair的10个特征进行非线性变换,然后进行池化(保留对手维度),接着又进行了一维卷积和相对应的池化操作,最后通过Dense Softmax层得到结果。

可以看出整个模型的特征和结构都非常简单,而与前面的模型唯一不同的是该模型对球员之间的关系进行了显示的建模,而比赛结果也体现了其效果的显著性,该模型当之无愧地获得了比赛的第一名。

3.4 一个模型也能集成:Snapshot Ensembles解决多模型集成耗时问题

由于NFL比赛限定了训练 预测整体耗时不能超过4小时,因而多个模型学习 集成的思路是不可行的,而Snapshot Ensembles则通过“一次训练,多快照集成”的方式达到了集成的目的。Snapshot Ensembles通过在训练过程中周期性地增大或减少学习率让模型重复越过局部最优和接近局部最优的过程,实现每个快照擅长处理不同数据的目的。Snapshot Ensembles中的每个模型快照都不如通常恒定或递减学习率学习出来的模型,但是多个快照集成之后却能让模型整体获得提升,从而获得更好的预测效果。

每个插旗的地方为一个snapshot

三.总结

从本次比赛中总结的经验和教训:

1. 建模时首先思考研究对象之间的关系是否是建模关键

最近几年图数据挖掘技术突飞猛进,对图、关系的挖掘和建模得到了很大的发展。关系在现实生活中无处不在,如何理解数据中存在的关系将是建立一个“好”模型的关键。对于一个建模任务,首先要思考建模对象之间是否存在很强的关联性,如果存在则需要从图挖掘的角度进行切入。

2. 不仅要知道一个模型/算法一般怎么用,还要举一反三了解其潜在的作用

我们都知道transformer在NLP任务中得到了广泛的应用,但其本质其实还是一个基于注意力机制的编解码器,如果了解到这一点则可以在很多其他类型任务中发挥其作用。在学习一个模型/算法时,不仅要了解其一般怎么用,还要从其本质分析其还能在哪些场景发挥作用,只有通过举一反三我们才能使用有限的算法更好的对数据进行建模。

3. 数据挖掘的根本问题还是在于对数据的理解

如果对图数据不熟,则怎么也会想到从关系的角度对橄榄球比赛进行建模。不同数据有不同的处理方法,掌握方法需要不断积累,但同时也需要我们总结和抽象。一方面我们需要对不同类型的数据广泛涉猎,保证在挖掘建模时思路不会僵硬,另一方面对于一类数据,我们不仅要掌握相关模型,也需要对 数据采集-数据处理-挖掘建模-上层应用 整个链路进行深入理解。

四.参考链接

对抗验证介绍 :https://www.kaggle.com/kevinbonnes/adversarial-validation

Transformer原理介绍:http://jalammar.github.io/illustrated-transformer/

数据增强介绍:https://zhuanlan.zhihu.com/p/41679153

Snapshot Ensembles介绍:https://zhuanlan.zhihu.com/p/62647769

另外分享一个介绍ensemble的好文:https://mlwave.com/kaggle-ensembling-guide/

0 人点赞