T
traeai
登录
返回首页
Towards Data Science

Can Machine Learning Predict the World Cup?

7.0Score

TL;DR · AI 摘要

机器学习模型在预测世界杯比赛结果上表现有限,86%的主场胜利预测表明模型存在偏差。

核心要点

  • 使用了包括多元回归、LightGBM等模型进行预测。
  • 模型预测主场胜利的准确率为86%,但存在偏差。
  • 数据集包含49,000场比赛,时间跨度从1872年到2026年。

结构提纲

按章节快速跳转。

  1. 文章旨在构建一个机器学习模型,预测世界杯比赛结果。

  2. 文章使用了包含49,000场比赛的数据集,涵盖从1872年到2026年的比赛。

  3. 文章比较了多元回归LightGBM等模型的性能。

  4. 文章讨论了如何处理数据集中的团队名称不一致问题。

  5. Elo评分处理

    文章指出Elo评分更新时间与比赛时间不一致可能导致数据泄露。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 机器学习预测世界杯
    • 数据集
      • 49,000场比赛
      • 时间跨度:1872-2026
    • 模型
      • 多元回归
      • LightGBM
      • 预测准确率:86%主场胜利
    • 挑战
      • 数据处理问题(团队名称不一致)
      • Elo评分更新时间问题

金句 / Highlights

值得收藏与分享的关键句。

#机器学习#足球预测#数据科学#R语言
打开原文

机器学习能否预测世界杯? | Towards Data Science

机器学习

机器学习能否预测世界杯?

使用 R 构建一个机器学习足球预测器

Marco Hening Tallarico

2026 年 6 月 9 日

18 分钟阅读

分享

引言

随着国际足联计划于 2026 年 6 月 11 日星期四在墨西哥城体育场举行开幕赛,我认为构建一个最佳的机器学习模型来预测比赛结果会很有趣。为了做到这一点,我汇集了多个数据库——共包含 49,000 场比赛——这些数据库包含 Elo 评分、比赛结果和杯赛地点的数据。从国际足联到波罗的海杯,涵盖 1872 年至 2026 年的比赛,我们将采用概率方法来研究这项运动。

我们将比较几种机器学习模型的性能,包括:

  • 多项式回归
  • 多项式岭回归 / 弹性网络模型
  • LightGBM

我们还将努力了解模型的优缺点,以创建一个经过良好校准的模型,该模型在 86% 的情况下能准确预测主队获胜。通过权衡模型性能、校准和复杂性,我们将找到最适合我们数据的模型。

用数字解读足球

训练数据集中每场比赛总进球数的分布,显示了低进球数比赛的集中趋势和高进球数比赛的长右尾。插图由作者提供。

很多人说足球令人昏昏欲睡。作为一名足球迷,我不同意,但公平地说,这并非没有原因。大多数比赛的进球数少于 5 个,超过 20 个进球的比赛则可能是异常值,甚至不可能发生。相比之下,在一场 NBA 比赛中,一名球员得分超过 50 分并不罕见。但尽管节奏缓慢,从英格兰的酒吧到里约热内卢的 botecos,这些地方仍然人满为患。

批评者没有意识到的是,低比分可以让比赛更加有趣,因为这使得球队难以取得显著的领先优势,从而让球迷直到比赛结束都保持紧张。不幸的是,这也意味着比赛在接近 22% 的情况下以平局结束——这同样令人沮丧。然而,这项运动依然一如既往地受欢迎。

2018 年之前训练数据集中国际比赛的年度数量,显示了国际足球活动从早期稀疏的记录到 20 世纪末之后持续高比赛量的长期扩展。插图由作者提供。

事实上,如此多的比赛以平局结束,这实际上会在稍后成为建模中的一个问题。但在进入这一点之前,让我们先回顾一下我们是如何将这些数据整合在一起的。

整合数据

