足球比赛怎是不是合法的?

采用 Python 机器学习预测足球比赛结果

足球是世界上最火爆的运动之一,世界杯期间也往往是球迷们最亢奋的时刻。比赛狂欢季除了炸出了熬夜看球的铁杆粉丝,也让足球竞猜也成了大家茶余饭后最热衷的话题。甚至连原来不怎么看足球的人,也是暗中努力恶补了很多足球相关知识,想通过赛事竞猜先赚一个小目标。今天我们将介绍如何用机器学习来预测足球比赛结果!

本 Chat 采用 Python 编程语言,使用 人工智能建模平台 Mo 作为在线开发环境进行编程,通过获取 2000 年到 2018 年共 19 年英超的比赛数据,然后基于监督学习中逻辑回归模型、支持向量机模型和 XGBoost 模型,对英超比赛结果进行预测。

下面我们一起来看看预测英超比赛结果的机器学习步骤:

主要流程步骤获取数据和读取数据的信息

建立机器学习模型并进行预测

1. 获取数据和读取数据的信息

首先我们进入 Mo 工作台 ,创建一个空白项目,点击 开始开发 进入内嵌 JupyterLab 的 Notebook 开发环境。

接着我们需要在项目中上传 数据集 。

英超每年举办一个赛季,在每年的 8 月到第二年的 5 月进行,共有 20 支球队,实行主客场双循环赛制,每个赛季共 38 轮比赛(其中 19 场主场比赛,19 场客场比赛),每轮比赛共计 10 场比赛,所以每个赛季,英超共有 380 场比赛。

如果您已经在 MO 平台新建项目,可以在平台直接导入数据集,流程如下:

sep:指定分隔符,默认是逗号

delimiter:定界符,备选分隔符(如果指定改参数,则sep失效)

usecols: 指定读取的列名,列表形式

# 获取地址中的所有文件

# root:当前目录路径 dirs:当前目录下所有子目录 files:当前路径下所有非目录文件

获取每一年的数据后,将每一年的年份放入到 time_list 列表中:

读取时将数据与 res_name 中的元素名一一对应。

1.4 删除特定文件的空值

经过查看第 15 个文件读取的第 381 行为空值,故采取删除行空值操作。

how:'all'表示只去掉所有值均缺失的行、列;any表示只去掉有缺失值的行、列

1.5 删除行数不是 380 的文件名

考虑到英超一般是 19 个球队,每个球队需要打 20 场球,故把行数不是 380 的数据删除掉,并找到器原 CSV 文件一一对应。

# 采用从大到小的遍历方式,然后进行删除不满足条件的。

1.6 查看某一个数据集前n行数据文件名.head(n)n:默认是5,想获取多少行数据就填写数字值。

读取最后 5 行操作:

读取最后 4 行操作:

1.8 获取某一年主场队伍的名称

1.9 解析数据集列表头含义

数据集行数已经固定,一般都是 380 行,而列数可能每年统计指标有变化,不一定相等,而且我们也比较关心列数表表头。由于比较小,可以直接看数据集列数,这样比较快,也可以代码实现,找到最大的列数,然后获取列数的表头进行一般性介绍解释。

# 获取列表头最大的列数,然后获取器参数

2012年数据是有最大列数:74,列元素表头:

我们看到数据包括 Date(比赛的时间),Hometeam(主场队伍名),Awayteam(客场队伍名),FTHG(主场球队全场进球数),HTHG(主场球队半场进球数),FTR(全场比赛结果) 等等,更多关于数据集中特征信息可以参考 数据集特征说明文档 。

2. 数据清洗和预处理

我们挑选 Hometeam,Awayteam,FTHG,FTAG,FTR 这五列数据,作为我们的原始的特征数据,后面基于这些原始特征,我们再构造一些新的特征。

FTHG: 全场 主场球队进球数

FTAG: 全场 客场球队进球数

# 将挑选的信息放在一个新的列表中

我们首先预测所有主场球队全都胜利,然后预测所有的客场都会胜利,对结果进行对比分析:

2.2.1 统计所有主场球队都会胜利的准确率

当我们统计所有主场球队都赢,那么我们预测的结果是什么

返回值是预测值和实际值

# 那我们对19年全部主场球队都赢的结果进行预测,获取预测的准确率。

2000年数据主场全胜预测的准确率是0.7895

