第四章:足球特征工程怎么做?模型真正学的是你对比赛的理解
足球预测模型实战

第四章:足球特征工程怎么做?模型真正学的是你对比赛的理解

特征工程不是堆字段,而是把球队实力、状态、赛程、主客场和联赛环境转成赛前可用信号。

2026-05-16浏览 2
正文:17px

很多人刚开始训练足球模型时,会有一个误解:

只要数据足够多,算法自己就能学出来。

这个想法只对了一半。

LightGBM、逻辑回归、泊松模型这些算法,确实可以从数据里学习规律。但它们并不会天然理解足球。

模型不知道什么叫强队。
不知道什么叫低位防守。
不知道什么叫赛程密集。
不知道主场和客场为什么不一样。
不知道一支球队最近进球多,是实力提升,还是短期效率高。
不知道一支升班马在低级别联赛的数据,能不能直接套到高级别联赛。

模型真正能看到的,只是你给它的字段。

你给它“主队近期场均进球”,它才能感知主队近期进攻状态。
你给它“客队近期场均失球”,它才能感知客队近期防守质量。
你给它“双方 Elo 差值”,它才能感知双方长期强弱差距。
你给它“休息天数差”,它才可能学习赛程压力。
你给它“联赛平均进球”,它才知道不同联赛的进球环境不同。

所以,特征工程不是一个技术细节。

它本质上是:

把你对足球比赛的理解,翻译成模型能读懂的变量。

模型学的不是足球本身。

模型学的是你构造出来的足球信息。

这一章就讲清楚:足球预测模型的特征工程到底应该怎么做。


一、特征工程不是字段越多越好

很多人做模型时,容易进入一个误区:

字段越多越好。

于是不断往模型里加:

近期进球;
近期失球;
排名;
积分;
历史交锋;
主客场;
射门;
角球;
控球率;
天气;
伤停;
联赛均值;
赔率;
半场数据;
各种衍生指标。

最后字段越来越多,模型看起来越来越复杂。

但效果不一定更好。

因为特征不是越多越好,而是要满足三个条件:

赛前可得。
足球含义清楚。
长期稳定有效。

如果一个特征赛前拿不到,它不能用。

如果一个特征含义不清楚,模型可能学到噪音。

如果一个特征只在某段时间有效,未来很容易失效。

举个例子。

“某队本赛季最终排名”看起来很有用,但它是未来数据,不能用于赛季中比赛预测。

“最近一场比分”可以用,但单场波动太大,不能单独代表球队真实状态。

“历史交锋胜率”看起来有故事,但很多时候样本太少,容易误导。

所以,特征工程第一原则是:

少而准,比多而乱更重要。

初版模型宁愿只做十几个干净特征,也不要一开始堆上百个不稳定字段。


二、足球特征要围绕六个核心问题构造

一场足球比赛,模型真正需要理解的东西,并没有那么神秘。

大多数特征都可以围绕六个问题展开:

  1. 谁整体更强?
  2. 谁近期状态更好?
  3. 谁进攻更强?
  4. 谁防守更稳?
  5. 主客场是否有明显差异?
  6. 赛程和联赛环境是否会改变比赛节奏?

这六个问题对应六类核心特征:

长期强弱特征;
近期状态特征;
进攻特征;
防守特征;
主客场特征;
赛程和联赛环境特征。

如果你把这六类特征做扎实,已经可以训练出一个比较像样的基础模型。

不要一开始就追求“什么都加”。

足球模型的第一版目标,是建立一个干净、稳定、可解释的基线。

后面再逐步扩展。


三、长期强弱特征:模型需要知道谁更强

足球比赛当然要看强弱。

但模型不能直接理解“强队”这个词。

你必须用数值告诉它。

常见长期强弱特征包括:

Elo 评分;
赛前排名;
赛前积分;
长期胜率;
长期净胜球;
长期进失球差;
球队市场价值或阵容强度评分;
近多个赛季的综合表现。

这里最常用的是 Elo。

Elo 的优势是滚动更新。

球队赢球,评分上升。
球队输球,评分下降。
赢强队,上升更多。
输弱队,下降更多。

Elo 比单纯排名更平滑,也更适合跨时间使用。

在足球模型里,通常不只看主队 Elo 和客队 Elo,更重要的是差值:

EloDiff = HomeElo - AwayElo

如果 EloDiff 很大,说明主队长期强弱优势明显。

如果 EloDiff 接近 0,说明双方长期实力接近。

如果 EloDiff 为负,说明客队长期强弱指标更高。

但要注意,Elo 也不是万能。

