机器学习如何在足球比赛数据分析中应用?
足球的还没有实验过,但是篮球领域已经有过类似的研究了:
下文已经发表在第四范式专栏中。
铛铛or唰唰,机器学习预测科比的投篮中不中?
Part 1
科比·布莱恩特,广大的中国篮球迷对于这个名字应该非常熟悉,当然也各自怀抱着不同的感情。可是无论你是黑还是粉,有一点应该是被广泛认可的:科比是21世纪以来,整个NBA联盟里进攻方式最无解、得分技巧最全面的球员。他的每一次出手都伴随着自信,令对手提心吊胆,即使可能在那之前他已经连丢了许多投篮。横亘20年的职业生涯,他的比赛录像被一遍遍地研究,人们希望能总结出一些规律,用以限制这个几乎无所不能的男人。
那么问题来了,我们可不可以结合经验和已知的信息,用最科学的方式评估科比的某一次出手能够命中篮筐的几率呢?答案是肯定的,机器学习对于分析数据、理论预测最为在行。在大数据的思维下,即使面对体育比赛这样瞬息万变的场景,机器学习也可以发现其中的“蛛丝马迹”。
问题起源于kaggle(一个数据科学社区)上的一次公开竞赛,我们掌握的数据是科比20年NBA职业生涯中所有投篮出手(field goal attempts)的相关信息,包含以下这些条目:
除此之外,自然还存在一个label:shot_made_flag,即本次出手是否命中。所有三万多条数据中的5000条选作测试集,其label值被隐去,最终的工作就是要在学习其余数据的基础上,预测这5000次出手命中的可能性。
在预测5000次出手命中的过程中,我们也发现了一些有意思的结果:
重要的单一特征主要有 3 类,出手类型(细)、出手区域类型和出手距离。预测科比是否能投中,最重要的是一个组合特征是出手方式(细)和出手距离,特征重要性 0.6099。出手方式和出手距离组合起来,我们能学习到在不同的出手距离时,科比不同的出手方式对最终是否命中有显著的影响。出手方式和赛季的组合特征也非常有效,特征重要性 0.6049,这两者结合起来可能是大数据反映出科比在不同赛季拿手或常用的得分方式不同。出手方式和对手球队名被组合起来了,因为不同球队的防守传统不一样,有些球队专注于培养外线铁闸,有些球队热衷内线巨兽;那么面对不同的防守重心,科比选择攻击篮筐还是外线投射在成功率的差别也被挖掘出来了。本节剩余秒数、出手类型以及比赛地点经度(代表打球的场馆)的三阶特征组合是很好的指标,特征重要性 0.5556。比赛编号也是一个重要特征,这说明了科比的手感在比赛中有一定的持续性,有时候可夜晚非常准,例如对猛龙的比赛,而有的时候就会打铁一整晚。科比出手点的球场位置也有很强的预测性,但其中出手点的 x 坐标(球场宽边的坐标)要比 y 坐标更重要(球场长边的坐标)。基于这些特征,我们最终可以预测科比的投篮是否命中,以logloss为评估指标。目前kaggle最好的效果是 0.56529。Part 2
好了,介绍完背景,准备好数据,接下来就该第四范式斥巨资开发的先知平台登场了。借助于这个科学方便的机器学习平台,我们可以系统、直观地完成这个机器学习课题。
要想让计算机学会评估科比的投篮成功率,我们自然得提供已知的范例来“教会”它。有了前面列出来的这些信息,事情就好办了。其实只有三个问题需要明确:
1.科比的投篮成功率和什么有关?
每一个信息条目,就代表着科比此次出手的一项特征(feature)。既然是特征,那么肯定与是否命中这一结果息息相关,例如:
比赛剩余时间:影响着科比出手时的兴奋和紧张程度出手距离:直接决定瞄准难度赛季:区分出年龄和伤病因素等等仔细观察某些特征,还能发现不少有趣的东西。例如球队名这一项就体现不出什么价值,因为科比二十年都待在同一支球队;对手这一变量更是饶有意味,举个例子来说,熟悉科比的球迷应该都知道,他一打猛龙就来劲。
2.有哪些因素应该组合起来描述科比的投篮?
在很多时候,单一特征不足以完整反映此次出手的某个性质,我们需要将若干特征组合在一起使用,以更合理地帮助计算机训练模型。
第四范式提供自动的特征组合算法——FeatureGo,简单地使用“自动特征组合”算子,先知平台就可以开始他的表演。
有一组被组合起来的特征是shot_zone_area(出手区域,包括左侧、右侧等)和shot_zone_basic(出手区域类型,包括中距离、外线、禁区等),这两项特征被组合起来的理由易于理解,同时确定了角度和距离才可以定位科比出手的位置,组合起来使用是科学的方式。
还有一组特征,action_type(出手方式,包括跳投、上篮等)和opponent(对手球队名)也被组合起来了。乍一看这是没有什么联系的一组,可是仔细一分析却会有收获:球队各自的防守传统不一样,有些球队专注于培养外线铁闸,有些球队热衷内线巨兽;那么面对不同的防守重心,科比选择攻击篮筐还是外线投射在成功率上的区别应该有所体现,因此,先知平台从数据层面发现了这一专家经验,帮助我们更优地提取特征。
3.哪些因素对科比投篮影响最大?
特征种类很多,相关度自然有高有低。我们最关心的,当然是对结果影响力最强的那些特征,先知平台可以很方便地帮我们寻找出来。
我们通过先知完成特征抽取之后,可以连接“特征重要性分析”算子,通过计算后就可以得到各项特征在机器学习过程中的重要性排序。
先知告诉我们,与科比投篮成功率关联相对最大的一项特征是action_type(出手方式,包括跳投、上篮等),原因可能在于不同的出手方式,其命中率差别本身就较大,例如科比的上篮(包括扣篮)的命中率肯定会高于其中距离跳投,而中投的成功率和三分相比又会略胜一筹。类似的,下面是其他一些重要的特征:
action_type,shot_distance(组合):出手方式和出手距离组合起来,我们能学习到在不同的出手距离时,科比不同的出手方式对最终是否命中有显著的影响。action_type,season(组合):出手方式和赛季,这两者结合起来可能是大数据反映出科比在不同赛季拿手或常用的得分方式不同。shot_zone_basic:出手区域的类型,包括禁区、中距离、外线等,这也是对命中率区分度较大的因素。shot_distance:出手距离,这项单一特征的影响力不用解释。combined_shot_type:粗分的出手方式,同样对命中率产生影响。shot_zone_range:出手区域,包括左侧、右侧等,这可能反映出科比进攻选择时在不同区域舒适度有高低。有了对于特征重要度的分析报告,我们在处理重要性很高的特征项时就应该更加注意,谨慎考虑是否分桶、其泛化性如何等等关键问题。
Part 3
有了上述的分析,我们已经打好了坚实的基础,当然,预测科比的投篮没有这么简单,但是先知的“黑科技”也不远止于此,我们一步一步来实现它。
首先,我们需要将整个数据上传至先知平台,可以看到其中包含了科比职业生涯一共30697次出手的相关数据。
引入数据后,我们拖入“数据拆分”算子,先将这三万条数据拆成训练集和测试集,对于训练集中的两万五千条数据,简单地按照9:1的比例随机拆分成训练数据和测试数据。
拆分数据完成之后,就是提取特征的过程,这一过程针对不同变量有着不同的提取方式:有些离散值可以直接使用,有些连续变量则需要分桶;小数位保留太多泛化性不够,就需要向下取整;单一变量不足以完整反映某项特性,就要多个组合起来……这些复杂、技巧性强的过程先知平台都可以轻松帮你搞定:拖入“特征组合”算子,设定好学习率和随机调参次数之后,先知会为我们算出若干种特征抽取和组合方式,由于 logloss 和 AUC 具有数学一致性,选择其中AUC最高的一种来使用即可。
在完成特征提取的工作之后,下一步就要应用学习算法来生成一个预测模型了。数据经过特征自动组合之后已经全部离散化,因此我们选择逻辑回归算法来做训练。同样地,我们面临调参这个让人头大的问题,别担心,先知依然可以帮你快速搞定。我们使用“逻辑回归自动调参”算子,只需要设定调参次数、参数范围这样一些基本的指标,就可以达成反复试验以得到最佳参数的目的。
经过自动调参后,我们把最佳的参数填入逻辑回归的参数表中,这样输出就将是一个训练好的机器学习模型。下面就需要对其质量做一个检验,利用之前训练集分出来的测试数据做模型预测。由于评估标准是logloss,在输出后连接一个SQL算子,计算预测结果的logloss值。
可以看见,logloss值还较小,测试通过。最后一步,我们需要把这个模型应用到label未知的测试集上,以得到最终的结果。出于模块化的考虑,我们把这个模型导出,重新命名发布,那么之后就可以直接使用这个训练好的模型了。由于测试集中各数据的label为空,而先知平台目前暂时还不能对空集做特征抽取,因此我们引入一个PySpark自定义脚本,把这个空值设为0。接着,我们使用与前面一致的特征抽取方法对测试集特征做处理,再套上先前的模型,就可以很方便地输出结果了。
Part 4
至此,我们完成了利用机器学习评估科比单次投篮命中概率的全过程。整体看下来,先知平台完成一个机器学习项目所表现出的灵活性与方便性都非常突出。通过先知,我们可以省去很多繁琐复杂的步骤,克服很多颇具难度的问题,不仅提高了效率,也降低了机器学习应用的门槛。
回到这个课题本身,让我们来看看结果里的数据,概率高的那些情形,科比一定是最飘逸、最擅长的;概率低的那些情形,科比可能是最无助、最偏执的。这个留在无数少年青春里的男人,完成了那么多壮举,也背负了那么多骂名,如今都过去了。封存在那一串串数字里的,有他的痛点,有我们的回忆,可更多的,是一种坚持。
明白了这些,或许你就能化身懂球帝,对着墙上张贴的海报说:
科比,我已经看穿了你。
如果你对我们感兴趣,请在这里申请先知平台:https://prophet.4paradigm.com