使用Python预测——2022年世界杯冠军是谁?
微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩
随着FIFA 2022世界杯的临近,关于哪支球队将赢得冠军的兴趣和讨论越来越多。
因此,我决定测试我的数据科学和机器学习技能,以开发一个分析历史数据的模型来模拟 FIFA 2022 世界杯的所有比赛。
数据源
为了构建机器学习模型,我们需要来自团队的数据。首先,我们需要一些能够说明球队表现的信息,这些信息可以从之前的比赛中提取出来。此外,我决定在构建功能时使用 FIFA 排名。它们将有助于量化球队在比赛中面对的对手的素质。这两个数据都可以在 Kaggle 上找到:过去的比赛和FIFA 排名。
数据集构建
哪些特征可以影响足球比赛的胜负?这个问题有一个非常开放的答案。从选定的球员到当天球场的温度,一切都会对结果产生影响。然后,我选择仅使用参与比赛的每个团队的过去统计数据构建一个数据集,优先考虑可以通过简单方式收集的可量化统计数据,例如进球数、平均排名、赢得的分数以及其他将详细点。这些数据可以在我在上一节中谈到的两个数据集的连接中找到。
此外,将仅分析 2022 年世界杯周期的表现。这个想法是只考虑世界杯备战中表现的变化。
import pandas as pd
import re
df = pd.read_csv("games/results.csv") #games between national teams
df["date"] = pd.to_datetime(df["date"])
df = df[(df["date"] >= "2018-8-1")].reset_index(drop=True) #games at the 2022 wc cycle
df_wc = df #pre-wc outcomes
rank = pd.read_csv("fifa_ranking-2022-10-06.csv") #rankings
rank["rank_date"] = pd.to_datetime(rank["rank_date"])
rank = rank[(rank["rank_date"] >= "2018-8-1")].reset_index(drop=True) #selecting games from the 2022 wc cycle
rank["country_full"] = rank["country_full"].str.replace("IR Iran", "Iran").str.replace("Korea Republic", "South Korea").str.replace("USA", "United States") #ajustando nomes de algumas seleções
rank = rank.set_index(['rank_date']).groupby(['country_full'], group_keys=False).resample('D').first().fillna(method='ffill').reset_index()
rank_wc = rank #dataframe with rankings
#Making the merge
df_wc_ranked = df_wc.merge(rank[["country_full", "total_points", "previous_points", "rank", "rank_change", "rank_date"]], left_on=["date", "home_team"], right_on=["rank_date", "country_full"]).drop(["rank_date", "country_full"], axis=1)
df_wc_ranked = df_wc_ranked.merge(rank[["country_full", "total_points", "previous_points", "rank", "rank_change", "rank_date"]], left_on=["date", "away_team"], right_on=["rank_date", "country_full"], suffixes=("_home", "_away")).drop(["rank_date", "country_full"], axis=1)
以上是创建所需数据集的代码。
数据库视图
如上所示,数据集已准备就绪,还有更多关于客队的信息。重要的是要记住国家队之间的大部分比赛都是在中立场地进行的,但我将使用“主队”和“客队”的名称来简化我谈论所涉及球队的方式。
功能开发
现在,我需要一组候选特征。有了它们,我可以进行分析,表明该特征是否具有预测能力,以了解我是否需要保留、删除或修改该特征。我作为候选计算的特征是:
-
世界杯周期和最近 5 场比赛的平均进球数。
-
世界杯周期和最近 5 场比赛的平均进球数。
-
每支球队之间的 FIFA 排名位置差异。
-
国际足联排名每支球队在世界杯周期比赛和最近 5 场比赛中平均面对。
-
从周期的第一场比赛到现在,FIFA 排名的积分增加。
-
FIFA 排名 5 场比赛前和现在的积分增加。
-
世界杯周期和最近 5 场比赛的平均局分。
-
根据世界杯周期和最近 5 场比赛中的排名位置加权平均赢得的比赛积分。
-
分类变量告诉游戏是否是友好的。
前两个特征用于量化一支球队的进攻力和防守力。国际足联在比赛中排名位置的差异是用来量化国际足联计算的两队实力的差异。面对平均排名用于分析球队面对的对手的实力。
国际足联排名积分的增加是为了分析世界杯周期和最近5场比赛中球队质量的增加。
球队的场均胜率是纯粹量化球队的表现,而球队的场均胜负加权平均是根据球队所面对的对手的排名位次进行加权,以分析球队的表现是否高对低水平的对手。
要基于 FIFA 排名构建特征,有两种选择:使用 FIFA 排名积分,或使用 FIFA 排名位置。除了排名的增加,我选择在所有功能中使用排名位置。我没有创建相同的功能,仅通过 FIFA 排名点改变 FIFA 排名位置,因为这些列是非常负相关的,如下所示。
那么,通过使用排名的分数和排名的位置来创建加权平均游戏积分等特征的两个版本是没有意义的,因为它们会产生相同的结果。
数据分析
在建模之前,需要分析将要预测的内容。然而,理想的预测是赢、平、输,一个 3 类分类问题很难分析和评估。然后,我决定在两个类别之间进行预测:主队赢和主队平/输。
为了分析与目标相关的特征,我将使用小提琴图和箱线图。这个想法是分析它们的分布如何与每个类的值相关,以及它们是否可以很好地分离数据。
第一组数据的小提琴图
对于第一组数据,已经创建的,只有rank_dif,两队排名的差值,对target classes有影响。因此,我将根据差异创建更多特征,因为它们似乎是很好的预测指标:
-目标差异。
-
遭遇净胜球。
-
球队进球与对手进球之间的差异。
我再次分析了小提琴图。
小提琴图的新特点
目标的差异和目标的差异所遭受的特征有很好的影响。然而,映射球队进球与对手进球之间差异的特征没有影响。因此,我们现在:
-
排名差异。
-
世界杯周期和最近 5 场比赛的进球差异。
-
在世界杯周期和最近 5 场比赛中出现净胜球。
此外,我们还可以计算积分的差异、排名位置的差异以及排名所获得的积分差异。而且,为了衡量对手的水平,我考虑了以下特征:排名所造成的进球与所遭受的进球之间的差异。
由于规模小,用小提琴查看这些数据不是很有效。然后,我也会分析这些数据的箱线图。
Violin 和 Boxplot 的差异特征
积分差异、排名的进球差异、排名的积分差异和面临的排名差异是很好的特征。但是,他们最近 5 场比赛的版本和他们整个周期的版本似乎是相关的。我会在下面检查这个。
特征的相关性 分析相关性可以看出,在排名做出的目标差异中,理想的是只选择其中一个版本,而我选择了考虑全周期的版本。对于其他人,可以同时使用这两个版本。
然后,作为特征,我们有:
-
排名差异(rank_dif)
-
世界杯周期和过去 5 场比赛的平均进球数之间的差异 (goals_dif/goals_dif_l5)
-
世界杯周期和过去 5 场比赛平均进球数之间的差异 (goals_suf_dif/goals_suf_dif_l5)
-
世界杯周期和最近 5 场比赛的平均排名差异 (dif_rank_agst/dif_rank_agst_l5)
-
世界杯周期平均排名加权进球数之间的差异 (goals_per_ranking_dif)
-
世界杯周期和过去 5 场比赛中排名平均得分之间的差异 (dif_points_rank/dif_points_rank_l5)
-
表示是否友好的分类变量 (is_friendly) 这样,我们就有了一个数据库,其中包含应用机器学习模型所需的功能。
数据库的一些特性
附录:
-
过去的比赛 https://www.kaggle.com/datasets/martj42/international-football-results-from-1872-to-2017
-
FIFA 排名 https://www.kaggle.com/datasets/cashncarry/fifaworldranking
推荐书单
《PyTorch深度学习简明实战 》
本书针对深度学习及开源框架——PyTorch,采用简明的语言进行知识的讲解,注重实战。全书分为4篇,共19章。深度学习基础篇(第1章~第6章)包括PyTorch简介与安装、机器学习基础与线性回归、张量与数据类型、分类问题与多层感知器、多层感知器模型与模型训练、梯度下降法、反向传播算法与内置优化器。计算机视觉篇(第7章~第14章)包括计算机视觉与卷积神经网络、卷积入门实例、图像读取与模型保存、多分类问题与卷积模型的优化、迁移学习与数据增强、经典网络模型与特征提取、图像定位基础、图像语义分割。自然语言处理和序列篇(第15章~第17章)包括文本分类与词嵌入、循环神经网络与一维卷积神经网络、序列预测实例。生成对抗网络和目标检测篇(第18章~第19章)包括生成对抗网络、目标检测。
本书适合人工智能行业的软件工程师、对人工智能感兴趣的学生学习,同时也可作为深度学习的培训教程。
作者简介:
日月光华:网易云课堂资深讲师,经验丰富的数据科学家和深度学习算法工程师。擅长使用Python编程,编写爬虫并利用Python进行数据分析和可视化。对机器学习和深度学习有深入理解,熟悉常见的深度学习框架( PyTorch、TensorFlow)和模型,有丰富的深度学习、数据分析和爬虫等开发经验,著有畅销书《Python网络爬虫实例教程(视频讲解版)》。
购买链接(新书限时5.5折):https://item.jd.com/13528847.html
精彩回顾
微信搜索关注《Python学研大本营》
访问【IT今日热榜】,发现每日技术热点