很多时候,提高模型的最佳方法就是获取更多数据。我们将使用 international_results.csv、international_team_ratings.csv 和 international_goalscorers.csv 这三个文件。

我们希望将 international_results.csv 与 international_team_ratings.csv 进行匹配,以便使用 Elo 评分。这听起来可能很简单,但正如你可能猜到的那样,球队名称并不完全匹配,因此除非我们想逐一检查 336 支球队,否则我们需要借助文本处理。我们还必须非常小心 Elo 评分的更新时间。我们可以在比赛当天使用 Elo 评分,但这会导致数据泄漏,因为 Elo 评分只在比赛之后才会更新。虽然将 Elo 评分作为特征使用很诱人,但这也存在问题。

我们必须使用最新的 Elo 评分,并且作为额外的工程化特征,我们记录自最近一次 Elo 更新以来的时间,假设较早的评分比更早的评分更具信息性。合并这些表以及整个项目的代码可在附录中找到。

按比赛数量排序的顶级赛事在训练数据集中的表现,突显了友谊赛和 FIFA 世界杯预选赛相对于所有其他国际比赛的主导地位。插图由作者提供。

international_results.csv

字段类型

示例

比赛标识

code
source_match_id

,

code
date
code
season
code
competition

球队

code
home_team
code
away_team

最终结果

code
home_score
code
away_score
code
match_result
code
result_class

上下文

code
neutral
code
tournament
code
city
code
country

international_team_ratings.csv

特征

含义

code
home_rating_pre_match

比赛开始前主队的 Elo 评分

code
away_rating_pre_match

比赛开始前客队的 Elo 评分

code
rating_diff

主队 Elo 减去客队 Elo

code
rating_age_days_home

主队评分的陈旧程度

code
rating_age_days_away

客队评分的陈旧程度

international_goalscorers.csv

特征想法

最近比赛中独特的进球者

球队是否依赖于一个或多个进球者

最佳射手的进球数

进球的集中程度

近期的进球表现

比赛前的进攻产出

训练集和测试集之间比赛结果类分布的比较,显示总体上结果分布相似,主队胜利是最常见的结果,其次是客队胜利和平局。插图由作者提供。

由于我们正在进行时间序列预测,我们需要确保我们的划分尊重时间顺序。我们将对 2018 年及以后的所有比赛进行模型评估,这大约是 8000 场比赛。

有效的划分

大致日期逻辑

模型训练

2018 年之前数据的较早部分

验证

2018 年之前训练数据池的最新约 20%

测试

2018 年及以后

工程化特征

用于模型训练的工程化特征分布概述,显示主队和客队历史中之前的比赛场数、近期平局率、进球差度量、进球数和失球数率以及每场比赛得分指标。插图由作者提供。

我们希望从基本的比赛级别预测因子转向更丰富的赛前特征,这些特征可以捕捉:球队实力、进攻和防守质量、主场/客场效应、比赛平衡性、守门员实力、历史表现趋势。

1. 平局建模特征

我们基线多项逻辑回归模型最明显的失败之处是其在分类平局时的弱表现。虽然模型可以计算平局的概率,因为我们定义目标变量为 match_result ∈ {H, D, A}(主队胜利、平局、客队胜利),但平局从未是最可能的结果。我们可以通过混淆矩阵中缺少平局的列来观察这一点。

最佳基线模型的行归一化测试混淆矩阵,显示该模型仅预测主队和客队结果,主队胜利最常被正确分类,而平局从未被预测为一个独立类别。插图由作者提供。

这种糟糕的预测表现并不是某个特定模型家族独有的问题。当我们单独分析高置信度错误——即模型预测的类别错误,且最大预测概率至少为 0.60 的情况时,所有模型都表现出相似的模式:它们对主队获胜的预测过于自信。许多实际以平局结束的比赛被赋予了高度自信的主队获胜预测,这表明模型在捕捉球队实力方向方面优于对比赛层面的不确定性或平局可能性的预测。

