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

admin 2024-02-12 阅读:92 评论:0
  足球是世界上最火爆的运动之一,世界杯期间也往往是球迷们最亢奋的时刻。比赛狂欢季除了炸出了熬夜看球的铁杆粉丝,也让足球竞猜也成了大家茶余饭后最热衷的话题。甚至连原来不怎么看足球的人,也是暗中努力恶补了很多足球相关知识,想通过赛事竞猜先赚一...

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

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

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

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

  

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

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

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

  

  下面开始我们的表演:

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

  [‘2000’,‘2001’,‘2002’,‘2003’,‘2004’,‘2005’,‘2006’,‘2007’,‘2008’,‘2009’,‘2010’,‘2011’,‘2012’,‘2013’,‘2014’,‘2015’,‘2016’,‘2017’,‘2018’]

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

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

  DivDateHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTR...BbAv<2.5BbAHBbAHhBbMxAHHBbAvAHHBbMxAHABbAvAHAPSCHPSCDPSCA375E024/05/15HullMan United0.00.0D0.00.0D...1.9925.00.501.761.712.272.193.203.762.27376E024/05/15LeicesterQPR5.01.0H2.00.0H...2.4128.0-1.001.981.931.981.931.534.946.13377E024/05/15Man CitySouthampton2.00.0H1.00.0H...2.6628.0-1.002.001.942.031.931.604.356.00378E024/05/15NewcastleWest Ham2.00.0H0.00.0D...2.2525.0-0.501.821.782.202.101.764.014.98379E024/05/15StokeLiverpool6.01.0H5.00.0H...1.9925.00.252.072.021.881.853.563.602.17

  5 rows × 68 columns

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

  读取数据前五行操作:

  DivDateHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTR...IWALBHLBDLBASBHSBDSBAWHHWHDWHA0E019/08/00CharltonMan City40H20H...2.72.203.252.752.203.252.882.103.23.101E019/08/00ChelseaWest Ham42H10H...4.21.503.406.001.503.606.001.443.66.502E019/08/00CoventryMiddlesbrough13A11D...2.72.253.202.752.303.202.752.303.22.623E019/08/00DerbySouthampton22D12A...3.52.203.252.752.053.203.202.003.23.204E019/08/00LeedsEverton20H20H...4.51.553.505.001.573.605.001.613.54.50

5 rows × 45 columns

  读取数据前10行:

  DivDateHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTR...IWALBHLBDLBASBHSBDSBAWHHWHDWHA0E019/08/00CharltonMan City40H20H...2.72.203.252.752.203.252.882.103.203.101E019/08/00ChelseaWest Ham42H10H...4.21.503.406.001.503.606.001.443.606.502E019/08/00CoventryMiddlesbrough13A11D...2.72.253.202.752.303.202.752.303.202.623E019/08/00DerbySouthampton22D12A...3.52.203.252.752.053.203.202.003.203.204E019/08/00LeedsEverton20H20H...4.51.553.505.001.573.605.001.613.504.505E019/08/00LeicesterAston Villa00D00D...2.52.353.202.602.253.252.752.403.252.506E019/08/00LiverpoolBradford10H00D...8.01.354.008.001.364.008.001.334.008.007E019/08/00SunderlandArsenal10H00D...2.14.303.201.703.303.102.053.753.001.908E019/08/00TottenhamIpswich31H21H...4.71.453.606.501.503.506.501.443.606.509E020/08/00Man UnitedNewcastle20H10H...5.01.403.757.001.403.757.501.403.757.00

10 rows × 45 columns

  通过以上2次操作,我们发现表格的第一行为各个特征的名称,最左边的一列为样本的序列号,一般都是从 0 开始;在这里也可以理解为每一行是一场比赛。 #### 1.7 查看某一个数据集后 5 行数据 - 文件名.tail():用法与 head() 一样

  读取最后 5 行操作:

  DivDateHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTR...IWALBHLBDLBASBHSBDSBAWHHWHDWHA375E019/05/01Man CityChelsea12A11D...1.654.03.601.674.203.401.704.003.11.80376E019/05/01MiddlesbroughWest Ham21H21H...3.201.83.253.751.903.203.501.833.43.50377E019/05/01NewcastleAston Villa30H20H...2.902.43.252.502.383.302.502.253.42.60378E019/05/01SouthamptonArsenal32H01A...2.352.53.252.372.633.252.302.623.52.20379E019/05/01TottenhamMan United31H11D...2.102.63.202.372.603.252.352.623.32.25

