用Python预测世界杯球赛结果,还别说准确度还是蛮高的

前言

那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案。

今天我就通过Python数据分析以及机器学习等方式来预测一下谁能获得最后的冠军,当然最后预测出来的结果也仅仅只是作为一种参考,并不代表最后真实的结果。

数据集的准备

这里我们用到的数据集是来自kaggle的公开数据集,其中的一份数据集是2018年俄罗斯世界杯每小组各成员交手的记录,最后小编的预测基于该份数据集的基础之上,另外一份数据集则是从1870年开始到2022年截止,所有参赛球队的历史交手成绩汇总。那么我们首先导入要用到的模块以及导入数据集。

模块和数据集的导入

数据分析和可视化要用到的模块分别是pandas、matplotlib以及seaborn,而机器学习预测要用到的模块是sklearn,代码如下

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
import matplotlib.ticker as ticker 
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

着我们导入数据集

world_cup = pd.read_csv("World_Cup_2018_Dataset.csv")results = pd.read_csv("results.csv")

我们可以通过head()方法来查看导入数据及的前几行,校验一下数据的导入是否成功,代码如下

world_cup.head()

output
在这里插入图片描述

探索性数据分析和特征工程

接下来我们要做的便是探索性数据分析和特征工程了,来对数据集有一个大致的了解,同时生成一些针对最后的预测大有帮助的特征出来,例如我们针对比赛当中的比分来判断比赛是谁胜谁负,或者是平局,代码如下

winner = []
for i in range(len(results["home_team"])):if results["home_score"][i] > results["away_score"][i]:winner.append(results["home_team"][i])elif results["home_score"][i] < results["away_score"][i]:winner.append(results["away_team"][i])else:winner.append("Draw")results["winning_team"] = winner
results["goal_difference"] = np.absolute(results["home_score"] - results["away_score"])
results.head()

output
在这里插入图片描述
紧接着我们针对某个单独的国家,统计历史过往中所有比赛的胜负率情况,例如小编比较喜欢阿根廷队,就筛选出阿根廷队的历史战绩,代码如下

df = results[(results["home_team"] == "Argentina") | (results["away_team"] == "Argentina")]
argen = df.iloc[:]
argen.head()

output
在这里插入图片描述
么同时我们也知道第一届世界杯举办的时间是1930年在乌拉圭举办的,那么筛选出在1930年之后的所有比赛的成绩,代码如下

year = []
for row in argen['date']:year.append(int(row[:4]))
argen["match_year"] = year
argen_1930 = argen[argen.match_year >= 1930]
argen_1930.head()

在这里插入图片描述
我们将比赛的结果的统计可视化出来,其中我们就能清晰地看到阿根廷球队的胜负率的情况,代码如下

x = ["Argentina","Loss","Draw"]y = [474, 220, 173] 
sns.barplot(x, y)plt.title("win games vs loss games")
plt.xlabel("win vs loss")plt.ylabel("count")plt.show()

在这里插入图片描述

俄罗斯世界杯的参赛队伍

我们先将目标锁定在2018年俄罗斯世界杯的参赛队伍上,总共是以下这几支球队

world_cup_russia = ["Australia", "Iran", "Japan", "Korea Republic", "Saudi Arabia", "Egypt", "Morocco",                   "Nigeria", "Senegal", "Tunisia", "Costa Rica", "Mexico", "Panama", "Argentina", "Brazil",                     "Colombia", "Peru", "Uruguay", "Belgium", "Croatia", "Denmark", "England", "France",                     "Germany", "Iceland", "Poland", "Portugal", "Russia", "Serbia", "Spain", "Sweden", "Switzerland"]

然后我们筛选出来这32支球队的过往的比赛成绩,代码如下

df_team_home = results[results['home_team'].isin(world_cup_russia)]
df_team_away = results[results['away_team'].isin(world_cup_russia)]
df_teams = pd.concat((df_team_home, df_team_away))
df_teams.drop_duplicates(inplace=True)df_teams.tail()

在这里插入图片描述
我们着重看的是1930年之后的比赛记录,那么我们再进行一次筛选,代码如下