2001年数据主场全胜预测的准确率是0.7895

2005年数据主场全胜预测的准确率是0.7369

2006年数据主场全胜预测的准确率是0.0526

2007年数据主场全胜预测的准确率是0.8421

2008年数据主场全胜预测的准确率是0.73687

2009年数据主场全胜预测的准确率是0.1053

2010年数据主场全胜预测的准确率是0.9474

2011年数据主场全胜预测的准确率是0.45

2012年数据主场全胜预测的准确率是0.1579

2013年数据主场全胜预测的准确率是0.9474

2014年数据主场全胜预测的准确率是0.36844

2015年数据主场全胜预测的准确率是0.8421

2016年数据主场全胜预测的准确率是0.8947

2017年数据主场全胜预测的准确率是0.73687

共15年的平均准确率是:0.26317

2.2.2 统计所有客场球队都会胜利的准确率

当我们统计所有客场球队都赢,那么我们预测的结果是什么

返回值是预测值和实际值

# 那我们对19年客场球队都赢的结果进行预测,获取预测的准确率。

2000年数据客场全胜预测的准确率是0.25

2001年数据客场全胜预测的准确率是0.3

2005年数据客场全胜预测的准确率是0.89476

2006年数据客场全胜预测的准确率是0.8421

2007年数据客场全胜预测的准确率是0.3158

2008年数据客场全胜预测的准确率是0.5263

2009年数据客场全胜预测的准确率是0.5263

2010年数据客场全胜预测的准确率是0.15788

2011年数据客场全胜预测的准确率是0.73685

2012年数据客场全胜预测的准确率是0.0526

2013年数据客场全胜预测的准确率是0.3158

2014年数据客场全胜预测的准确率是0.3684

2015年数据客场全胜预测的准确率是0.73685

2016年数据客场全胜预测的准确率是0.1579

2017年数据客场全胜预测的准确率是0.78947

综上比较:我们可以看出主场胜利的概率相对于输和平局来说,确实概率要大。

2.3 我们想知道 Arsenal 作为主场队伍时,他们的表现,如何求出 2005-06 所有比赛累计进球数 ?

Arsenal 作为主场队伍在2005年时,累计进球数:48

2.4 我们想知道各个球队作为主场队伍时,他们的表现如何 ?

先试试求 2005-06 所有比赛各个球队累计进球数。

特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,得到更好的训练模型。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,一般认为括特征构建、特征提取、特征选择三大部分。

因为这个比赛是一年一个赛季,是有先后顺序的,那我们就可以统计到截止到本场比赛之前,整个赛季内,主客场队伍的净胜球的数量。那么对于每一个赛季的每一周,都统计出每个球队到本周为止累计的进球数和丢球数之差,也就是净胜球的数量。

3.1.1 计算每个队周累计净胜球数量

处理后的数据,我们可以通过看某一年的某几条数据来体现,比如:05-06 年的后五条数据

# 全场比赛,主场队伍的进球数

# 全场比赛,客场队伍的进球数

# 把主场队伍的净胜球数添加到 team 这个 字典中对应的主场队伍下

# 把客场队伍的净胜球数添加到 team 这个 字典中对应的客场队伍下

# 39解释:19个球队,每个球队分主场客场2次,共38个赛次,但是range取不到最后一个值,故38+1=39

# 累加每个队的周比赛的净胜球数

# 全年一共380场比赛

#### 查看构造特征后的05-06年的后五条数据

通过以上数据:我们发现 376 行数据的特点, 截止到这一场比赛之前,本赛季主场曼联队的净胜球数是 34 , 客场查尔顿队的净胜球数是 -10 。

3.1.2 统计主客场队伍到当前比赛周的累计得分

统计整个赛季主客场队伍截止到当前比赛周的累计得分。一场比赛胜利计 3 分, 平局计 1 分,输了计 0 分。我们根据本赛季本周之前的比赛结果来统计这个值。我们继续观看 05-06 年的后五条数据:

# 把比赛结果转换为得分,赢得三分,平局得一分,输不得分

# 把比赛结果分别记录在主场队伍和客场队伍中

# H:代表 主场 赢

# A:代表 客场 赢

# 主场 赢,则主场记为赢,客场记为输

# 客场 赢,则主场记为输,客场记为赢