它不能直接处理伤停、轮换、赛程、战意、天气这些临场因素。

所以 Elo 适合做基础强弱特征,不适合单独决定模型结果。


四、近期状态特征:状态要看窗口,不要看一场

足球模型必须知道球队近期情况。

但“近期状态”不能只看最近一场。

最近一场噪音太大。

一场大胜,可能是实力提升,也可能是对手红牌。
一场惨败,可能是状态差,也可能是早早少打一人。
一场 0-0,可能是进攻乏力,也可能是门将神勇和机会浪费。

所以近期状态一般要用窗口统计。

常见窗口包括:

最近 5 场;
最近 10 场;
最近 15 场;
本赛季至今;
最近若干主场;
最近若干客场。

比如:

最近5场积分 = 最近5场每场积分之和
最近5场场均进球 = 最近5场总进球 / 5
最近5场场均失球 = 最近5场总失球 / 5
最近10场净胜球均值 = 最近10场净胜球之和 / 10

但是窗口选择要谨慎。

最近 5 场反应快,但波动大。
最近 10 场更稳一些,但反应慢。
赛季均值更稳定,但可能跟不上球队变化。

所以更好的做法不是只选一个窗口,而是同时使用多个窗口。

比如:

最近 5 场表示短期状态;
最近 10 场表示中期状态;
赛季至今表示长期表现。

模型会自己学习哪个窗口更有用。

但前提是这些窗口都必须严格使用比赛日前的数据。


五、窗口特征最容易出现未来数据泄漏

近期状态特征很常见,也最容易出错。

假设你要预测一场比赛:

比赛时间:2025-09-10
主队:A队

你计算 A 队最近 5 场进球时,只能使用:

2025-09-10 之前 A队已经完成的比赛

不能包含 2025-09-10 这场比赛本身。

这个错误很容易在程序里发生。

比如写查询时,如果条件是:

MatchDate <= CurrentMatchDate

就可能把当前比赛也包含进去。

正确逻辑应该是:

MatchDate < CurrentMatchDate

这个小细节非常重要。

如果当前比赛结果进入“最近5场”统计,模型就等于提前知道了答案。

回测会虚高。

上线后会失效。

所以,只要做窗口特征,一定要建立严格的时间边界。


六、进攻特征:不要只看进球数,要看进球能力是否稳定

进攻特征是足球模型的核心。

常见进攻特征包括:

近期场均进球;
主场场均进球;
客场场均进球;
近期进球趋势;
进球场次比例;
连续进球场次;
零进球比例;
大比分场次比例;
射门和射正相关历史均值;
xG 历史均值,如果数据可靠。

最基础的做法是统计近期进球。

比如:

主队最近5场场均进球 = 主队最近5场总进球 / 5
客队最近5场场均进球 = 客队最近5场总进球 / 5

但进球数本身有波动。

一支球队最近 5 场进了 12 个球,看起来很强。

但你要继续判断:

这些进球来自稳定机会,还是短期效率?
对手是不是很弱?
有没有红牌、点球、乌龙?
是不是其中一场 6-0 拉高了均值?

模型如果只看到平均值,可能会被极端比分带偏。

所以可以同时设计一些补充特征。

比如:

最近5场进球中位数
最近5场零进球场次
最近5场单场进3球以上次数
最近10场进球均值

中位数可以降低极端比分影响。

零进球场次可以反映进攻下限。

多窗口可以降低小样本波动。


七、防守特征:失球少不一定等于防守稳

防守特征同样重要。

常见防守特征包括:

近期场均失球;
主场场均失球;
客场场均失球;
零封率;
单场失 2 球以上比例;
被对手进球场次比例;
近期防守趋势;
被射门、被射正、被 xG 历史均值。

最基础的做法是:

主队最近5场场均失球 = 主队最近5场总失球 / 5
客队最近5场场均失球 = 客队最近5场总失球 / 5

但和进球一样,失球也有噪音。

一支球队最近 5 场只丢 2 球,看起来防守很好。

但可能是:

对手进攻弱;
门将表现超常;
对手浪费机会;
赛程轻松;
比赛节奏本来就慢。

如果有射门、射正或 xG 数据,可以用历史滚动值辅助判断。

例如:

最近5场被射正均值
最近5场被xG均值
最近10场被射门均值

但这些数据必须质量可靠。

如果低级别联赛技术统计不完整,宁可不用,也不要把脏数据加入模型。

没有稳定技术统计时,先用失球、零封、失2球以上比例等基础指标,反而更稳。


八、主客场特征:不要把主场和客场混在一起

足球里,主场和客场差异很明显。