year = []
for row in df_teams["date"]:year.append(int(row[:4]))
df_teams["match_year"] = year
df_teams_1930 = df_teams[df_teams.match_year >= 1930]
df_teams_1930.head()

在这里插入图片描述
当然我们在最后进行预测的时候,会有一些无关紧要的特征掺杂其中,我们需要将其去掉,代码如下

df_teams_1930 = df_teams.drop(['date', 'home_score', 'away_score', 'tournament', 'city', 'country', 'goal_difference', 'match_year'], axis=1)df_teams_1930.tail()

在这里插入图片描述
我们需要将winning_team这一列的标签做一次转换,将赢得比赛的标签改为2,输掉比赛的标签改为0,而平局的标签改为1,代码如下

df_teams_1930 = df_teams_1930.reset_index(drop=True)
df_teams_1930.loc[df_teams_1930.winning_team == df_teams_1930.home_team,'winning_team']=2
df_teams_1930.loc[df_teams_1930.winning_team == 'Draw', 'winning_team']=1
df_teams_1930.loc[df_teams_1930.winning_team == df_teams_1930.away_team, 'winning_team']=0
df_teams_1930.tail()

在这里插入图片描述
紧接着,我们需要对这些离散类型的变量进行独热编码,用到的是pandas模块当中的get_dummies()方法,代码如下

# convert home team and away team from categorical variables to continous inputs 
# Get dummy variables
final = pd.get_dummies(df_teams_1930, prefix=['home_team', 'away_team'], columns=['home_team', 'away_team'])
final.head()

在这里插入图片描述

划分出训练集和测试集,调用的是train_test_split()方法,代码如下

# Separate X and y sets
X = final.drop(['winning_team'], axis=1)
y = final["winning_team"]
y = y.astype('int')# Separate train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)

逻辑回归算法

那小编这里调用的是非常简单的逻辑回归的算法,读者朋友后续也可以尝试其他的分类算法进一步的完善一下整个预测的流程与结果,代码如下

logreg = LogisticRegression()
logreg.fit(X_train, y_train)
score = logreg.score(X_train, y_train)
score2 = logreg.score(X_test, y_test)print("Training set accuracy: ", '%.3f'%(score))
print("Test set accuracy: ", '%.3f'%(score2))

预测结果

那么最后便是将我们训练出来的模型去做一个预测了,我们先前的数据集当中有主队和客队之分,但是在世界杯的赛场上没有,这里我们就依据世界排名的先后顺序来划分一下,因此需要导入世界排名的数据集

# 导入新的数据集,各球队的世界排名
ranking = pd.read_csv('datasets/fifa_rankings.csv') 
# 2018年俄罗斯世界杯的对阵情况
fixtures = pd.read_csv('datasets/fixtures.csv')pred_set = []

在数据集当中插入主队和客队排名的字段,代码如下

# 插入两个新的字段,主队和客队排名的字段
fixtures.insert(1, 'first_position', fixtures['Home Team'].map(ranking.set_index('Team')['Position']))
fixtures.insert(2, 'second_position', fixtures['Away Team'].map(ranking.set_index('Team')['Position']))# 我们筛选出来在小组赛中的对阵情况
fixtures = fixtures.iloc[:48, :]
fixtures.head()

在这里插入图片描述
根据排名的高低来重新修正参赛球队是作为主队还是客队,代码如下

# Loop to add teams to new prediction dataset based on the ranking position of each team
for index, row in fixtures.iterrows():if row['first_position'] < row['second_position']:pred_set.append({'home_team': row['Home Team'], 'away_team': row['Away Team'], 'winning_team': None})else:pred_set.append({'home_team': row['Away Team'], 'away_team': row['Home Team'], 'winning_team': None})pred_set = pd.DataFrame(pred_set)
backup_pred_set = pred_setpred_set.head()

在这里插入图片描述
还是和之前一样的,我们需要对这些离散类型的变量进行编码,这里就不做演示了,我们调用训练好的模型并且进行比赛结果的预测,代码如下