#查看构造特征后的05-06年的后五条数据

我们处理得到 HTP (本赛季主场球队截止到本周的累计得分), ATP (本赛季客场球队截止到本周的累计得分)。

我们再看 376 行,截止到这一场比赛,本赛季,曼联队一共积了80分, 查尔顿队积了 47 分。

3.1.3 统计某支队伍最近三场比赛的表现

前面我们构造的特征反映了一只队伍本赛季的历史总表现,我们看看队伍在最近三场比赛的表现。

HM1 代表主场球队上一次比赛的输赢,

AM1 代表客场球队上一次比赛是输赢。

同理,HM2 AM2 就是上上次比赛的输赢, HM3 AM3 就是上上上次比赛的输赢。

我们继续观看处理后 05-06 年的后 5 五条数据:

#查看构造特征后的05-06年的后5五条数据

3.1.4 加入比赛周特征(第几个比赛周)

然后我们把比赛周的信息也放在里面,也就是这一场比赛发生在第几个比赛周。

特征构造后的结果,我们可以直接查看 05-06 年的后 5 条数据:

#查看构造特征后的05-06年的后五条数据

3.1.5 合并比赛的信息

我们打算把数据集比赛的信息都合并到一个表里面,然后我们把我们刚才计算得到的这些得分数据,净胜球数据除以周数,就得到了周平均后的值。结果就可以通过查看构造特征后数据集的后 5 条数据。

#查看构造特征后数据集的后5五条数据

我们看到数据集最后一行的行数是 5699 ,加上第一行为 0 行,则一共 5700 条数据;我们总共统计了 15 年的数据,每一年有 380 条数据,计算后发现我们统计后的数据集大小是准确的。

前面我们根据初始的特征构造出了很多的特征。这其中有一部分是中间的特征,我们需要把这些中间特征抛弃掉。因为前三周的比赛,每个队的历史胜负信息不足,所以我们打算弃掉前三周的数据。

#我们查看下此时的数据的特征

3.3 分析我们构造的数据

在前面,我们计算了每一的年主客场的胜率,现在我们看看有效数据中,是主场胜利的多呢,还是客场胜利的多呢?

通过统计结果看到:我们主场胜率 46.69% 与我们第 2.2.1 小节原始数据分析的结果是一致的,说明我们前面构造的特征是有效的,比较贴近实际的。

3.4 解决样本不均衡问题

通过构造特征之后,发现主场获胜的比例接近 50% ,所以对于这个三分类的问题,标签比例是不均衡的。

我们把它简化为二分类问题,也就是主场球队会不会胜利,这也是一种解决标签比例不均衡的问题的方法。

3.5 将数据分为特征值和标签值

# 把数据分为特征值和标签值

3.6 数据归一化、标准化

我们对所有比赛的特征 HTP 进行最大最小值归一化。

3.7 转换特征数据类型

# 把这些特征转换成字符串类型

'''把离散的类型特征转为哑编码特征 '''

3.8 皮尔逊相关热力图

我们生成一些特征的相关图,以查看特征与特征之间的相关性。 为此,我们将利用 Seaborn 绘图软件包,使我们能够非常方便地绘制热力图,如下所示:

通过上图我们可以看出特征 HTP 特征和 HTGD 特征相关性很强,同样 ATP 特征和 ATGD 特征相关性很强,可以表明多重共线性的情况。这个我们也很容易理解,主场周平均得分数越高,那么主场周平均净胜球数也同样越高。如果我们考虑这些变量,我们可以得出结论,它们给出了几乎相同的信息,因此实际上发生了多重共线性,这里我们会考虑删除 HTP 和 'ATP' 这两个特征,保留 HTGD 和 ATGD 这两个特征。皮尔森热图非常适合检测这种情况,并且在特征工程中,它们是必不可少的工具。同时,我们也可以看出上上上次球队的比赛结果对目前比赛的结果影响较小,这里我们考虑保留这些特征。考虑到样本集特征 HTP 和 HTGD,ATP 和 ATGD 的相关性都超过了 90% ,故我们删除特征 HTP , ATP :

我们可以看出最相关的特征是 HTGD ,表明一个球队主场周平均净胜球数越高,他们赢的概率也就越大。

4.建立机器学习模型并进行预测