5 rows × 45 columns

  读取最后 4 行操作:

  DivDateHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTR...IWALBHLBDLBASBHSBDSBAWHHWHDWHA376E019/05/01MiddlesbroughWest Ham21H21H...3.201.83.253.751.903.203.501.833.43.50377E019/05/01NewcastleAston Villa30H20H...2.902.43.252.502.383.302.502.253.42.60378E019/05/01SouthamptonArsenal32H01A...2.352.53.252.372.633.252.302.623.52.20379E019/05/01TottenhamMan United31H11D...2.102.63.202.372.603.252.352.623.32.25

4 rows × 45 columns

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

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

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

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

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

  我们知道 2005-06 年数据在 playing_statistics[2] 中:

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

  特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,得到更好的训练模型。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,一般认为括特征构建、特征提取、特征选择三大部分。大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

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

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

  HomeTeamAwayTeamFTHGFTAGFTRHTGDATGD375FulhamMiddlesbrough10H-11-9376Man UnitedCharlton40H34-10377NewcastleChelsea10H451378PortsmouthLiverpool13A-2330379West HamTottenham21H-416

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

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

  HomeTeamAwayTeamFTHGFTAGFTRHTGDATGDHTPATP375FulhamMiddlesbrough10H-11-94545376Man UnitedCharlton40H34-108047377NewcastleChelsea10H4515591378PortsmouthLiverpool13A-23303879379West HamTottenham21H-4165265

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

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

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

我们用:

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

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

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

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

  HomeTeamAwayTeamFTHGFTAGFTRHTGDATGDHTPATPHM1AM1HM2AM2HM3AM3375FulhamMiddlesbrough10H-11-94545LDWDWL376Man UnitedCharlton40H34-108047DLLLWW377NewcastleChelsea10H4515591DLWWWW378PortsmouthLiverpool13A-23303879WWWWLW379West HamTottenham21H-4165265WWLDLL

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

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

  HomeTeamAwayTeamFTHGFTAGFTRHTGDATGDHTPATPHM1AM1HM2AM2HM3AM3MW375FulhamMiddlesbrough10H-11-94545LDWDWL38376Man UnitedCharlton40H34-108047DLLLWW38377NewcastleChelsea10H4515591DLWWWW38378PortsmouthLiverpool13A-23303879WWWWLW38379West HamTottenham21H-4165265WWLDLL38

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

  HomeTeamAwayTeamFTHGFTAGFTRHTGDATGDHTPATPHM1AM1HM2AM2HM3AM3MW5695NewcastleChelsea3.00.0H-0.2894740.7105261.0789471.842105LDLWLW38.05696SouthamptonMan City0.01.0A-0.4736842.0526320.9473682.552632WWDDWW38.05697SwanseaStoke1.02.0A-0.710526-0.8947370.8684210.789474LLLDLD38.05698TottenhamLeicester5.04.0H0.973684-0.0789471.9473681.236842WWLLWL38.05699West HamEverton3.01.0H-0.578947-0.3157891.0263161.289474DDWWLW38.0

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

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

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

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

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

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

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

  HTGDATGDHTPATPHM1_DHM1_LHM1_WAM1_DAM1_LAM1_W...HM2_WAM2_DAM2_LAM2_WHM3_DHM3_LHM3_WAM3_DAM3_LAM3_W300.7248210.339985-0.043566-0.603098100100...000100101031-0.702311-1.088217-1.097731-2.192828010100...0010001010320.0112550.339985-0.570649-0.603098010100...000100101033-0.345528-0.374116-1.097731-1.662918010100...0010001100340.0112551.054086-0.5706490.456723100001...0001001010

  5 rows × 22 columns

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

  

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

  

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

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

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

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

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

  API:sklearn.linear_model.LogisticRegression(penalty=‘l2’, dual=False, tol=0.0001, C=1.0,fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None,solver=‘liblinear’, max_iter=100, multi_class=‘ovr’, verbose=0,warm_start=False, n_jobs=1)

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

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

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

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

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

  sklearn.svm.SVC(C=1.0,kernel=‘rbf’,degree=3,gamma=‘auto’,coef0=0.0,shrinking=True,probability=False,tol=0.001,cache_size=200,class_weight=None,verbose=False,max_iter=-1,decision_function_shape=None,random_state=None)

  主要调节的参数有:C、kernel、degree、gamma、coef0;参数详解请参考。

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

  XGBoost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective=‘reg:linear’, booster=‘gbtree’, n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)

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

  通过运行结果,我们发现:

  我们使用 sklearn 的 GridSearch 来进行超参数调参。

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

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

  通过该文章,您应该初步熟悉数据挖掘与分析和机器学习的流程,了解监督学习中逻辑回归模型,支持向量机模型和 XGBoost 模型的基本思想,熟悉机器学习库 Pandas、Scikit-Learn、Searbon、XGBoost、joblib 的基本使用。需要注意的是:如果您未使用 MO 平台,可能还需要安装 XGBoost、SKlearn 等第三方库,目前 Mo 平台已安装常用的机器学习相关的库,可以省去您安装开发平台的时间;另外,也已在平台公开,可以直接导入。目前对于主流的机器学习库的相关资料,我们总结如下:

  目前我们模型的准确率还不是很高,还可以进一步的改进我们的模型,这里我们提供一下解决思路:

  我们已经将以上内容整理成机器学习实战相关课程,您可以在网站 中选择 监督学习-分析和预测足球比赛结果 进行实操学习。您在学习的过程中,发现我们的错误或者遇到难题,可以随时联系我们大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!。

  Mo(网址:)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。

  Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。

  目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不定期进行论文分享与学术交流。希望能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推动人工智能民主化、应用普及化。

  

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

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

