你的模型真的比“永远猜主胜”强吗?
有人告诉你,他的足球预测模型准确率 51.79%。这个数字该怎么读? 如果对照物是“三选一瞎猜的 33%”,那它赢了 18 个百分点,很了不起。 但真正的对照物不是瞎猜——是“每场都押主队赢”这个不需要任何模型、 一行代码就能实现的策略。在同一份测试数据上,这个笨办法能拿到 42.05%。 于是模型的真实贡献从 18pp 缩水到 9.74pp。 本文用一篇 2023 年公开论文(七大联赛、11 个赛季、26,620 场)的真实数字, 拆解三个让模型显得比实际更聪明的评估陷阱:基线选错、 弃答率藏在准确率背后、以及训练测试分布漂移。 文中每个数字都可以用文末代码复算。
1 一个真实的数字,和一个错误的对照
2023 年,一篇发表在 Electronics 上的论文做了一件相当扎实的工作[1]。 三位来自波兰卡托维兹经济大学的研究者写了爬虫,从公开数据源抓下英格兰、西班牙、德国、意大利、 法国、荷兰、葡萄牙七大联赛十一个赛季的数据,做完清洗、连接、补缺, 整理成一份约 26,620 场比赛的结构化数据集,然后公开发布。
这件事本身值得称赞。做过体育数据的人都知道,最难的从来不是调模型,而是把干净的数据凑齐。 论文里有个细节特别能说明他们的认真程度:2016/17 赛季法甲 Bastia 对 Lyon 那场, 因为球场骚乱被判罚,联盟直接给了 0:3 的判决结果——数据源里没有这条,他们手动从其他渠道补齐了。 新冠停赛导致的缺口(比如 19/20 赛季法甲第 27 轮、意甲第 29 轮)无法补全, 他们就如实标注为缺失,没有拿平均值糊过去。
数据集之上,他们跑了一组实验:五种基础分类器(决策树、支持向量机、AdaBoost、Bagging、随机森林), 四类投票方式,组合成 12 个方案,每个方案重复 30 次取平均。 严格按时间切分——训练集截止到 2021/22 赛季第 17 轮,测试集是第 18 轮到赛季结束。 这一点很关键,它避免了用未来数据预测过去的时间穿越问题。
最好的全覆盖方案(论文中的 approach07)在七大联赛平均拿到了 51.79% 的准确率。
然后论文写了这样一句话:
论文原文
“The obtained results exceed the random approach = 33% (three decision classes).” ——“所得结果超过了随机方法 = 33%(三个决策类)。”
这句话在技术上没有说错——51.79% 确实大于 33.33%。但作为一个评估结论, 它几乎没有传递任何信息。因为在足球比赛里,没有任何人会用抛硬币的方式做预测。
问题的核心
把模型和“随机瞎猜”比较,是在和一个没有人会选择的对手比赛。 这种比较能让几乎任何模型看起来都很成功,因此它无法帮你判断模型到底有没有用。
2 基线到底该选谁
基线(baseline)的作用是回答一个问题:如果我什么都不做,或者只做最笨的事,能拿到多少? 只有超过这个数字,你的工作才产生了价值。所以基线的选择标准很明确—— 它应该是你真正需要击败的那个东西,而不是最容易击败的那个。
对三分类的足球预测来说,有三个候选基线,难度递增:
| 基线 | 做法 | 典型水平 | 意义 |
|---|---|---|---|
| 随机基线 | 三个结果等概率乱猜 | 33.33% | 下限中的下限,无实际参考价值 |
| 多数类基线 | 永远预测出现最多的那一类(足球里就是主队赢) | 40%–46% | 真正的及格线,一行代码即可实现 |
| 市场基线 | 照抄博彩公司赔率隐含的概率 | 53%–55% | 行业标杆,包含了海量信息 |
中间那一行是本文的主角。它的逻辑非常朴素:足球有主场优势,主队赢球的比例长期稳定在 45% 左右, 是三个结果里最常见的。所以只要每一场都无脑押主队赢,你就能自动获得约 45% 的准确率。 这个策略不需要特征工程,不需要训练,不需要调参,不需要电脑——一张纸和一支笔就够了。
要点
任何声称“准确率超过 50%”的三分类足球模型, 必须先回答:同一份测试数据上,多数类基线是多少? 这两个数字之差,才是模型的真实增益。
那么在这篇论文的数据上,多数类基线究竟是多少?论文自己没算。但幸运的是, 它公布了完整的类别分布表——有了这张表,我们可以自己算出来。
3 算一遍:这份数据的基线是 42.05%
论文的表 7 给出了七个联赛训练集与测试集里三种结果各自的占比。 把测试集的占比乘上各联赛的测试集场数,我们就能算出“永远押主队赢”到底能对多少场。 下面是完整过程,每个数字都来自论文原表。
| 联赛 | 测试场数 | 平局 | 主队胜 | 客队胜 | 最多的类 | 基线准确率 |
|---|---|---|---|---|---|---|
| 英格兰 英超 | 363 | 19.52% | 38.57% | 41.90% | 客队胜 | 41.90% |
| 西班牙 西甲 | 363 | 27.14% | 42.38% | 30.48% | 主队胜 | 42.38% |
| 德国 德甲 | 289 | 22.22% | 49.67% | 28.10% | 主队胜 | 49.67% |
| 意大利 意甲 | 363 | 24.29% | 44.29% | 31.43% | 主队胜 | 44.29% |
| 法国 法甲 | 363 | 26.19% | 35.71% | 38.10% | 客队胜 | 38.10% |
| 荷兰 荷甲 | 289 | 23.53% | 45.10% | 31.37% | 主队胜 | 45.10% |
| 葡萄牙 葡超 | 289 | 24.84% | 40.52% | 34.64% | 主队胜 | 40.52% |
| 加权合计 | 2319 | — | — | — | 主队胜 | 42.05% |
加权平均的算法是:把每个联赛的主队胜率乘上它的测试场数,加总后除以总场数 2319。 结果是 0.420542,也就是 42.05%。
其中 ni 为第 i 个联赛的测试集场数, pi,home 为该联赛测试集中主队获胜的比例。
现在可以把两种比较摆在一起了:
| 对照物 | 对照值 | 模型增益 | 这个数字诚实吗 |
|---|---|---|---|
| 随机瞎猜(论文采用) | 33.33% | +18.46pp | 技术上正确,但严重夸大 |
| 多数类基线(本文主张) | 42.05% | +9.74pp | 这才是模型的真实贡献 |
发现 1
用随机基线得到的 +18.46pp,是用多数类基线得到的 +9.74pp 的 1.90 倍。换一个对照物,同一个模型的“贡献”就凭空翻了将近一倍。
需要说清楚的是:+9.74pp 并不是一个差成绩。在足球预测这个噪声极大的问题上, 能稳定地从公开的积分榜特征里榨出接近十个百分点,是实打实的工作量。 本文要指出的不是模型不行,而是论文选错了对照物,因此没能准确报告自己的成绩—— 说成 18pp 反而削弱了可信度,而 9.74pp 是站得住的。
一个容易忽略的细节:英超和法甲的多数类不是主队
看表 2 会发现两个反常的行。在这段测试期里,英超的客队胜率(41.90%)高于主队胜率(38.57%), 法甲同样如此(38.10% 对 35.71%)。也就是说,如果你在这两个联赛里“永远押主队”, 你甚至不是在用最强的那个笨办法。
这里必须区分两种基线,否则会不小心作弊:
| 基线定义 | 多数类由谁决定 | 基线值 | 模型增益 |
|---|---|---|---|
| 诚实基线 | 训练集(七个联赛都是主队胜) | 42.05% | +9.74pp |
| 事后基线 | 测试集自己(等于偷看了答案) | 42.95% | +8.84pp |
本文全篇采用 42.05% 这个诚实版本。理由很简单:在真实预测场景里, 你只能根据历史数据判断“哪一类最常见”,不可能预先知道未来半个赛季客队会反超。 事后基线的 42.95% 用到了测试集的答案,属于典型的数据泄漏,只能作为参考不能作为对照。
两者相差 0.90pp——这个不大的差值其实是个信号,说明训练期和测试期的比赛结果分布 发生了变化。这件事本身很重要,我们放到第 5 节专门讨论。
4 第二个陷阱:59.83% 是怎么“造”出来的
论文表 9 里还有一个更高的数字。十二个方案中,准确率最高的是 approach02, 达到 59.83%,比全覆盖最佳的 51.79% 高出整整 8 个百分点。
它凭什么高?因为它可以拒绝回答。approach02 让五个分类器投票, 意见不够统一就放弃这场比赛。而它愿意开口的比例——论文表 9 的 Cover 列——只有 53.00%。
两种准确率
条件准确率(论文的 Accuracy 列):在模型给出预测的场次里,猜对的比例。
全样本准确率(论文的 Accuracy All Case 列):在全部场次里,猜对的比例。
两者关系是一个乘法:全样本准确率 ≈ 条件准确率 × 覆盖率。
这里要为论文说一句公道话:它把两个数字都列出来了。 Accuracy 和 Accuracy All Case 是表 9 里并排的两列,作者没有隐藏任何东西。 问题出在正文只引用了高的那个,并且拿它和 33% 比较。 一个只读摘要和结论的读者,会带走 59.83% 这个印象。
把四个关键方案摊开,真相非常清楚:
| 方案 | 覆盖率 | 条件准确率 | 全样本准确率 | 相对 42.05% 基线 |
|---|---|---|---|---|
| approach07 不弃答 |
100.00% | 51.79% | 51.79% | +9.74pp |
| approach11 少量弃答 |
97.00% | 52.04% | 50.72% | +8.67pp |
| approach12 大量弃答 |
54.00% | 59.35% | 31.79% | −10.26pp |
| approach02 论文最高准确率 |
53.00% | 59.83% | 31.51% | −10.54pp |
看最后一行。那个最漂亮的 59.83%,全样本准确率只有 31.51%—— 比“永远押主队赢”的 42.05% 低 10.54 个百分点, 甚至比论文自己当作对照的随机 33.33% 还低 1.82 个百分点。
发现 2
在论文表 9 的十二个方案里,条件准确率最高的两个(approach02 的 59.83%、approach12 的 59.35%) 恰好是全样本准确率最低的两个(31.51%、31.79%)。 这不是巧合——弃答率是同一枚硬币的两面: 你放弃的比赛越多,剩下的看起来越简单。
为什么会这样:被弃掉的比赛并没有消失
53% 的覆盖率意味着,在 2319 场比赛里模型对大约 1090 场选择了沉默。 这些比赛不会因为模型不表态就不踢。如果你真的要做决策, 在这些场次上你仍然需要一个答案。
公平的比法很简单:让弃答的场次退回基线策略——模型不敢说的,就无脑押主队。 这样两个方案都覆盖全部比赛,可以直接比较。
代入 c = 0.5300、 acond = 0.5983、 abase = 0.4205, 得 0.5148,即 51.48%。
51.48% 对比全覆盖 approach07 的 51.79%——低了 0.31 个百分点。
也就是说:让五个分类器投票、设置严格的一致性门槛、放弃将近一半的比赛, 这一整套机制折腾下来,还不如让模型老老实实把每场都预测一遍。 它在这份数据上的净价值是负数。
要点
看到任何带“高置信度筛选”“只推荐有把握的场次”字样的准确率, 第一件事是问覆盖率,然后做一次乘法。 没有覆盖率的准确率,等于没有分母的分数。
数据说明:论文所有实验重复 30 次取平均, 因此 Accuracy × Cover 与自报的 All Case 之间存在约 0.002 的舍入差 (例如 approach02:0.5983 × 0.5300 = 0.3171,论文自报 0.3151)。 本文表 5 的全样本准确率一律采用论文自报值,未做二次换算。
5 第三个陷阱:测试集和训练集不是一个世界
回到第 3 节末尾那个 0.90pp 的小差值,它指向一个更隐蔽的问题。
论文表 7 同时给出了训练集分布。训练集里七个联赛全部是主队胜占比最高, 相当稳定地落在 44% 到 48% 之间。但到了测试集,情况变了:
| 联赛 | 训练集主胜率 | 测试集主胜率 | 变化 |
|---|---|---|---|
| 英格兰 英超 | 46.08% | 38.57% | −7.51pp |
| 西班牙 西甲 | 47.61% | 42.38% | −5.23pp |
| 德国 德甲 | 44.36% | 49.67% | +5.31pp |
| 意大利 意甲 | 44.37% | 44.29% | −0.08pp |
| 法国 法甲 | 45.37% | 35.71% | −9.66pp |
| 荷兰 荷甲 | 47.55% | 45.10% | −2.45pp |
| 葡萄牙 葡超 | 45.87% | 40.52% | −5.35pp |
七个联赛里五个的主队胜率明显下滑,法甲跌了 9.66pp,英超跌了 7.51pp。 这不是随机波动能解释的幅度。测试期落在 2021/22 赛季后半段, 正是疫情空场与限流政策交替的时期——主场优势的一部分来自现场观众, 观众减少,主场优势就被削弱。
论文注意到了这个现象。它在正文里写道,英超和法甲在测试集中 “class two 的数量高于其他类别”,并称这种训练与测试之间的类别失衡 “为预测引入了额外的困难”。这个观察是准确的, 但论文没有进一步追问:这意味着模型学到的主场优势权重在测试期系统性偏高。
为什么这件事致命
模型在“主队赢 46%”的世界里学规律,却被拿到“主队赢 38.57%”的世界里考试。 这类问题叫分布漂移(distribution shift)。 它不会让程序报错,也不会在交叉验证里暴露,只会让线上表现无声地打折。
德甲反而上升了 5.31pp。这既解释了表 2 里德甲基线高达 49.67%, 也解释了下面这张表里最反直觉的一行。
| 联赛 | 诚实基线 | 最佳全覆盖成绩 | 真实增益 |
|---|---|---|---|
| 英格兰 英超 | 38.57% | 50.40% approach05 | +11.83pp |
| 西班牙 西甲 | 42.38% | 53.21% approach09 | +10.83pp |
| 德国 德甲 | 49.67% | 53.05% approach01 | +3.38pp |
德甲的 53.05% 是三个联赛里绝对准确率最高的, 却是真实增益最低的——不到英超的三分之一。 如果只看准确率排行榜,你会得出完全相反的结论: 以为模型在德甲最有效,实际上它在德甲几乎没做什么。
6 三个问题的检查清单
前面三个陷阱都不是这篇论文独有的。它们在几乎所有“预测比赛结果”的项目里反复出现, 包括很多商业化的付费预测服务。下面这五个问题,够你在五分钟内判断一个准确率数字值不值得相信。
- 基线是什么?不接受“随机瞎猜”作为答案。 三分类问题的正确基线是训练集里最常见的那一类在测试集上的命中率, 足球比赛通常落在 40% 到 50% 之间,不是 33%。
- 覆盖率是多少?如果对方说“我们只推荐有把握的比赛”, 要求给出推荐了多少场、总共多少场,然后自己做乘法。
- 弃答的场次怎么算?不预测不等于不亏钱。 把弃答场次按基线策略补上,再和全覆盖方案比一次。
- 训练期和测试期的分布一样吗? 如果测试期跨越了规则变更、疫情空场、赛制改革, 模型学到的规律可能已经过期。
- 逐联赛看还是只看平均? 平均值会掩盖巨大的内部差异。这篇论文的整体增益是 +9.74pp, 但德甲只有 +3.38pp。如果你只关心德甲,整体数字对你没有意义。
| 问题 | 论文报告 | 核算后 | 差异 |
|---|---|---|---|
| 对照物选错 | +18.46pp vs 随机 33.33% |
+9.74pp vs 基线 42.05% |
夸大 1.90 倍 |
| 弃答率未折算 | 59.83% 条件准确率 |
31.51% 全样本准确率 |
−28.32pp |
| 分布漂移未量化 | 仅定性提及 | 法甲 −9.66pp 主胜率变化 |
五个联赛下滑 |
7 复算代码
本文所有数字都可以用下面这段纯标准库的 Python 复现,不需要安装任何依赖。 输入只有论文表 4 的测试集场数和表 7 的类别分布, 两张表都在论文正文里公开可查。
test = {
# 联赛: (测试集场数, 平局率, 主胜率, 客胜率) —— 论文表 4 + 表 7
"England": (363, 0.1952, 0.3857, 0.4190),
"Spain": (363, 0.2714, 0.4238, 0.3048),
"Germany": (289, 0.2222, 0.4967, 0.2810),
"Italy": (363, 0.2429, 0.4429, 0.3143),
"France": (363, 0.2619, 0.3571, 0.3810),
"Netherlands": (289, 0.2353, 0.4510, 0.3137),
"Portugal": (289, 0.2484, 0.4052, 0.3464),
}
total = sum(n for n, *_ in test.values())
# 训练集里主胜恒为多数类,故基线策略 = 永远押主胜
hits = sum(n * home for n, _, home, _ in test.values())
baseline = hits / total
print("test matches : %d" % total)
print("majority baseline : %.4f (%.2f%%)" % (baseline, baseline * 100))
print("paper best (cover=1): 0.5179 (51.79%)")
print("true gain : %+.2f pp" % ((0.5179 - baseline) * 100))
print("gain vs random 33.3%%: %+.2f pp" % ((0.5179 - 1/3) * 100))
print("exaggeration factor : %.2f x" % ((0.5179 - 1/3) / (0.5179 - baseline)))
# 弃答方案 approach02 折算回全样本
cover, cond = 0.5300, 0.5983
print()
print("approach02 cond acc : %.4f at cover %.2f" % (cond, cover))
print("paper self-reported : 0.3151 (all-case)")
print("fallback-to-baseline: %.4f" % (cond * cover + baseline * (1 - cover)))
实际运行输出:
test matches : 2319
majority baseline : 0.4205 (42.05%)
paper best (cover=1): 0.5179 (51.79%)
true gain : +9.74 pp
gain vs random 33.3%: +18.46 pp
exaggeration factor : 1.90 x
approach02 cond acc : 0.5983 at cover 0.53
paper self-reported : 0.3151 (all-case)
fallback-to-baseline: 0.5148
三个关键数字在这里合上了:基线 42.05%、 真实增益 +9.74pp、 以及“用随机当对照”造成的 1.90 倍夸大。 最后一行 0.5148 则说明, approach02 那套弃答机制在把弃答场次补回基线之后, 比全覆盖的 51.79% 还要低。
代码中的主胜率之所以能直接当作基线命中率, 前提是训练集里主队胜在七个联赛中全部为多数类(论文表 7 可验证)。 若换用其他数据集,需要先确认这个前提是否成立。
8 写在最后
这篇论文做了一件有价值的工作。它公开了七个联赛四个赛季的数据构建流程, 比较了十二种建模方案,报告了完整的精确率、召回率、F1 指标, 并且把条件准确率和全样本准确率都列在了表里。 就数据工作本身而言,它比很多同类研究更诚实。
它真正的成绩,用正确的对照物衡量,是相对多数类基线提升 9.74 个百分点。 在足球这种噪声极大的问题上,这是实打实的贡献。
问题只在于报告方式。当正文写下“所得结果超过了随机方法 33%”, 并且把 59.83% 作为最好成绩呈现时,一个读摘要的读者会带走两个错误印象: 模型有 18 个百分点的优势,以及模型能做到接近六成的准确率。 前者夸大了将近一倍,后者对应的全样本准确率其实连基线都不如。
本文主张
任何足球预测结果的报告,都应当同时给出三个数字: 多数类基线、覆盖率、全样本准确率。 缺少其中任何一个,读者都无法判断模型到底做了多少事。
最后回到标题那个问题:你的模型真的比“永远猜主胜”强吗? 这篇论文的答案是“强,强 9.74 个百分点”。 这个答案比它自己声称的 18 个百分点小得多,但它是真的, 而真的数字才能支撑下一步的改进。
写给做模型的人
在你训练任何足球预测模型之前,先花十分钟算出这份数据的多数类基线, 把它写在报告的第一行。 这个数字会陪你走完整个项目——它决定了你的模型是真的学到了东西, 还是只是学会了统计主队胜率。
参考文献
- 本文评论对象: Głowania, S.; Kozak, J.; Juszczuk, P. Knowledge Discovery in Databases for a Football Match Result. Electronics, 2023, 12(12), 2712. doi:10.3390/electronics12122712(开放获取,CC BY 4.0)
- Rudrapal, D.; Boro, S.; Srivastava, J.; Singh, S. A Deep Learning Approach to Predict Football Match Result. Computational Intelligence in Data Mining, Springer, 2020.
- Baboota, R.; Kaur, H. Predictive analysis and modelling football results using machine learning approach for English Premier League. International Journal of Forecasting, 2019, 35(2), 741–755.
- Hubáček, O.; Šourek, G.; Železný, F. Learning to predict soccer results from relational data with gradient boosted trees. Machine Learning, 2019, 108, 29–47.
- Provost, F.; Fawcett, T. Data Science for Business: What You Need to Know about Data Mining and Data-Analytic Thinking. O’Reilly Media, 2013. (多数类基线与模型评估的标准论述)
- Quiñonero-Candela, J.; Sugiyama, M.; Schwaighofer, A.; Lawrence, N. D. (Eds.) Dataset Shift in Machine Learning. MIT Press, 2009. (分布漂移的系统性讨论)
本文所引用的全部数值均来自被评论论文的公开表格 (表 4 测试集场数、表 7 类别分布、表 9 至表 12 分类质量指标)。 基线值 42.05%、混合策略 51.48%、各联赛真实增益等推导结果, 由本站依据上述公开数据独立计算,计算过程已在正文中逐步给出,读者可自行复核。
本文是一篇方法论评论, 目的在于讨论机器学习模型的评估标准,不构成任何投注建议。 足球比赛结果具有高度不确定性,任何预测模型都无法保证盈利。