很多球队主场强、客场弱。

如果只用总体均值,会掩盖差异。

例如某队总体场均进球是:

总体场均进球 = 1.50

但拆开看:

主场场均进球 = 2.10
客场场均进球 = 0.90

如果这队本场是主场,使用 1.50 会低估它的主场进攻。

如果本场是客场,使用 1.50 会高估它的客场进攻。

所以,主客场特征必须单独构造。

常见方式:

主队近期主场场均进球
主队近期主场场均失球
客队近期客场场均进球
客队近期客场场均失球
主队主场胜率
客队客场不败率
主队主场平局率
客队客场平局率

主客场特征尤其适合用于:

胜平负模型;
总进球模型;
泊松预期进球估计;
平局风险识别;
强弱关系判断。

很多模型表现不好,是因为只用了总体数据,没有区分比赛场景。


九、赛程特征:体能不是一句“累了”,要变成数字

赛程会影响球队表现。

但模型不能理解“赛程密集”。

你要把它变成数字。

常见赛程特征包括:

休息天数;
双方休息天数差;
过去 7 天比赛场数;
过去 14 天比赛场数;
是否连续客场;
是否刚踢完杯赛或洲际比赛;
是否有长途旅行;
是否短时间内多线作战。

最基础的是休息天数。

比如:

主队休息天数 = 当前比赛日期 - 主队上一场比赛日期
客队休息天数 = 当前比赛日期 - 客队上一场比赛日期
休息天数差 = 主队休息天数 - 客队休息天数

如果主队休息 7 天,客队休息 3 天:

休息天数差 = 7 - 3 = 4

说明主队体能准备时间更充分。

但休息天数不是越多越好。

休息太久也可能意味着比赛节奏下降。

所以它不是简单线性关系。

这类非线性关系,LightGBM 比逻辑回归更容易学习。

逻辑回归可能只能学到“休息天数差越大越有利”的简单趋势。

LightGBM 可以学习更复杂的分段关系。


十、联赛环境特征:不同联赛不是同一种足球

不同联赛的基础环境不同。

有些联赛进球多。
有些联赛平局多。
有些联赛主场优势明显。
有些联赛强弱差距大。
有些联赛节奏慢。
有些联赛总进球分布更集中在 2-3 球。

如果你把所有联赛混在一起训练,模型可能学到混合规律。

所以,需要给模型联赛环境信息。

常见联赛特征包括:

联赛平均进球;
联赛主胜率;
联赛平局率;
联赛客胜率;
联赛主队场均进球;
联赛客队场均进球;
联赛 0-0 比例;
联赛 2-3 球比例;
联赛 4 球以上比例。

这些特征同样必须按时间滚动。

不能用赛季结束后的联赛均值预测赛季中比赛。

正确做法是:

截至当前比赛日前,该联赛已完成比赛的平均进球

而不是:

整个赛季结束后的平均进球

联赛环境特征对总进球模型尤其重要。

因为同样两支球队的进攻防守数据,如果放在不同联赛背景下,含义会不同。


十一、相对特征比绝对特征更重要

很多时候,模型更关心双方差异,而不是单方数值。

比如:

主队 Elo = 1800
客队 Elo = 1650

这两个特征有用。

但差值更直接:

EloDiff = 1800 - 1650 = 150

再比如:

主队最近5场场均进球 = 1.8
客队最近5场场均进球 = 1.1

可以构造:

RecentAttackDiff = 1.8 - 1.1 = 0.7

再比如:

主队休息 6 天
客队休息 3 天

可以构造:

RestDaysDiff = 6 - 3 = 3

相对特征能帮助模型直接理解双方差距。

常见相对特征包括:

强弱差值;
进攻差值;
防守差值;
净胜球差值;
状态积分差值;
休息天数差值;
排名差值;
主客场表现差值。

但也不要只保留差值。

有时候绝对值也重要。

例如双方都很强和双方都很弱,差值可能接近,但比赛结构不同。

所以通常建议:

单方特征 + 差值特征一起保留。


十二、特征窗口要有层次,不能只看最近5场

近期窗口是特征工程的核心之一。

但只看最近 5 场不够。

最近 5 场反应快,但噪音大。

一支球队可能因为赛程轻松,最近 5 场表现很好。

也可能因为连续强敌,最近 5 场表现差。

如果只看 5 场,很容易被短期样本误导。

更合理的做法是多窗口组合。

比如:

最近5场:反映短期状态
最近10场:反映中期趋势
赛季至今:反映长期水平
主场最近5场:反映主场状态
客场最近5场:反映客场状态