# 小组赛对决的预测 
predictions = logreg.predict(pred_set)
for i in range(fixtures.shape[0]):print(backup_pred_set.iloc[i, 1] + " and " + backup_pred_set.iloc[i, 0])if predictions[i] == 2:print("Winner: " + backup_pred_set.iloc[i, 1])elif predictions[i] == 1:print("Draw")elif predictions[i] == 0:print("Winner: " + backup_pred_set.iloc[i, 0])print('Probability of ' + backup_pred_set.iloc[i, 1] + ' winning: ', '%.3f'%(logreg.predict_proba(pred_set)[i][2]))print('Probability of Draw: ', '%.3f'%(logreg.predict_proba(pred_set)[i][1]))print('Probability of ' + backup_pred_set.iloc[i, 0] + ' winning: ', '%.3f'%(logreg.predict_proba(pred_set)[i][0]))print("")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上述预测的结果针对的是2018年俄罗斯世界杯小组赛的对阵情况,那么2022年卡塔尔世界杯小组赛的预测,我们只需要将fixture数据集更新一下即可

fixtures = pd.read_csv("datasets/fifa-world-cup-2022.csv")fixtures.head()

在这里插入图片描述
最后预测出来的结果如下所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19069.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青岛程序员加班看不上球赛崩溃,外卖小哥伸出援手:我帮你改代码

整理 | 王晓曼 出品 | 程序人生&#xff08;ID&#xff1a;coder _life&#xff09; 近日&#xff0c;一段青岛外卖小哥帮奔溃程序员写代码的视频意外走红。 1 据了解&#xff0c;一程序员与朋友来酒吧看欧洲杯球赛&#xff0c;途中多次出去接听电话&#xff0c;最后不得已拎着…

android 比分牌效果,Android自定义控件实现球赛比分条效果

本文实例为大家分享了Android实现球赛比分条效果的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 效果图如下所示&#xff1a; 该控件需要输入两个参数&#xff0c;左边的得分数和右边的的分数 然后根据两边的得分的比例绘制中间的比分条 首先将控件的宽度平均分配为…

java写一个随机球赛

//郑州轻工业大学 //题号&#xff1a;实验三 第三题 //题目&#xff1a;设计如下接口和类&#xff1a; &#xff08;1&#xff09;犯规接口&#xff0c;包括三种情况&#xff1a;接触犯规、干扰犯规、拖延犯规。 &#xff08;2&#xff09;得分接口&#xff0c;包括两种情况&am…

爬球赛回放

1.导入 from requests_html import HTMLSession from requests_html import HTML import json import pyprind 2.分析网站 通过用户的输入感兴趣的球队获取相应的视频 types input(请输入你感兴趣的球队:) if type(types) str:pass else: # typelistpass 3.获取一到四节…

谷歌裁员1.2万人....

点击上方“芋道源码”&#xff0c;选择“设为星标” 管她前浪&#xff0c;还是后浪&#xff1f; 能浪的浪&#xff0c;才是好浪&#xff01; 每天 10:33 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源…

再次暗示裁员?谷歌削减内部研发团队 Area 120 一半项目

整理 | 于轩 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 上周&#xff0c;谷歌CEO桑达尔皮查伊在Code Conference大会上表示&#xff0c;他希望将公司的效率提高20%&#xff0c;当时一些业内人士认为&#xff0c;这是谷歌要裁员的信号。 近日&#xff…

谷歌突然收紧绩效考评!要裁员不明说,CEO被员工开会「围攻」

【导读】年底将至&#xff0c;突然收紧绩效标准&#xff0c;实施定额签到&#xff0c;一向浓眉大眼的谷歌也要「减员增效」了么&#xff1f;面对员工诘问&#xff0c;谷歌CEO无奈以对。一些员工认为&#xff0c;裁员只是时间问题。 如果说&#xff0c;一家之前以关怀员工著称的…

Google裁掉了最优秀的员工

Google的非官方座右铭是“不作恶”&#xff0c;虽然这句话在2018年从Google行为准则中曾被悄悄拿掉&#xff0c;但是很多人还是认为Google要比其他公司好一点。 毕竟&#xff0c;Google带来了一大批改变世界的技术&#xff1a; 最强的搜索引擎google.comGmail, GMap宣告Web2.0时…

谷歌裁员1.2万人,CEO年薪达15亿,网友:“地表最强 CEO !”

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 在竞争激烈的科技行业&#xff0c;大佬的薪酬往往是敏感话题。 年初时&#xff0c;曾拿下 1.25 亿美元年终奖的“地表最强打工人”、苹果公司 CEO 库克&#xff0c;因降薪 40% 的话题登…

