2018年世界杯足球赛开赛在即,全世界的球迷都想知道:谁将夺得令人垂涎的冠军杯?
如果你不仅是个球迷,还是个技术达人,我猜你已意识到机器学习和AI也是目前的流行语。我们不妨结合两者来预测谁赢得世界杯。
免责声明:本文不该用于投注或任何财务决策。你要是选择这么做,我也不会拦你(如果你中了头彩,可别忘了我)。
足球比赛涉及好多因素;正因为如此,所有这些因素无法在一个机器学习模型中加以分析。我只是想用数据搞一个有趣的项目……
目标
目标是使用机器学习来预测哪支球队将赢得2018年世界杯。
预测今年这届世界杯每一场比赛的结果。
模拟下一轮比赛,比如四分之一决赛、半决赛和决赛。
这些目标带来了一个独特而实际的机器学习预测问题,需要解决各项机器学习任务:数据整合、特征建模和结果预测。
数据
我使用了Kaggle的两个数据集,可以在这里(https://www.kaggle.com/martj42/international-football-results-from-1872-to-2017/data)找到。我们将使用自1930年世界杯开始以来所有参赛球队的历史比赛结果。
局限性:国际足联排名是上世纪90年代搞起来的,因此缺少数据集的大部分内容。于是我们坚持使用历史比赛记录。
环境和工具:jupyter笔记本、numpy、pandas、 seaborn、matplotlib和scikit-learn。
我们先要对两个数据集进行一些探索性分析,做一些特征工程以选择对预测最要紧的特征,做一些数据处理,选择一个机器学习模型,最后将模型部署到数据集上。
开始动手吧!
要紧的事先说,导入必要的代码库,并将数据集加载到一个数据框。
导入代码库
加载数据集……
为两个数据集调用world_cup.head()和results.head(),确保数据集已加载到数据框中,如下所示:
探索性分析
分析这两个数据集后,得到的数据集包含过去比赛的数据。因而得到的新的数据集对分析和预测将来的比赛很有用。
探索性分析和特征工程:这需要确定哪些特征对机器学习模型来说很要紧,这是任何数据科学项目中最耗时的部分。
现在让我们将目标差异和结果这一列添加到结果数据集。
查看新的结果数据框。
然后我们将处理数据子集,这部分包括只有尼日利亚参加的比赛。这将帮助我们专注于哪些特性对一个国家来说很要紧,然后扩大到参加世界杯的那些国家。
第一届世界杯在1930年举办。为年份创建一个列,并选择1930年以后的所有比赛。
现在我们可以直观显示历年来尼日利亚最常见的比赛结果。
获得每个参赛国家的胜率是一个有用的指标,我们可以用它来预测每场比赛的最有可能的结果。
比赛场地关系不大。
范围缩小到参加世界杯的球队
为所有参与球队创建一个数据框。
然后,我们会进一步过滤结果数据框,只显示1930年起出现在今年世界杯上的球队,并摈弃重复的球队。
创建年份列,摈弃1930年之前的比赛,并摈弃不会影响比赛结果的列,比如date、home_score、away_score、tournament、city、country、goal_difference和match_year。
修改“Y”(预测标签),以便简化我们模型的处理。
如果主队获胜,winner_team列将显示“2”,如果是平局,显示“1”,如果客队赢,则显示“0”。
通过设置伪变量,将home_team和_team从分类变量转换成连续输入。
使用pandas以及get_dummies()函数。它将分类列转换成独热(one-hot,数字“1”和“0”)表示,让它们能够加载到Scikit学习模型中。
然后,我们将X级和Y组分开,将数据分成70%是训练数据,30%是测试数据。
我们将使用逻辑回归,这是一种分类器算法。这个算法如何工作?它通过使用逻辑函数来估计概率,从而度量分类因变量和一个或多个自变量之间的关系。具体来说是累计逻辑分布。
换句话说,在给出可能影响结果的一组数据点的情况下,逻辑回归试图预测结果(赢或输)。
实际上其工作方式是,你每次为算法馈送一次比赛,同时馈送上述的“数据集”和比赛的实际结果。然后,模型学习你馈送的每一个数据如何积极或消极地影响比赛结果,影响多大。
馈送足够多的好数据,你就有了可以用来预测未来结果的模型。
模型的好坏取决于馈送给它的数据。
不妨看一下最后的数据框:
看起来很棒。现在我们准备将这个传递给我们的算法:
我们的模型在训练集上的准确率为57%,在测试集上的准确率为55%。这看起来不太好,但暂且不用管它。
这时候,我们将创建一个数据框,我们将部署模型。
我们先开始加载截至2018年4月的国际足联排名数据集(https://us.soccerway.com/teams/rankings/fifa/?ICID=TN_03_05_01)和含有从这里(https://fixturedownload.com/results/fifa-world-cup-2018)获得的小组赛阶段保留球队的数据集。排名较高的球队将被视为比赛的“热门”,因此它们放在“home_teams”这一列,这是由于世界杯比赛中没有“主队”或“客队”。然后,我们根据每支球队的排名位置将球队添加到新的预测数据集。下一步将创建伪变量,并部署机器学习模型。
预测比赛
现在你想知道我们怎么来预测?码了那么多代码,说了那么多,你啥时预测比赛?好了,马上预测比赛了。
将模型部署到数据集
我们先将模型部署到小组赛。
这是小组赛的结果。
模型预测三场平局,它还在葡萄牙和西班牙之间稳妥下注,但认为西班牙胜率高。我用该网站(https://ultra.zone/2018-FIFA-World-Cup-Group-Stage)来模拟小组赛的比赛。
下面是模拟16轮淘汰赛。
模型预测四分之一决赛在这些球队之间进行:葡萄牙对阵法国、巴西对阵英格兰、西班牙对阵阿根廷和德国对阵比利时。
预测如下:
半决赛
葡萄牙对阵巴西和德国对阵阿根廷
预测:
最后是总决赛
巴西对阵德国
预测:
根据这个模型,巴西很可能赢得这届世界杯。
进一步研究/改进的方面
数据集:为了改进数据集,你可以使用FIFA(比赛而不是组织)来评估每一个球队成员的水准。
混淆矩阵(confusion matrix)适用于分析模型预测哪些比赛出错。
我们可以尝试结合更多模型以提高准确性。
结论
为了改进这项工作,有许多事情可以做。现在不妨看看我们是否预测很准。全面披露:我不是十足的球迷。所以预测准不准风险自负。
完整的代码可以在这里(https://github.com/itsmuriuki/FIFA-2018-World-cup-predictions)找到。
领取专属 10元无门槛券
私享最新 技术干货