很多人刚开始训练足球模型时,会有一个误解:
只要数据足够多,算法自己就能学出来。
这个想法只对了一半。
LightGBM、逻辑回归、泊松模型这些算法,确实可以从数据里学习规律。但它们并不会天然理解足球。
模型不知道什么叫强队。
不知道什么叫低位防守。
不知道什么叫赛程密集。
不知道主场和客场为什么不一样。
不知道一支球队最近进球多,是实力提升,还是短期效率高。
不知道一支升班马在低级别联赛的数据,能不能直接套到高级别联赛。
模型真正能看到的,只是你给它的字段。
你给它“主队近期场均进球”,它才能感知主队近期进攻状态。
你给它“客队近期场均失球”,它才能感知客队近期防守质量。
你给它“双方 Elo 差值”,它才能感知双方长期强弱差距。
你给它“休息天数差”,它才可能学习赛程压力。
你给它“联赛平均进球”,它才知道不同联赛的进球环境不同。
所以,特征工程不是一个技术细节。
它本质上是:
把你对足球比赛的理解,翻译成模型能读懂的变量。
模型学的不是足球本身。
模型学的是你构造出来的足球信息。
这一章就讲清楚:足球预测模型的特征工程到底应该怎么做。
一、特征工程不是字段越多越好
很多人做模型时,容易进入一个误区:
字段越多越好。
于是不断往模型里加:
近期进球;
近期失球;
排名;
积分;
历史交锋;
主客场;
射门;
角球;
控球率;
天气;
伤停;
联赛均值;
赔率;
半场数据;
各种衍生指标。
最后字段越来越多,模型看起来越来越复杂。
但效果不一定更好。
因为特征不是越多越好,而是要满足三个条件:
赛前可得。
足球含义清楚。
长期稳定有效。
如果一个特征赛前拿不到,它不能用。
如果一个特征含义不清楚,模型可能学到噪音。
如果一个特征只在某段时间有效,未来很容易失效。
举个例子。
“某队本赛季最终排名”看起来很有用,但它是未来数据,不能用于赛季中比赛预测。
“最近一场比分”可以用,但单场波动太大,不能单独代表球队真实状态。
“历史交锋胜率”看起来有故事,但很多时候样本太少,容易误导。
所以,特征工程第一原则是:
少而准,比多而乱更重要。
初版模型宁愿只做十几个干净特征,也不要一开始堆上百个不稳定字段。
二、足球特征要围绕六个核心问题构造
一场足球比赛,模型真正需要理解的东西,并没有那么神秘。
大多数特征都可以围绕六个问题展开:
- 谁整体更强?
- 谁近期状态更好?
- 谁进攻更强?
- 谁防守更稳?
- 主客场是否有明显差异?
- 赛程和联赛环境是否会改变比赛节奏?
这六个问题对应六类核心特征:
长期强弱特征;
近期状态特征;
进攻特征;
防守特征;
主客场特征;
赛程和联赛环境特征。
如果你把这六类特征做扎实,已经可以训练出一个比较像样的基础模型。
不要一开始就追求“什么都加”。
足球模型的第一版目标,是建立一个干净、稳定、可解释的基线。
后面再逐步扩展。
三、长期强弱特征:模型需要知道谁更强
足球比赛当然要看强弱。
但模型不能直接理解“强队”这个词。
你必须用数值告诉它。
常见长期强弱特征包括:
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 可以学习复杂交互,但更需要防止过拟合和数据泄漏。
下一章我们继续讲:
足球模型的标签怎么设计?胜平负、总进球、比分和半全场不是同一个问题。
本文仅供足球数据研究和模型训练学习参考,不构成任何投注建议。
