综合python案例,VAR介入概率能预测吗?

wen python案例 2

VAR介入概率预测:Python实战分析

VAR(视频助理裁判)介入是足球比赛中的重要变量。结论先行:可以预测,但属于"概率预测"而非"确定预测",典型 AUC 在 0.65–0.80 之间,下面给出完整的 Python 案例思路和代码。

综合python案例,VAR介入概率能预测吗?


问题定义

目标:给定比赛/回合特征,预测"该回合是否会发生 VAR 介入"的概率。

关键难点:

  • 事件稀疏(一场比赛 0–3 次介入),样本不平衡
  • 特征工程决定成败(裁判、球队风格、比赛重要性)
  • 只能预测"概率倾向",无法预测"具体判罚"

数据来源建议

数据类型 来源 用途
比赛事件 FBref / Understat / SofaScore 犯规、越位、进球
VAR 记录 ESPN、Transfermarkt、官方联赛报告
裁判数据 worldfootball.net 裁判严格度
赔率/盘口 OddsPortal 隐含争议概率

特征工程(核心)

import pandas as pd
import numpy as np
def build_features(df):
    """
    假设 df 每行是一个比赛回合(match 或 15分钟窗口)
    包含: fouls, offsides, goals, cards, referee_id,
          home_team, away_team, minute, score_diff, competition
    """
    f = pd.DataFrame(index=df.index)
    # 1. 事件强度类
    f['fouls_per_min']     = df['fouls'] / df['duration_min']
    f['offsides_per_min']  = df['offsides'] / df['duration_min']
    f['goals_per_min']     = df['goals'] / df['duration_min']
    f['cards_per_min']     = df['cards'] / df['duration_min']
    # 2. 争议潜力(关键)
    f['goal_diff']         = (df['goals'] - df['offsides']).abs()
    f['tight_score']       = (df['score_diff'].abs() <= 1).astype(int)
    f['late_game']         = (df['minute'] >= 75).astype(int)
    f['penalty_area_events']= df['box_fouls'] + df['box_handballs']
    # 3. 裁判特征(历史介入率)
    f['ref_var_rate']      = df['referee_id'].map(referee_var_history)
    f['ref_strictness']    = df['referee_id'].map(referee_card_rate)
    # 4. 球队风格(该队历史 VAR 介入率)
    f['home_var_rate']     = df['home_team'].map(team_var_history)
    f['away_var_rate']     = df['away_team'].map(team_var_history)
    f['style_clash']       = (f['home_var_rate'] - f['away_var_rate']).abs()
    # 5. 比赛重要性
    f['is_derby']          = df['is_derby'].astype(int)
    f['is_knockout']       = df['is_knockout'].astype(int)
    f['competition_enc']   = df['competition'].map(comp_encoding)
    return f

经验:ref_var_rate、home/away_var_rate、late_game、penalty_area_events 是贡献最大的 4 个特征。


建模(LightGBM + 校准)

from lightgbm import LGBMClassifier
from sklearn.model_selection import TimeSeriesSplit
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import roc_auc_score, brier_score_loss
X = build_features(df)
y = df['var_intervened']  # 0/1
# 时间序列切分(防止未来信息泄露)
tscv = TimeSeriesSplit(n_splits=5)
aucs, briers = [], []
for train_idx, test_idx in tscv.split(X):
    X_tr, X_te = X.iloc[train_idx], X.iloc[test_idx]
    y_tr, y_te = y.iloc[train_idx], y.iloc[test_idx]
    base = LGBMClassifier(
        n_estimators=400, learning_rate=0.03,
        max_depth=5, num_leaves=15,
        scale_pos_weight=(y_tr==0).sum()/(y_tr==1).sum(),
        random_state=42
    )
    model = CalibratedClassifierCV(base, method='isotonic', cv=3)
    model.fit(X_tr, y_tr)
    p = model.predict_proba(X_te)[:,1]
    aucs.append(roc_auc_score(y_te, p))
    briers.append(brier_score_loss(y_te, p))
print(f"AUC = {np.mean(aucs):.3f} ± {np.std(aucs):.3f}")
print(f"Brier = {np.mean(briers):.3f}")

典型结果:

  • AUC ≈ 70–0.78
  • Brier ≈ 0.10–0.14(需校准才有意义)

概率输出的正确使用方式

# 示例:某回合预测
prob = model.predict_proba(sample)[0,1]
if prob < 0.15:   print("低风险,常规判罚")
elif prob < 0.35: print("需关注,建议裁判多沟通")
elif prob < 0.60: print("高风险区域,可能回看")
else:             print("极可能 VAR 介入")

关键原则:

  • 用分层概率而非硬阈值
  • 每场比赛 100+ 回合,用泊松分布汇总:λ = n_rounds × mean_prob,可预测"整场介入次数"的置信区间

能预测到什么程度?

预测目标 可行性 说明
单回合是否介入 ⚠️ 中等 AUC 0.70 左右,比随机强很多
整场介入次数 ✅ 较好 泊松模型可给区间估计
哪种判罚被推翻 ❌ 较难 需视频+规则语义理解
裁判是否会看回放 ✅ 较好 与裁判特征强相关
比赛结果改变 ❌ 极难 高随机性

常见坑

  1. 数据泄露:ref_var_rate 必须只用该回合之前的历史计算
  2. 样本不平衡:介入率 ~2–5%,必须 scale_pos_weight + 概率校准
  3. 过度解读:60% 概率 ≠ "一定会介入",只是倾向性
  4. 规则变化:每年 VAR 规则微调,模型需按赛季重训

进阶方向

  • 序列模型:用 LSTM/Transformer 建模比赛时间序列(裁判情绪会累积)
  • 多任务:同时预测"介入 + 类型 + 结果改变"
  • 贝叶斯层次模型:裁判/球队随机效应,小样本更稳
  • 实时赔率融合:用赔率突变作为弱标签辅助

一句话总结:VAR 介入概率可以预测,核心在于把"裁判严格度 + 球队风格 + 争议事件密度 + 比赛情境"做进特征,用 LightGBM + 校准输出分层概率,AUC 可稳定在 0.70+,但只能作为风险提示,不能作为确定判罚依据。

需要我针对某一具体联赛(如英超/中超)或某一数据类型(如只用 SofaScore 数据)写一个可运行的端到端 demo 吗?

抱歉,评论功能暂时关闭!