谷歌裁员细节曝光:开源主管被裁,61岁程序员在线求职,有人60天找不到工作就被遣返

“开源”谷歌&#xff0c;竟然连开源主管也给裁了。 随着更多裁员细节曝光&#xff0c;不少谷歌开源项目办公室OSPO和其他开源工作的高管已经被裁。 其中甚至还包括了开源运动“先锋”&#xff0c;18年前创立OSPO&#xff0c; Chris DiBona&#xff1b;Samba联合创始人、现年…

微软杀疯了!接入ChatGPT后首次交卷,一季度营收528亿美元

来源&#xff1a;新智元 ChatGPT的这波红利&#xff0c;微软是赚到了。 近日&#xff0c;微软公布了2023年第一季度财报&#xff0c;营收528亿美元。 财报发布后&#xff0c;微软盘后价&#xff0c;大涨9%。 收盘后&#xff0c;微软市值为2.05万亿美元&#xff0c;成为全球市值…

考研政治分析题

背肖八肖四、考场回答大题的抽象模板 1&#xff1a;立论/总起 2&#xff1a;定义 /本质 3&#xff1a;性质/属性 4&#xff1a;辩证统一关系 5&#xff1a;作用 6&#xff1a;不坚持xx的后果&#xff08;恶果&#xff09; 7&#xff1a;只有…

我的大模型观:我眼中的LLM

文章目录 大模型是有智能的。也许&#xff0c;大模型是一场骗局&#xff1f;从头训练or微调我想象中的大模型架构大厂的大模型中小厂和个人开发该何去何从&#xff1f; 今年&#xff0c;大模型火的一塌糊涂。最近几个月paper with code上&#xff0c;前几名的论文几乎都是生成模…

高考志愿填报提示词指南;用孩子教科书训练家教GPT;AI提示工程师6项必备技能;创业者最核心的特质 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; Google 警告员工&#xff1a;不要使用自家 Bard 生成的代码 上周&#xff0c;谷歌警告员工不要使用自家AI聊天机器人 Bard 生成的代码…

在我的指导下,ChatGPT写了一个木马!

最近玩这个ChatGPT是越来越上头了。 我一直在思考着&#xff0c;这玩意儿除了拿来玩&#xff0c;能不能真正帮助我们工作&#xff1f; 昨天晚上&#xff0c;在我的“指导”下&#xff0c;我让这家伙帮我写了一个“木马”。 当然&#xff0c;之所以要打上引号&#xff0c;是因…

stanfordcorenlp识别中文人名实战记录及心得

前言: 一直在找一个能够精确识别中文人名的自然语言处理工具包,期间也找到了stanfordcorenlp, 并且经过在网上的大量摸坑探索之后,还是成功使用上了stanfordcorenlp,但是经过后期比较后,发现精确度还是没有达到满意的效果,后期发现了精度更高一些的jieba和paddlehub, 但还是把这…

apple登录服务端验证

Sign In With Apple 从登陆到服务器验证 服务端向苹果请求验证 手机端需要提交 user 、authorizationCode 、 identityToken 字段信息&#xff08;code和token字段苹果返回的是 base64 Data 形式&#xff0c;手机端可以先转换 base64 字符串之后在给服务器&#xff09;到服务器…

iOS 苹果登录(第三方登录)

Sign In with Apple是iOS 13的新增功能 所以现在苹果的app有第三方登录的功能需要加上苹果的登录&#xff08;不然审核时会被拒掉&#xff09; 一、证书文件配置 登录开发者账号&#xff0c;创建Bundle ID时 勾选 Sign In With Apple &#xff0c;开启登录功能&#xff08;勾…

Apple ID很久没有登录,使用邮件验证修改手机号的方法

背景&#xff1a;没有已登录的苹果设备 手机号已经更换 知道登录密码&#xff08;不知道登录密码&#xff0c;在官网修改&#xff0c;也是通过邮件验证&#xff09; 解决方法 1、登录账号和密码&#xff0c;会提示需要输入验证码。点击“未收到验证码” 2.点击第二项&#x…