在测试集上,模型高置信度错误预测的数量,比较了三个模型家族,显示大多数自信错误发生在实际平局被预测为主队胜利时。插图由作者提供。

为了解决对平局选项的“盲点”,我们可以构建一些特征,如 abs_rating_diff、home_draw_rate_last_5、form_draw_rate_mean_last_5,以及二进制上下文特征,如 neutral、flag_is_world_cup 和 flag_is_friendly,这些特征可以表示比赛是否在中立场地进行,或者是否在世界杯或友谊赛中进行。

特征组

Elo 接近程度

衡量两队实力匹配的均衡程度。较小的评分差距对平局概率特别相关。

code
abs_rating_diff

近期平局倾向

衡量每支球队之前比赛以平局结束的频率。

code
home_draw_rate_last_5
code
away_draw_rate_last_10

综合平局倾向

捕捉两队是否最近都倾向于平局。

code
form_draw_rate_mean_last_5
code
form_draw_rate_mean_last_10

比赛上下文

可能影响平局频率的赛事和场地指标。

code
flag_is_world_cup
code
flag_is_friendly

最终 LightGBM 按结果类别预测的概率。插图由作者提供。

通过这些特征,我们的模型现在可以更好地区分主队/客队胜利和平局,如真阳性平局预测增加了 3.3% 所示。考虑到约 20% 的比赛以平局结束,这个数值仍然偏低。因此,我们的特征有所帮助,但效果有限。这表明,或许值得构建一个专门用于平局建模的模型,目标变量 match_result ∈ {D, ¬D},但目前我们还需要构建更多特征。

¬D 表示不是 D,我们的目标变量是比赛以平局结束(1),或比赛没有以平局结束(0)

最佳 LightGBM 验证模型的测试混淆矩阵。插图由作者提供。

2. Elo 特征

平均球队的 Elo 略高于 1500;这与沙特阿拉伯、冰岛和海地在 FIFA 2026 的 Elo 接近。当我们绘制主队胜利、平局和客队胜利的分布时,可以看到随着差距的减少,平局的可能性逐渐增加。我们的分布也略微向左偏移,表明存在轻微的主场优势,这与预期一致。

比赛前主队评分分布。插图由作者提供。

按比赛结果划分的评分差分布。插图由作者提供。

如果我们仅依赖比赛前的 Elo 作为唯一特征,我们将损失一些 LogLoss 分数。为了充分利用数据,我们还需要:

比赛开始前主队的 Elo 评分。

比赛开始前客队的 Elo 评分。

比赛开始前主队 Elo 减去客队 Elo。正值表示对主队有利。

主队 Elo 评分上次更新以来的天数。

客队 Elo 评分上次更新以来的天数。

按评分差划分的多项式概率曲线。插图由作者提供。

3. 滚动过去表现特征

一位批评者可能会认为,使用滚动过去表现和Elo评分不是一个好主意,因为它们都用于建模球队实力,这会为模型添加冗余或高度相关的特征。

滚动过去表现确实反映了球队实力,但它的作用是特别用于建模球队的势头。在体育比赛中,连胜是真实存在的现象。事实上,目前超级计算机的首选是西班牙队。他们之所以被预测为第一名,原因之一是他们在进入FIFA 2026之前有着31场不败的历史纪录。

最近每场比赛得分

每支球队过去5场或10场比赛中平均获得的积分。

code
home_points_per_match_last_5
code
away_points_per_match_last_10

最近的进球差

过去比赛中进球数减去失球数的平均值。

code
home_goal_diff_per_match_last_5
code
away_goal_diff_per_match_last_10

最近平局率

过去比赛中以平局结束的比赛所占比例。

主客场表现差异

主队和客队在相同滚动指标上的差异。

code
form_points_diff_last_5
code
form_goal_diff_diff_last_10

之前的比赛场数

在比赛开始前可用的先前比赛场数。

code
home_prior_matches
code
away_prior_matches