将数据集随机分成为训练集和测试集,并返回划分好的训练集测试集样本和训练集测试集标签。我们直接采用 train_test_split 接口进行处理。

参数解释:train_data:被划分的样本特征集

test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量

返回值解释:x_train:训练集特征值

x_test:测试集特征值

y_test:测试集目标值

随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则: 种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

4.1.2 代码处理分割数据

4.2 相关模型及其接口介绍

下面我们分别使用逻辑回归、支持向量机和 XGBoost 这三种不同的模型,来看看他们的表现。我们先定义一些辅助函数,记录模型的训练时长和评估时长,计算模型的准确率和 f1 分数。我们首先介绍一下这三个模型联系与区别和相关的接口:

逻辑回归模型是:假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。该模型的主要优点是解释性比较好;如果特征工程做得好,模型效果也非常不错;训练速度也比较快;输出结果也很容易调整。但是该模型的缺点也很突出,比如:准确率不是很高,比较难处理数据不均衡问题等。

4.2.2 逻辑回归模型接口介绍

tol:迭代终止判据的误差范围

n_jobs:并行数,为-1时跟CPU核数一致,默认值为1。

以上是主要参数的简单解析,如果大家想深入了解,可以参看 官方网址 。

4.2.3 支持向量机介绍

SVM(Support Vector Machine) 是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。

(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;

(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;

(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。

max_iter :最大迭代次数。-1为无限制。

XGBoost 是 Boosting算法的其中一种, Boosting 算法的思想是许多弱分类器集成在一起,形成一个强分类器,基本原理是下一棵决策树输入样本会与前面决策树的训练和预测相关。以为 XGBoost 是一种提升树模型,所以他是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是 CART 回归树模型。

nthread:使用 CPU 个数,为 -1 时表示使用全部 CPU 进行并行运算(默认),等于 1 时表示使用1个 CPU 进行运算;

scale_pos_weight:正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为 1:10 时,scale_pos_weight=10;

n_estimatores:总共迭代的次数,即决策树的个数;

early_stopping_rounds:在验证集上,当连续n次迭代,分数没有提高后,提前终止训练

max_depth:树的深度,默认值为6,典型值3-10;

min_child_weight:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本),默认为1;

learning_rate:学习率,控制每次迭代更新权重时的步长,默认0.3;

gamma:惩罚项系数,指定节点分裂所需的最小损失函数下降值;

如想详细学习该 API ,可以参考 官网网址 。

4.3 建立机器学习模型并评估

# 在测试集上评估模型

4.3.2 分别初始化,训练和评估模型

通过运行结果,我们发现:在训练时间上, 逻辑回归 耗时最短,XGBoost 耗时最长,为 2 秒多。

在预测时间上, 逻辑回归 耗时最短,支持向量机耗时最长。

在训练集上 F1 分数方面, XGBoost 得分最高,支持向量机得分最低,但是差距不是很大。

在训练集上准确率方面分析, XGBoost 得分最高,逻辑回归最低。

在测试集上 F1 分数方面分析, 逻辑回归 的最好,其余两个模型基本相等,相对较低。

在测试集上准确率方面分析, 逻辑回归 支持向量机** 2 个模型基本相等,稍微比 XBGoost 高一点。

# 设置想要自动调参的参数

# 查看最终的模型效果

4.5 保存模型和加载模型

然后我们可以把模型保存下来,以供以后使用。

# 然后我们尝试来进行一个预测

通过以上,我们从 test 数据集中随机挑选5个,预测值跟实际值相同的有 4 个,考虑到我们准确率不高,能够得到这个结果来说还是比较幸运的。

}
  • 我应该去爱这山、这水 这世间万物 以及我自 ..

  • 哈哈,啥肉也看不了吧,穿衣显瘦,脱衣有肉 ..

  • #夏天来啦##我的碎碎念#

  • #早安# 生活平平淡淡,每一天都是新的~#夏 ..

  • #早安# 错过了春天的花,不要再错过夏天的 ..

  • 只有自己努力,才有别人想不到的惊喜

  • 早安!周日愉快#夏天来啦# #6月,毕业季# # ..

}

网络文化经营许可证 跟帖评论自律管理承诺书 违法和不良信息举报电话:400-140-2108 未成年人相关举报:400-140-2108,按5 公司名称:北京抖音信息服务有限公司

}

我要回帖

更多关于 足球持球违例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信