天下杯进入一个新的阶段,很少有人能够预见到小组赛的结果。而现在是时候进入一个更加激动民气的阶段了,天下上最精良的球员们将要为自己的球队而战。本文的目标是利用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%
本文旨在解释如何利用机器学习来打算仿照中的概率,并且不试图真正得到精确的结果,由于利用的数据对现实来说是不足的(或者事宜本身可能根本无法预测)。
可以进一步改进模型的一些步骤是:
· 采取更繁芜的机器学习算法和微调超参数
· 网络更多数据,不仅包括国际数据,还包括国家团队的演习数据
· 更进一步,根据玩家统计数据建立模型,本文对这种方法进行了很好的先容