多窗口的好处是:

模型可以同时看到短期和长期。

如果一队最近 5 场进球暴涨,但最近 10 场和赛季均值并不高,模型可能判断这是短期波动。

如果最近 5 场、10 场、赛季均值都上升,说明状态提升可能更稳定。

这比单窗口更可靠。


十三、时间衰减:昨天的比赛通常比三个月前更重要

足球状态会变化。

教练会换。
球员会伤停。
阵容会轮换。
球队打法会调整。
赛季阶段会变化。

所以,越近的比赛通常权重越高。

这就是时间衰减思想。

最简单的时间衰减方式是加权平均。

假设最近 5 场进球分别是:

最近第1场:2球
最近第2场:1球
最近第3场:3球
最近第4场:0球
最近第5场:1球

普通平均是:

(2 + 1 + 3 + 0 + 1) / 5 = 1.4

如果更重视最近比赛,可以给权重:

最近第1场权重:5
最近第2场权重:4
最近第3场权重:3
最近第4场权重:2
最近第5场权重:1

加权平均公式是:

加权平均 = (2×5 + 1×4 + 3×3 + 0×2 + 1×1) / (5+4+3+2+1)

计算:

= (10 + 4 + 9 + 0 + 1) / 15
= 24 / 15
= 1.6

加权后近期进攻均值是 1.6,比普通平均 1.4 更重视最近表现。

这只是一个简单例子。

实际系统里可以用更平滑的时间衰减方式。

但原理一样:

越近的比赛,对当前状态影响更大。


十四、特征不能只描述球队,也要描述比赛对位

足球比赛是双方对抗。

只看主队自己不够。

只看客队自己也不够。

真正重要的是对位关系。

例如:

主队进攻强,客队防守弱,主队优势更容易兑现。
主队进攻强,客队防守也强,比赛可能更拉锯。
主队边路强,客队边后卫弱,这个对位很关键。
主队高位压迫强,客队后场出球差,这可能形成压制。

模型里可以通过交互特征体现对位。

例如:

主队进攻强度 - 客队防守强度
客队进攻强度 - 主队防守强度
主队主场进攻均值 - 客队客场失球均值
客队客场进攻均值 - 主队主场失球均值

这些特征比单独进攻、防守更接近比赛。

足球不是静态实力比较。

足球是强点和弱点的碰撞。

特征工程要尽量表达这种碰撞关系。


十五、泊松模型里的特征和机器学习模型里的特征不完全一样

如果你用泊松建总进球或比分模型,核心是估计两个值:

λ_home = 主队预期进球
λ_away = 客队预期进球

这些值通常由进攻强度、防守强度、联赛均值、主客场修正构成。

比如一种简化思路:

主队预期进球 = 联赛主队平均进球 × 主队进攻强度 × 客队防守弱度
客队预期进球 = 联赛客队平均进球 × 客队进攻强度 × 主队防守弱度

这里每个概念都要定义清楚。

主队进攻强度可以理解为:

主队近期主场场均进球 / 联赛主队平均进球

客队防守弱度可以理解为:

客队近期客场场均失球 / 联赛客队平均失球

如果主队进攻强度大于 1,表示主队进攻高于联赛平均。

如果客队防守弱度大于 1,表示客队防守弱于联赛平均。

这类特征更偏足球统计建模。

而 LightGBM 使用的特征可以更宽泛。

比如 Elo、休息天数、状态积分、排名差值等都可以直接加入。

两者不冲突。

泊松模型偏结构化解释,LightGBM 偏非线性学习。

后续多模型融合时,可以让它们互相补充。


十六、逻辑回归需要更干净、更线性的特征

逻辑回归是很好的基线模型。

但它对特征要求更高。

因为逻辑回归主要学习线性关系。

如果你给它一个特征:

EloDiff

它会学习 EloDiff 增大时,主胜概率如何变化。

但如果关系不是线性的,逻辑回归表达能力有限。

比如休息天数。

休息 3 天和休息 6 天差异明显。

但休息 12 天和休息 15 天,不一定继续线性提升。

这种非线性逻辑回归不容易直接学好。

可以通过分箱处理:

休息天数 <= 3
休息天数 4-6
休息天数 7-10
休息天数 > 10

这样逻辑回归能更好理解不同区间。

所以,如果你使用逻辑回归,要特别注意:

特征尺度;
特征方向;
异常值;
分箱;
标准化;
共线性。

逻辑回归的价值是可解释。

它适合帮助你检查特征方向是否符合足球常识。


十七、LightGBM 可以吃更多特征,但更容易学到噪音