热门文章
  • 达利奇:葡萄牙能帮我们找出问题 他们与西班牙风格类似

    达利奇:葡萄牙能帮我们找出问题 他们与西班牙风格类似
         直播吧1月23日讯 葡萄牙足协官方宣布,为备战2024年欧洲杯,葡萄牙国家队将于当地时间6月8日下午5点45分在里斯本的国家体育场(Estadio Nacional)对阵克罗地亚大佬们都在玩{ 精选官网网址: www.vip333.Co }值得信任的品牌平台!。   克罗地亚足协主席马里扬-库斯蒂奇(Marijan Kustić)也对两队之间即将进行的比赛发表了看法:“我很高兴能与克罗地亚足协达成协议,在德国欧洲杯之前进行这样一场比赛,这将是对两支球队的...
  • 五秒违例有哪几种情况

    五秒违例有哪几种情况
      五秒违例是指在驾驶过程中,违反交通规则或者交通信号灯的行为,这种行为可能会导致交通事故的发生,严重危害驾驶人和行人的生命安全。五秒违例有哪几种情况?下面我们来详细介绍。   闯红灯是最常见的五秒违例行为之一。在城市道路上,很多司机为了赶时间或者出于其他原因,会忽略红灯的存在,直接闯红灯。这种行为不仅有违交通规则,而且很容易引起交通事故。我们在驾驶过程中一定要严格遵守交通信号灯,不要轻易闯红灯。 教练员看法或者建议:   作为教练员,我建议驾驶人在驾驶前一...
  • 亚洲杯首轮比赛拒绝冷门 第一集团优势依然明显

    亚洲杯首轮比赛拒绝冷门 第一集团优势依然明显
      随着沙特队伤停补时阶段逆转绝杀阿曼队,2023亚洲杯小组赛北京时间今天(17日)凌晨已经战罢第一轮全部12场比赛,24支参赛队全部亮相。不得不说,亚洲足坛的整体形势依然非常明确,第一集团的优势依然明显。而中国队全面退化的形势进一步加剧,并没有因为全面而深入的反腐让下滑的势头有所制止,甚至不得不悲观地承认:按目前的势头下去,中国队在本届亚洲杯小组赛中不出线的可能性在加剧!      第一集团优势仍明显   尽管所有人都在说,亚洲足坛在进步,强弱之间的差距在...
  • 英超各队营收(英超各队营收多少)

    英超各队营收(英超各队营收多少)
      1、为什么英超俱乐部最赚钱? 2、一年盈利近千万英镑,这支英超降级队是怎么做到的? 3、欧洲足球俱乐部营收能力如何? 4、英超球队身价排名最新 5、英超排名的收入 6、邮报评英超各队半程表现   1、英超球队盈利情况得益于欧足联的财政公平政策,虽然欧足联的这一政策让不少豪门球队紧缩预算,却在很大程度上避免了转播收入激增、同时薪资支出也水涨船高的情况。(图片来源网络,侵删)   2、英超球队为什么能在转会市场上近...
  • 国足要复制葡萄牙队神迹,三连平小组出线,最终夺冠?

    国足要复制葡萄牙队神迹,三连平小组出线,最终夺冠?
      2016年欧洲杯,作为种子队的葡萄牙队,分到了冰岛、奥地利和匈牙利,坦率地说,这个抽签结果非常好,但是葡萄牙队1比1战平冰岛,0比0战平奥地利,3比3战平匈牙利,三战全平积3分,以4个成绩最好的小组第三名额出线。   大佬们都在玩{ 精选官网网址: www.vip333.Co }值得信任的品牌平台!   但进了淘汰赛后,葡萄牙队开挂了,一方面碰到的对手不是很强,另一方面运气极佳,决赛他们在完全占据劣势的情况下,1比0绝杀法国队,最终夺得队史首个欧洲杯冠军。大佬...