世界杯进行时,不想站上天台?快来学习利用机器学习模拟世界杯
点击上方关注,All in AI中国
世界杯进入一个新的阶段,很少有人能够预料到小组赛的结果。而现在是时候进入一个更加激动人心的阶段了,世界上最优秀的球员们将要为自己的球队而战。本文的目标是利用Python和数据科学的力量,尝试揭示这些比赛将呈现的一些统计数据。
在这篇文章中,我们将:
· 创建一个crawler并从Web上提取团队统计数据
· 对数据进行预处理、探索和可视化
· 下载其他类型的具有匹配结果的数据
· 合并这两个数据集并构建一个模型来预测匹配结果
· 创建一个简单的蒙特卡罗模拟,并获得2018年世界杯淘汰赛阶段的获胜者赔率
我们将要使用的一些库:
· Pandas
· Numpy
· Sklearn
· Plotly
这里的想法是制作一个机器学习算法来预测一场比赛的胜利者,然后建立一个蒙特卡罗模拟,推断出每场淘汰赛的胜率,之后再推断出成为世界冠军的概率。
本文将介绍一些图形和代码,会尽量使其更加直观。
我们的战略
大多数模拟器都倾向于使用代表团队总体能力的值。在这里,我们尝试了一种不同的方法,不仅以更复杂的方式表示总体值,而且还包含其他三个值(攻击、防御、中端),以避免简单地将所有特性融合到一个因素来决定团队的整体实力。
该模型建立在Sklearn库之上,使用Pandas数据帧来处理表中的数据,并使用Plotly可视化一些有趣的特性。
获取数据
因此,获取数据的第一步是制作一个crawler,并从国际足联指数(Fifa Index)中获取信息,这是一个获取从2004年开始的国际团队统计数据的重要来源。以下是一些重要表格:
作者使用Beautiful Soup库来访问HTML代码,并使用Pandasread_html函数将其转换为可读的数据帧。
构建一个scrapper,代码如下所示:
在打乱原始数据集后,作者保存了一个更简单的数据集(链接:https://docs.python.org/3/library/pickle.html),我们将使用这个数据集作为起点。
探索和可视化
此表包含了从2004年至2018年期间许多国际团队的国际足联评分。原始数据也包括月和日期,但为了简单起见,作者按年平均计算每个团队的绩效,以便我们方便处理数据点。让我们使用Plotly散点图直观地查看团队整体得分:
Plotly拥有令人惊叹的交互式图。让我们尝试在条形图中查看表现最佳的团队,看看他们在这些年中的变化情况。下图显示了年度评分最高的球队以及所有球队的平均表现(如白线所示)。
从图中可以看出西班牙长期以来一直处于领先地位。现在让我们打开包含国际团队匹配结果信息的CSV文件:
结果数据集来自github,由1872年的足球比赛结果、球队、得分和其他一些信息组成。
对我们来说,使用这些数据有三个重要步骤:
· 首先,由于我们只有2004年的统计数据,所以我们应该去掉所有其他年份。
· 其次,我们不能预测不在我们的主数据框架中的团队,因为我们没有对他们的评分。
· 最后我们必须围绕主场球队的情况来预测结果,因为对于世界杯预测,我们将默认所有球场都是持中立态度的。
现在让我们将团队统计数据输入到数据框架中。为此,我们将创建8个新列来实现这一目标。这就是我们现在提出的:
现在我们需要从away_score中减去home_score,这样我们就只用一个因素来代表哪支球队获胜。请注意,作者之所以使用术语"home"和"away",仅仅是因为这是原始数据集的来源,这不会对我们的分析产生任何影响。从现在开始,作者只称他们为Team 1和Team 2(Team 1始终是第一个从左到右出现在我们的数据集中)。
因此,让我们将每个团队的目标数量压缩到一个特征中,并创建一个胜利者列,这将成为预测的目标。如果获胜者> 0,则表示第1组获胜,获胜者<0表示第2组获胜。
为了进一步简化问题,作者将"帮助"模型从数据中提取信息。 因此,例如,攻击(att)将是Team1的攻击减去Team 2的攻击。
这就是我们的数据到目前为止的样子:
让我们检查一下Team 1的整体和得分之间的相关性:
你可以看到这些特性之间存在正相关关系,这表明我们的数据是有意义的。
创建模型
为了应用机器学习,作者构建了一个函数据,删除不必要的属性,使用Numpy将其转换为数组格式并将其拆分为训练和测试集,以便我们可以评估模型的准确度。
在此示例中,作者将上下文视为一个分类问题,其中我们的目标是:
1:第1队获胜
-1:第2队获胜
使用的分类器算法是逻辑回归,随机森林分类器和线性支持向量分类器:
以下是每种模型的准确度:
LR→68.4%
RF→67.9%
SVC→70.1%
在这里,SVC似乎比其他的更好,让我们分别检查每个类的表现:
我们可以在Team1上观察到更多的准确度。这可能与原始数据集中这个团队是主队的事实有关。
我们现在有一个预测器,能够以70%的准确度猜测哪支球队将获胜。足以构建一个模拟。
模拟比赛
我们首先需要的是通过小组赛阶段的世界杯球队的表现数据。 我们将建造一个类似于我们为其他年份建造的表,但现在使用来自国际足联指数的2018年世界杯统计数据。
不幸的是,看起来这些数据与2018年(非世界杯)数据没有太大差别,因为德国仍然在排名中位居第二,而实际上它已经被淘汰出局。无论如何,我们将坚持使用此来源来收集我们的数据。
我们现在距离模拟器只有几步之遥。我们将使用我们的机器学习模型作为蒙特卡罗模拟的规则。
让我们构建一个比较团队能力的函数,用我们的SVC模型评估获胜者(分别为Team 1或Team 2的1或-1)。
来看看巴西对阵西班牙表现如何?
但这里存在一个主要问题,球队表现差异很大,本届世界杯的第一阶段就已经证明了这一点。因此,让我们为它添加一些随机性,以避免每次运行模拟时结果都相同。
在这里,random_scale将决定我们想要应用于团队绩效的随机性。
最后一步是创建一个运行匹配函数的函数,并计算每个团队的胜利概率。
让我们来看看下周日克罗地亚击败丹麦将会有多难:
克罗地亚:40.62%
丹麦:59.38%
在这里你可以看到该模型估计丹麦以更高的概率击败克罗地亚,这可能是因为国际足联指数数据集可能没有到考虑克罗地亚在世界杯开始后的表现。
我们运行了越来越多的模拟,让我们来测量两个团队概率之间的差异:
我们可以看到,获胜概率在大约8,000次匹配模拟后稳定,所以这就是我们将要使用的价值。让我们建立冠军树:
考虑到我们的模型有30%的误差,让我们计算西班牙击败所有球队并获得冠军的机会:
西班牙获胜的机会:7.2%
本文旨在说明如何使用机器学习来计算模拟中的概率,并且不试图真正获得正确的结果,因为使用的数据对现实来说是不够的(或者事件本身可能根本无法预测)。
可以进一步改进模型的一些步骤是:
· 采用更复杂的机器学习算法和微调超参数
· 收集更多数据,不仅包括国际数据,还包括国家团队的训练数据
· 更进一步,根据玩家统计数据建立模型,本文对这种方法进行了很好的介绍