7.8 权重怎么定:等权 / 经验法 / 回归 / AI 辅助调参
核心方法这是整个第七篇最重要的一篇。有了特征之后,怎么给它们分配权重,决定你的指标是可用还是废品。
一、四个层次的权重确定方法
| 层次 | 方法 | 难度 | 效果 |
|---|---|---|---|
| 第 1 层 | 等权平均 | 极低 | 勉强可用 |
| 第 2 层 | 经验法(领域知识) | 低 | 可用 |
| 第 3 层 | 回归法(数据驱动) | 中 | 推荐 |
| 第 4 层 | 正则化 + 交叉验证 | 中高 | 最佳实践 |
二、第 1 层:等权平均
def equal_weight(features):
"""等权平均:所有特征权重相同
优点:简单,不会过拟合
缺点:忽略了特征的重要性差异
"""
if not features:
return 0.0
return sum(features) / len(features)
什么时候可以用:特征数量少(3 个以内)、且你确实无法判断哪个更重要时。它是一个安全的基线。
三、第 2 层:经验法
用领域知识给出权重。核心是回答「哪个因素对结果影响更大」。
# 教学参考权重(不是球小策的生产权重)
EXPERT_WEIGHTS = {
'attack_strength': 0.30,
'defense_strength': 0.30,
'squad_integrity': 0.25,
'recent_form': 0.15,
}
def expert_weighted(features: dict, weights=None):
"""按经验权重加权求和(要求 features 已归一到 0~1)"""
w = weights or EXPERT_WEIGHTS
total_w = sum(w.values())
if total_w <= 0:
return 0.0
score = sum(features.get(k, 0) * v for k, v in w.items())
return score / total_w
经验法的两个陷阱
- 权重总和不必等于 1,但必须做归一化(否则不同指标之间不可比);
- 经验权重是你的主观判断,不一定正确——它只是起点,必须用数据验证。
四、第 3 层:回归法(推荐)
让数据告诉你权重,而不是靠猜。
方法 A:逻辑回归(预测胜平负)
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import numpy as np
def fit_logistic(X, y, feature_names):
"""用逻辑回归拟合权重
X: 特征矩阵 (n_samples, n_features)
y: 标签 (0/1),例如「主队是否获胜」
"""
# 必须标准化!否则量纲大的特征会被错误地赋予高权重
scaler = StandardScaler()
Xs = scaler.fit_transform(X)
model = LogisticRegression(max_iter=2000, C=0.1) # C 越小正则化越强
model.fit(Xs, y)
# 系数即权重(已标准化,可直接比较)
weights = dict(zip(feature_names, model.coef_[0].round(4)))
# 按绝对值排序,看哪些特征更重要
ranked = sorted(weights.items(), key=lambda kv: abs(kv), reverse=True)
return model, scaler, ranked
# 使用示例
# model, scaler, ranked = fit_logistic(X, y, ['attack', 'defense', 'integrity', 'form'])
# for name, w in ranked:
# print(f'{name:20s} {w:+.4f}')
方法 B:线性回归(预测连续值,如净胜球、进球数)
from sklearn.linear_model import Ridge
def fit_ridge(X, y, feature_names, alpha=1.0):
"""岭回归:带 L2 正则的线性回归,适合特征有相关性的场景"""
scaler = StandardScaler()
Xs = scaler.fit_transform(X)
model = Ridge(alpha=alpha) # alpha 越大正则化越强
model.fit(Xs, y)
weights = dict(zip(feature_names, model.coef_.round(4)))
return model, scaler, weights
为什么必须用正则化
足球数据的特征是高度相关的。
「进攻强度」和「近期状态」往往同向变化;「防守强度」和「门将表现」也相关。
不加重正则化,回归系数会剧烈波动(多重共线性问题),训练集表现很好但样本外一塌糊涂。
正则化是防过拟合的第一道防线。
五、第 4 层:正则化 + 交叉验证(最佳实践)
from sklearn.linear_model import LogisticRegressionCV
from sklearn.model_selection import TimeSeriesSplit
def fit_with_cv(X, y, feature_names):
"""带时间序列交叉验证的逻辑回归
注意:必须用 TimeSeriesSplit,不能用随机 KFold!
足球数据有时间顺序,随机切分会造成数据穿越。
"""
scaler = StandardScaler()
Xs = scaler.fit_transform(X)
# 时间序列交叉验证
tscv = TimeSeriesSplit(n_splits=5)
model = LogisticRegressionCV(
Cs=[0.01, 0.03, 0.1, 0.3, 1.0], # 自动搜索最佳正则化强度
cv=tscv,
scoring='neg_log_loss', # 用对数损失评估
max_iter=3000,
)
model.fit(Xs, y)
weights = dict(zip(feature_names, model.coef_[0].round(4)))
print('最佳 C 值:', model.C_)
return model, scaler, weights
六、四种方法对比
| 方法 | 优点 | 缺点 | 建议 |
|---|---|---|---|
| 等权 | 简单,不过拟合 | 忽略重要性差异 | 作为基线对照 |
| 经验法 | 有领域依据,可解释 | 主观,可能偏差大 | 作为回归法的对照 |
| 逻辑/线性回归 | 数据驱动,可解释 | 需注意共线性 | 推荐起点 |
| 正则化+交叉验证 | 效果最好,防过拟合 | 需要更多样本 | 样本足够时使用 |
七、一条最重要的经验
先用简单方法建立基线,再看复杂方法是否真的更好。
很多人在足球数据上直接上复杂模型,结果不如等权平均——因为样本量本身就不足以支撑复杂模型。
永远先跑一个「等权基线」,把它作为你的对照标准。
如果复杂模型的样本外表现没有显著优于等权基线,那就用简单的。
八、关于「谁的权重更好」
回到边界声明(7.1)里的核心观点:
没有「绝对正确」的权重,只有「适合你的用途」的权重。
· 做内容创作用的权重,要让你讲得清楚、有说服力;
· 做长期统计研究用的权重,要追求样本外预测力;
· 做单场深度分析用的权重,要能突出本场的特殊变量。
这些用法的权重天然不同。所以你需要自己定。
下一步该看什么
- 如何验证你的权重确实有效 → 7.9 验证指标有效性
- 如何避免常见陷阱 → 7.10 特征工程避坑
足球赛事前瞻 | AI 智能分析 | 足球数据解读 - 球小策