4. 进攻和防守表现特征

尽管我们的模型试图通过积分来捕捉进攻和防守的球队实力,但在这方面,我们的模型与超级计算机的方法相比仍有不足。现代方法通常还会使用球员数据,这对于计算球队实力非常重要。由于我们只使用比赛级别的数据,因此我们的进攻和防守特征建模是基于以往比赛结果,如近期进球率、失球率、进球率差异和失球率差异。

近期进球率

过去5场或10场比赛中每场比赛平均进球数。

code
home_goals_for_per_match_last_5
code
away_goals_for_per_match_last_10

近期失球率

过去5场或10场比赛中每场比赛平均失球数。

code
home_goals_against_per_match_last_5
code
away_goals_against_per_match_last_10

进球率差异

主队近期进球率减去客队近期进球率。

code
form_goals_for_diff_last_5
code
form_goals_for_diff_last_10

失球率差异

主队近期失球率减去客队近期失球率。较低的值对主队防守有利。

code
form_goals_against_diff_last_5
code
form_goals_against_diff_last_10

数值模型特征的相关性热图。插图由作者提供。

网格搜索

由于大型搜索网格在交叉验证中容易过拟合,且网格搜索的规模是乘法增长的,因此参数是按对数方式搜索的(1e-5, 1e-4, 1e-3, 1e-2)。但像alpha这样的参数必须在0到1之间。

  • glmnet_alpha 控制岭回归和Lasso回归之间的弹性网络混合比例,其中0表示纯岭回归,1表示纯Lasso回归。
  • multinomial_decay 对较大的系数施加更大的惩罚。这可以减少过拟合,但过度衰减可能导致欠拟合。

网格搜索的复杂度 O(n) = 测试的配置数量 × 训练一个模型所需的时间

模型家族

显示的网格/配置

调整了什么

基准模型

code
majority_baseline
code
frequency_baseline
code
rating_diff_multinom

基本未调整;用于比较的基准模型

glmnet

code
alpha = 0, .25, .5, .75, 1

弹性网络混合参数

multinom

code
decay = 0, 1e-5, 1e-4, 1e-3, 1e-2

L2 权重衰减 / 系数收缩

LightGBM

code
less_regular
code
deeper
code
more_regular
code
current_final
code
l2_regularized
code
shallower
code
l1_l2_regularized
code
compact_robust
code
faster_small
code
slower_small

树深度、学习率、提升轮数和正则化设置的命名组合

在比较中,LightGBM 是最复杂的模型家族。与使用少量或没有调参参数的基线模型不同,LightGBM 需要对树的复杂度、学习率、提升轮数和正则化进行选择。这使它更具灵活性,但如果没有仔细调整参数,也会增加过拟合的风险。我们还需要注意不要使用比数据所需更复杂的模型,否则可能会失去可解释性。

GBM 参数是通过比较 LightGBM 配置的一个紧凑网格进行调整的。这些配置在树的复杂度、学习速度、提升轮数和正则化强度上有所不同,同时保持在对数损失上得分最高的模型。下面是 LightGBM 参数的列表。

参数

code
learning_rate

每棵新树可以改变模型的程度。较小的值学习速度较慢,但可能泛化能力更好。

code
num_iterations

/

code
nrounds

提升轮数,即添加的树的数量。更多的树可以提高性能,但也可能导致过拟合。

code
num_leaves

控制每棵树的复杂度。更多的叶子可以捕捉更详细的模式,但会增加过拟合的风险。

code
max_depth

每棵树的最大深度。更深的树可以捕捉更复杂的交互关系。较浅的树更简单且更安全。

code
min_data_in_leaf

叶子中所需的最小观测数。较高的值会使模型对小的噪声模式不那么敏感。

code
lambda_l1

L1 正则化。将某些影响推向零,使模型更简单。

code
lambda_l2

L2 正则化。缩小大的影响,减少过度自信。

