用技术记录世界杯【2022】
文章目录
- 用技术记录世界杯【2022】
- 前言
- 1 项目介绍
- 2 实验复现
- 2.1 关于项目
- 2.2 数据准备
- 2.3 特征工程
- 3 我的感受
前言
Hi,我是Ding Jiaxiong,好久不见(bushi,早上才更新了博客),
今天是2022 年12月 8日
2022年 卡塔尔 世界杯的第 18天
现在的排名情况是下面这样子的
作为一个 资深足球迷( bushi,没有冒犯的意思,我只认识内马尔、C罗和梅西),
当然回到这篇博客 的重点,为了与大家共享世界杯盛宴,CSDN 官方专门举办了这场世界杯征文大赛
哈哈,当然我只是想要那个专属勋章啦
回到正题,今天想要分享的就是一个 名为“使用 ML 预测FIFA 2022 世界杯”的开源项目。
1 项目介绍
项目名:Predicting FIFA 2022 World Cup with ML
项目地址:https://www.kaggle.com/code/sslp23/predicting-fifa-2022-world-cup-with-ml/notebook
就是它了,在kaggle 上面
2 实验复现
2.1 关于项目
项目的想法是用机器学习模拟 FIFA 2022 世界杯比赛,以预测比赛的获胜者。
该项目使用两个数据集:1872 年至 2022 年的国际足球成绩和 1992 年至 2022 年的国际足联世界排名
数据集地址:
【1872 年至 2022 年的国际足球成绩】
https://www.kaggle.com/datasets/martj42/international-football-results-from-1872-to-2017
【1992 年至 2022 年的国际足联世界排名】
项目作者使用了 Soccer World Cup 2018 Winner notebook 中使用的相同逻辑,
https://www.kaggle.com/code/agostontorok/soccer-world-cup-2018-winner
另一个项目,18年世界杯项目
将问题建模为一个 二分类问题。【嗯,胜负】
作者用它来更容易地分析模型的结果,所以模型预测主队获胜和客队平局/获胜。然后,为了去除客队优势,作者预测了客场和主场球队变化的结果(因为世界杯没有主场优势),并将两个预测的均值用作概率。
2.2 数据准备
准备数据以应用特征工程方法,这些方法将创建数据库以应用机器学习算法。
笔者的环境配置
笔者准备了一个新的 notebook
将其命名为 WorldCup,并把数据集上传到了 服务器中
import numpy as np
import pandas as pd
import os
for dirname, _, filenames in os.walk('kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
df = pd.read_csv("kaggle/input/international-football-results-from-1872-to-2017/results.csv")
df["date"] = pd.to_datetime(df["date"])
df.isna().sum()
df.dropna(inplace=True)
df.dtypes
使用的数据集将是2018年国际足联比赛,从2018年世界杯之后到2022年世界杯之前的最后一场比赛。我们的想法是只分析比赛的准备和分类到WC。
df.sort_values("date").tail()
df = df[(df["date"] >= "2018-8-1")].reset_index(drop=True)
df.sort_values("date").tail()
df.home_team.value_counts()
rank = pd.read_csv("kaggle/input/fifaworldranking/fifa_ranking-2022-10-06.csv")
rank["rank_date"] = pd.to_datetime(rank["rank_date"])
rank = rank[(rank["rank_date"] >= "2018-8-1")].reset_index(drop=True)
世界杯上的一些球队在排名数据集中有不同的名字。所以,它需要调整。
rank["country_full"] = rank["country_full"].str.replace("IR Iran", "Iran").str.replace("Korea Republic", "South Korea").str.replace("USA", "United States")
合并是为了得到一个数据集FIFA比赛和它的排名。
rank = rank.set_index(['rank_date']).groupby(['country_full'], group_keys=False).resample('D').first().fillna(method='ffill').reset_index()
df_wc_ranked = df.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)
df_wc_ranked[(df_wc_ranked.home_team == "Brazil") | (df_wc_ranked.away_team == "Brazil")].tail(10)
现在,我们已经准备好了数据,可以根据比赛结果和国际足联排名来创建功能。
2.3 特征工程
这里的想法是创建可能的特征,对预测足球比赛有影响。
根据直觉,我们认为具有影响的特征可能是:
- 过去的比赛积分
- 过去的进球和损失【失球】
- 游戏的重要性(友好与否)
- 球队排名
- 队伍等级增加
- 目标的实现和遭受取决于面对的排名
所以,我们要做的第一件事就是创建一个显示哪支球队赢了以及他们在比赛中得了多少分的功能。
df = df_wc_ranked
def result_finder(home, away):
if home > away:
return pd.Series([0, 3, 0])
if home < away:
return pd.Series([1, 0, 3])
else:
return pd.Series([2, 1, 1])
results = df.apply(lambda x: result_finder(x["home_score"], x["away_score"]), axis=1)
df[["result", "home_team_points", "away_team_points"]] = results
比赛积分为胜3分,平1分,负0分,与数据库中已经存在的国际足联排名积分不同。
此外,假设FIFA Rank积分和同一支球队的FIFA排名是负相关的,我们应该只使用其中一个来创建新功能。以下是对这个假设的验证:
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 10))
sns.heatmap(df[["total_points_home", "rank_home", "total_points_away", "rank_away"]].corr())
plt.show()
现在,我们将创建有助于创建特征的列:排名差异,在比赛中赢得的分数与球队面临的排名,以及比赛中的进球数差异。所有不是差异的特征都应该为两支球队(客场和主场)创造。
df["rank_dif"] = df["rank_home"] - df["rank_away"]
df["sg"] = df["home_score"] - df["away_score"]
df["points_home_by_rank"] = df["home_team_points"]/df["rank_away"]
df["points_away_by_rank"] = df["away_team_points"]/df["rank_home"]
为了创建特征,作者将在主队和客场队的数据集中分离数据集,统一它们并计算过去的比赛值。之后,作者将再次分离并合并它们,检索原始数据集。这个过程优化了特性的创建。
home_team = df[["date", "home_team", "home_score", "away_score", "rank_home", "rank_away","rank_change_home", "total_points_home", "result", "rank_dif", "points_home_by_rank", "home_team_points"]]
away_team = df[["date", "away_team", "away_score", "home_score", "rank_away", "rank_home","rank_change_away", "total_points_away", "result", "rank_dif", "points_away_by_rank", "away_team_points"]]
home_team.columns = [h.replace("home_", "").replace("_home", "").replace("away_", "suf_").replace("_away", "_suf") for h in home_team.columns]
away_team.columns = [a.replace("away_", "").replace("_away", "").replace("home_", "suf_").replace("_home", "_suf") for a in away_team.columns]
team_stats = home_team.append(away_team)
team_stats_raw = team_stats.copy()
现在,我们有了一个数据库,可以创建预测功能。它们将是:
- Mean goals of the team in World Cup Cycle.
- Mean goals of the team in last 5 games.
- Mean goals suffered of the team in World Cup Cycle.
- Mean goals suffered of the team in last 5 games.
- Mean FIFA Rank that team faced in World Cup Cycle.
- Mean FIFA Rank that team faced in last 5 games.
- FIFA Points won at the cycle.
- FIFA Points won in last 5 games.
- Mean game points at the Cycle.
- Mean game points at last 5 games.
- Mean game points by rank faced at the Cycle.
- Mean game points by rank faced at last 5 games.
OK,到这里,当我谷歌第一条的英文意思的时候,我就不想再往下写了,因为有大佬已经写了!!!!我真的枯死
这里我直接附上链接吧,大家多多支持大佬的好文
https://blog.csdn.net/weixin_62338855/article/details/128023854
3 我的感受
分享一些 轻松的事情吧,
如果要问起来在 世界杯期间学习了啥 技术,其实就在昨天吧,我把Go 基础重新学了一遍,已经结束了
马上就要再进入Go 的高并发了,之前学过一遍,但是间隔时间太长了,而且也没怎么用,因为中间搞Java 去了
看着官方给的活动创作方向,画足球就不了,如果说回忆 第一次我自己踢足球的话,那是在起码 5年前了,
OK,是2017年,那个时候高二吧,小班足球赛,我作为替补,虽然到比赛结束都没上过场,但是那个 时候确实很多人很多事 都 … ,死去的 回忆突然攻击我,
咋子说呢
今天在抖音 看到一段“ 很美” 的话
这三年最大的收获
就是遇到了那些形形色色的人们
虽然他们有的让我身陷险境
有的帮我它逃出泥沼
但就是这样
才让当年那个自大的我清醒了许多
我现在觉得这里无比强大
3年之约对我来说
就只不过是要完成一个年少轻狂的约定
给自己的这段成长
画上了句号而已
当年一起玩耍、一起上学上课上厕所的朋友们,希望你们一切都好。
路漫漫其修远兮,吾将上下而求索
我们一定能够成为我们想要去成为的人。