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

news2024/12/29 10:27:55

前言

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

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

技术提升

资料领取点击蓝色字体
python 零基础入门到精通视频合集

【整整800集】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_set

pred_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.coloradmin.cn/o/54495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word控件Spire.Doc 【图像形状】教程(10): 如何在C#中重置word文档的形状大小

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

SEO优化之扁平化目录结构PbootCMS

在网站内部优化中&#xff0c;扁平化的目录结构对于一个网站来讲是非常有意义的。我们经常看到一些网站结构混乱&#xff0c;搞的你都不知道哪里是哪里了。而有的网站结构非常清晰&#xff0c;这样用户喜欢&#xff0c;搜索引擎也喜欢。而PbootCMS 2.0开始&#xff0c;系统也默…

2022,开发转测试,会不会后悔?

每个人做任何选择都是趋利避害的&#xff0c;当选择了认为对自己更有利的选择后&#xff0c;发现结果和期望不符&#xff0c;甚至发现大失所望&#xff0c;才会出现后悔的情绪。 那么为什么开发转测试就会后悔呢&#xff0c;只有一个原因&#xff1a; 那就是转到测试行业后&a…

PIL+pyplot+transforms.ToTensor+unsqueeze+div

目录PIL & pyplottransforms.ToTensortorch.unsqueeze(input,dim,outNone)torch.squeeze(input, dimNone, outNone)torch.divPIL & pyplot from PIL import Image import matplotlib.pyplot as plt from torchvision import transforms# PIL打开图片 img_PIL Image.o…

面试华为必备:华为18级技术官呕心沥血三年整理的 趣谈网络协议

华为是一个热门的互联网大厂&#xff0c;华为每年都要进很多新人&#xff0c;对于新人来说&#xff0c;那些高大上的技术是用不到的&#xff0c;反倒是非常需要这些基础的文档&#xff0c;有这些新手进步会快很多&#xff0c;搞清楚TCP IP协议栈&#xff0c;其他的学起来也就容…

运动规划问答 -路径规划

1、Dijstra算法&#xff0c;算法流程 关键 初始化&#xff1a; 算法是基于图搜索的思想&#xff0c;所以需要先构建一个图&#xff0c;图中不包含障碍物&#xff0c;读入起点和终点信息&#xff0c;设置一个以代价作为键值排序的multiMap&#xff0c;起点入队&#xff0c;并设…

搜索技术——遗传算法

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;进化与遗传的概念 拉马克(Lamarck)进化论&#xff1a; 一切物种都是其他物种演变和进化而来的&#xff0c;而生物的演变和进化是一个缓慢和连续的过程环境的变化能够引起生…

Qwt开发笔记(一):Qwt简介、下载以及基础demo工程模板

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128146985 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

设计模式之观察者模式(十四)

目录 1. 背景 1.1 天气预报项目 2. 观察者模式 2.1 观察者模式解决天气预报项目 2.2 观察者模式在JDK中应用 1. 背景 1.1 天气预报项目 天气预报项目需求,具体要求如下&#xff1a; 气象站可以将每天测量到的温度&#xff0c;湿度&#xff0c;气压等等以公告的形式发布出去…

ASEMI整流桥KBL406参数,KBL406规格,KBL406封装

编辑-Z ASEMI整流桥KBL406参数&#xff1a; 型号&#xff1a;KBL406 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;600V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;420V 最大直流阻断电压&#xff08;VDC&#xff09;&#xff1a;600…

完全免费、开源的Flutter架构来了;开发者做好准备了吗?

Flutter 是谷歌的移动 UI 框架&#xff0c;可以快速在 iOS 和 Android 上构建高质量的原生用户界面 一份代码可以同时生成 iOS 和 Android 两个高性能、高保真的应用程序 Flutter 目标就是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序&#xff0c;并且兼容 滚…

萤火虫模糊回归算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

FA-Phe-Gly-Gly,64967-39-1

Substrate for a continuous spectrophotometric assay of human angiotensin I-converting enzyme (ACE). Enzymatic cleavage of FAPGG yields FA-Phe-OH and H-Gly-Gly-OH. 连续分光光度法测定人血管紧张素i转换酶(ACE)的底物。酶法裂解FAPGG产生fa - pheo - oh和H-Gly-Gly-…

Kamiya丨Kamiya艾美捷抗-C-Myc,多克隆说明书

Kamiya艾美捷抗-C-Myc&#xff0c;多克隆化学性质&#xff1a; 程序&#xff1a;鸡用C-Myc免疫与KLH缀合的肽。多次之后用弗氏佐剂免疫收集。使用固定在固体上的肽对抗体进行免疫亲和纯化阶段 规范&#xff1a; ELISA&#xff1a;抗体特异性通过针对与BSA缀合的肽的ELISA。A…

在微信小程序里引入Vant Weapp组件库详细步骤

1. 新建一个文件夹。 2. 使用微信开发者工具 选择一个模板(这里以javaScript 基础模板 为例) 选择完模板之后如下&#xff1a; 2. 右键打开终端&#xff1a;按如下步骤执行命令。 ① npm init 解释&#xff1a;执行 npm init 需要在当前文件夹下的DOS窗口执行或者VS code里面…

Springboot策略模式实现文件上传功能(Windows/Linux本地,oss,cos)

1&#xff1a;首先配置pom依赖&#xff1a; <!-- 阿里云oss--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency><!-- 腾讯云cos-->…

Raspberry Pi 3 Model B+ (树莓派3B+)快速上手

文章目录一、硬件资源二、供电三、引脚说明四、Raspberry Pi OS1. 下载imager2. 选择操作系统3. 选择SD卡4. 烧写完成5. 启动6. 版本信息五、网络测试1. WiFi2. 以太网六、开启串口日志1. 硬件串口连接2. 修改config.txt配置3. 修改cmdline4. 测试一、硬件资源 下面是硬件资源图…

架构-三层架构:三层架构

概述 顾名思义&#xff0c;三层架构分为三层&#xff0c;分别是“数据访问层”、“业务逻辑层”、“表示层”。 数据访问层&#xff1a;数据访问层在作业过程中访问数据系统中的文件&#xff0c; 实现对数据库中数据的读取保存操作。 表示层&#xff1a;主要功能是 显示数据和…

李宁「向上」:不止缺一个FILA

文|螳螂观察 作者|易不二 随着卡塔尔世界杯拉开战幕&#xff0c;今年年初大幅下跌的阿迪和耐克&#xff0c;正在借助世界杯大放异彩。 据统计&#xff0c;在2022年的32强世界杯球衣中&#xff0c;耐克、阿迪、彪马三家品牌共包揽了80%。世界杯球衣是出镜率最高的广告载体&am…

Android基础之Fragment

目录前言一、Fragment简介二、Fragment的基础使用1.创建Fragment2.在Activity中加入Fragment&#xff08;1&#xff09;在Activity的layout.xml布局文件中静态添加&#xff08;2&#xff09;在Activity的.java文件中动态添加三、Fragment的基础实践应用1.应用过程详解2.代码总览…