code
feature_fraction

每棵树使用的特征比例。使用更少的特征可以减少过拟合。

code
bagging_fraction

每棵树使用的行比例。使用更少的行也可以减少过拟合。

code
bagging_freq

行子采样的频率。如果设置为

code
0

,通常关闭 bagging。

按模型配置的验证对数损失。插图由作者提供。

按模型家族的最佳验证对数损失。插图由作者提供。

最终模型

官方选择的模型是使用 safe_plus_form_compact 特征集的 LightGBM,该特征集使用了 20 个预赛特征,这些特征来自 Elo 评分、比赛上下文和滞后团队摘要。它基于验证集的最低多类对数损失被选中,测试集保留用于最终报告。

所选的 LightGBM 模型在验证集上的对数损失为 0.893,在测试集上的对数损失为 0.873。其验证结果在模型比较中是最好的,但与回归模型的差距很小:在验证集上,多项式回归仅落后约 0.002 个对数损失点。在保留的测试集上,多项式回归在对数损失和宏 F1 上都略微优于 LightGBM。

按特征层级的增量对数损失。插图由作者提供。

这意味着结果应谨慎解读。LightGBM 是官方选定的预测模型,但证据并未表明梯度提升在给定数据上明显优于更简单的回归模型。回归模型仍然非常重要,因为它们更容易解释,并且在某些测试指标上表现略优于其他方法。

测试和验证分割的基线模型指标。插图由作者提供。

特征工程带来的增益同样较为有限。紧凑型滞后特征相对于基线改善了验证集的对数损失,但测试集的提升非常小。进球者特征在模型比较中并未显著改善对数损失。

按特征层级划分的 LightGBM 类别 F1 值。插图由作者提供。

最明显的限制是平局预测。所选模型几乎从不将平局预测为最高类别:在测试集上,它仅正确预测了 1,784 个实际平局中的 2 个,平局召回率为 0.11%。这表明模型的概率估计可能仍然包含有用信息,但 argmax 分类仍然强烈偏向于主队和客队胜利,因此为平局建模单独建立一个模型是一个合理的下一步。Elo 和紧凑型赛前表现提供了一个有用的信号堆栈,但相对于强基线的增益是渐进的。

在测试集上,模型预测主队胜利明显优于客队胜利:

  • 它正确识别了约 87% 的实际主队胜利
  • 它正确识别了约 63% 的实际客队胜利

该模型还可以输出主队、平局和客队胜利的概率分布,这通常比单一硬预测更有用。

校准

最终模型的置信度与预测正确性。插图由作者提供。

基线加模型在测试集上总体校准良好。在各个置信度区间内均如此。这意味着预测的置信度与观察到的准确性一致,即当模型中等置信时,其正确率大致与置信度对应,而当置信度提高时,观察到的准确性也随之提高。与理想校准线的偏差较小,表明模型的概率估计总体上是可用的,而不仅仅是结果的排序。

下面的图表衡量的是预测类别(模型对其所选择结果的置信度)的校准情况,而不是单独衡量主队胜利、平局和客队胜利的校准情况。因此,一个模型可能在整体上看起来校准良好,但仍然可能对某一类别(尤其是平局)的估计有误。综合校准图支持模型的置信度评分总体上是可信的,但单独来看,它并不能证明平局概率的校准情况良好。

基线加模型的测试校准曲线。插图由作者提供。

类别特定的校准图显示了综合图景在哪些地方成立,哪些地方变得更为复杂。在大多数区间中,主队胜利和客队胜利的概率与理想校准线紧密吻合:随着模型对任一结果分配更高的概率,观察到的频率也大致以相同的速度上升。从实际角度来看,模型的主队和客队胜利概率表现得像有意义的概率,而不仅仅是分数。

最佳验证模型的校准区间。插图由作者提供。