LightGBM 适合表格数据,也擅长学习非线性和特征交互。

比如它可能学到:

EloDiff 很大 + 主队休息充足 + 客队客场防守差时,主胜概率明显上升。

也可能学到:

主队近期进球很多,但联赛均值低、对手防守好时,总进球未必很高。

这种交互关系,LightGBM 比逻辑回归更擅长。

但问题是:

LightGBM 也更容易学到噪音。

如果特征里混入未来数据,它会利用得非常好。
如果某些小样本特征刚好在历史上表现好,它也可能过度学习。
如果特征太多而样本不够,它可能在训练集上很好,未来不稳定。

所以,LightGBM 的特征工程必须更谨慎。

不要因为它能处理复杂关系,就把所有字段都扔进去。

强模型更需要干净数据。


十八、特征要可复盘,不能只追求模型分数

有些特征可能让历史回测提升。

但你解释不清楚它为什么有效。

这种特征要谨慎。

足球模型不是纯竞赛环境。

如果你要长期运营一个产品,特征必须具备一定可解释性和可复盘性。

比如:

EloDiff 有解释性。
近期进球均值有解释性。
休息天数差有解释性。
主客场失球均值有解释性。
联赛平均进球有解释性。

但一些奇怪组合特征,如果只是历史上有效,却没有足球逻辑支撑,就要小心。

因为它可能只是过拟合。

真正好的特征应该满足:

赛前可用;
足球含义明确;
计算稳定;
跨时间不过度失效;
可以在赛后复盘中解释。

模型不是只为了历史分数好看。

它要能长期运行。


十九、特征工程的最低可行方案

如果从零开始,可以先做一个最小可行特征集。

不需要公开具体字段命名,只要按维度构造即可。

第一类:长期强弱。

例如 Elo 或赛前强弱评分。

第二类:近期状态。

例如最近 5 场、10 场的进球、失球、积分、净胜球。

第三类:主客场表现。

例如主队近期主场攻防,客队近期客场攻防。

第四类:赛程压力。

例如休息天数、近期比赛密度、连续客场。

第五类:联赛环境。

例如联赛赛前平均进球、主场进球水平、平局率。

第六类:双方差值。

例如强弱差、攻防差、休息天数差、排名差。

用这六类特征,就可以训练出一个基础模型。

先把这套跑通,再考虑更复杂的信息。


二十、特征工程最常见的错误

第一,使用赛后数据。

比如当前比赛的射门、控球、角球进入赛前特征。

第二,使用未来汇总数据。

比如赛季最终排名、最终场均进球。

第三,只看最近 5 场。

窗口太短,容易被短期波动影响。

第四,不分主客场。

把主场强和客场弱混在一起。

第五,过度相信历史交锋。

样本小,变化大,容易学到噪音。

第六,一开始堆太多字段。

模型复杂但不稳定。

第七,特征没有足球解释。

历史表现好,不代表未来有效。

第八,不做缺失值区分。

真实 0 和未知不能混为一谈。

这些错误比算法参数更致命。


二十一、本章实操检查清单

构造足球特征时,至少检查这些问题:

1. 每个特征是否赛前可得?
2. 每个特征是否有明确足球含义?
3. 近期状态是否只使用比赛日前数据?
4. 是否同时使用短期窗口和中长期窗口?
5. 是否区分主场和客场?
6. 是否有长期强弱特征,例如 Elo 或类似评分?
7. 是否有进攻、防守、赛程、联赛环境几个基础维度?
8. 是否构造了双方差值或对位特征?
9. 缺失值是否有合理处理方式?
10. 是否避免一开始堆太多复杂字段?
11. 特征是否能在赛后复盘中解释?
12. 复杂特征是否有过拟合风险?

如果这些问题回答不清楚,特征工程还没有准备好。


本章小结

足球特征工程的核心,不是堆字段。

而是把你对足球比赛的理解,变成模型可以学习的赛前信号。

一套基础特征至少要覆盖:

长期强弱;
近期状态;
进攻能力;
防守能力;
主客场差异;
赛程压力;
联赛环境;
双方差值和对位关系。

这些特征必须满足:

赛前可用;
含义明确;
计算稳定;
可以复盘。

泊松模型需要围绕预期进球构造攻防强度。

逻辑回归需要更干净、更可解释的特征。

LightGBM 可以学习复杂交互,但更需要防止过拟合和数据泄漏。

下一章我们继续讲:

足球模型的标签怎么设计?胜平负、总进球、比分和半全场不是同一个问题。

本文仅供足球数据研究和模型训练学习参考,不构成任何投注建议。