抽签情况有所不同。模型在自身范围内对抽签概率的校准是合理的,但该范围较窄。即使比赛相对平衡,模型也很少将抽签概率提升到中等偏上的范围。

这是核心区别:模型并没有忽视抽签;它通常将抽签视为风险因素,而不是可能的结果。抽签概率仍然可以用于衡量抽签风险,但抽签很少成为模型的首选预测,这有助于解释抽签召回率持续偏低的原因。

模型 33 的类别校准测试。插图由作者提供。

评分差异分析

评分差异分析展示了为什么抽签对模型来说在结构上具有挑战性。当两队实力接近时,观察到的抽签率最高,而随着 Elo 评分差距的扩大,抽签率会下降。所有三个模型家族都学习到了这一总体模式:随着比赛变得越来越不平衡,它们预测的抽签概率也会下降。

失败并非方向性问题,而是程度问题。在最势均力敌的比赛中,观察到的抽签率约为三分之一,而模型分配的抽签概率接近四分之一。它们正确地识别出平衡的比赛更容易出现平局,但并未将抽签概率提高到足够的程度。因此,模型可以识别抽签风险,但并不经常将抽签作为最可能的结果。这解释了合理抽签校准与弱抽签召回率之间的表面矛盾:概率向正确的方向移动,但通常不足以赢得 argmax 决策,即选择预测概率最高的类别。

模型 25 按评分差异分组的抽签率。插图由作者提供。

特征重要性

正如你可能预料到的,我们模型最重要的特征是评分差异,其次是比赛是否在中立场进行——后者的重要性远低于前者。通过检查特征重要性,我们可以看到哪些我们构建的特征提供了有意义的信号。

模型 33 LightGBM 特征重要性(按增益)。插图由作者提供。

按评分差异分组的结果率。插图由作者提供。

结论

我认为现在是讨论数据集大小和模型选择的好时机。通常,数据集越大、越复杂,我们越有理由选择更复杂的模型。正如我们在本例中看到的,从回归模型切换到 LightGBM 所获得的收益非常小;这表明在这些数据上尝试更复杂的模型不太可能产生更好的预测。足球预测更多的是关于构建防泄漏特征、比较可解释的基线模型,以及询问模型的置信度是否合理,而不是寻找某种神奇的算法。目前,有一点是明确的:如果我们想要获得更好的预测,我们需要更多的数据。特别是球员级别的数据——知道内马尔是否缺席非常重要。如果我们希望随着比赛的进行调整预测,数据的粒度也很重要。

附录

整个项目的代码可以在我的 GitHub 上找到。数据源采用 Creative Commons CC0-1.0 许可证。

code
make_team_clean <- function(team_name) { team_name |>
as.character() |>
stringr::str_squish() |> # Removes extra spaces.
stringi::stri_trans_general("Latin-ASCII") |> # Converts accented Latin characters to plain ASCII characters.
stringr::str_to_lower() |>
stringr::str_replace_all("[^a-z0-9]+", "") |> stringr::str_replace_all("^|_$", "")
}
  • stringr::str_squish() 去除多余的空格
  • stringi::stri_trans_general("Latin-ASCII") 将带重音的拉丁字符转换为普通的 ASCII 字符。
  • str_to_lower() 将所有字符转换为小写。
  • stringr::str_replace_all("[^a-z0-9]+", "_") 它将所有不是小写字母或数字的字符替换为下划线。

Website | LinkedIn | GitHub

Written By

See all from Marco Hening Tallarico

Deep Dives

FIFA

Football Analytics

Sport Analytics

Share This Article

  • Share on Facebook
  • Share on LinkedIn
  • Share on X

Towards Data Science 是一个社区出版物。提交您的见解以触达全球受众,并通过 TDS 作者支付计划获得报酬。

Update the href to your actual submission URL

Write for TDS

✦ end CTA ✦

AI 可能会生成不准确的信息,请核实重要内容

Can Machine Learning Predict the World Cup? | Towards Data Science | traeai