You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现足球比赛进球数及胜负结果预测任务求助

足球赛事预测任务解决方案

前置依赖导入

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder

任务1:泊松计数回归预测两队进球数

原有代码错误说明

  • 变量名不匹配:定义模型为modelArs,调用fit方法时用了不存在的modelManc,直接触发未定义变量报错
  • 特征选择错误:将比赛结果变量score2作为自变量输入,属于数据泄露,完全不符合预测逻辑
  • 核心特征缺失:没有纳入主客场标识、队伍自身进攻能力、对手防守能力等对进球数影响最大的特征

实现代码

# 1. 数据预处理:将单场比赛拆为主、客队两条记录,构造成进球预测长表
home = df[['date', 'team1', 'team2', 'score1']].rename(columns={'team1':'team', 'team2':'opponent', 'score1':'goals'})
home['is_home'] = 1
away = df[['date', 'team1', 'team2', 'score2']].rename(columns={'team2':'team', 'team1':'opponent', 'score2':'goals'})
away['is_home'] = 0
goal_data = pd.concat([home, away], axis=0, ignore_index=True)

# 2. 划分训练集:排除要预测的赛季末场次,此处以2017年5月为分割线可按需调整
train_goal = goal_data[goal_data['date'] < '2017-05-01']

# 3. 拟合泊松回归模型
poisson_model = smf.poisson("goals ~ is_home + C(team) + C(opponent)", data=train_goal)
poisson_result = poisson_model.fit()

# 4. 预测阿森纳(主队)对阵曼联(客队)的进球数
ars_input = pd.DataFrame({'team':['Arsenal'], 'opponent':['Manchester Utd'], 'is_home':[1]})
ars_goals_pred = poisson_result.predict(ars_input).values[0]
manc_input = pd.DataFrame({'team':['Manchester Utd'], 'opponent':['Arsenal'], 'is_home':[0]})
manc_goals_pred = poisson_result.predict(manc_input).values[0]

print(f"阿森纳预测进球数:{round(ars_goals_pred,2)},曼联预测进球数:{round(manc_goals_pred,2)}")

任务2:决策树预测获胜队伍

# 1. 特征工程
dt_data = df.copy()
# 队伍名称编码
le = LabelEncoder()
dt_data['team1_enc'] = le.fit_transform(dt_data['team1'])
dt_data['team2_enc'] = le.transform(dt_data['team2'])
# 计算各队伍赛季场均进球
team_avg_goals = {}
for team in le.classes_:
    home_goals = dt_data[dt_data['team1']==team]['score1'].mean()
    away_goals = dt_data[dt_data['team2']==team]['score2'].mean()
    team_avg_goals[team] = (home_goals + away_goals)/2
dt_data['team1_avg'] = dt_data['team1'].map(team_avg_goals)
dt_data['team2_avg'] = dt_data['team2'].map(team_avg_goals)
# 结果标签编码
dt_data['result_enc'] = dt_data['result'].map({'team1_win':0, 'team2_win':1, 'draw':2})

# 2. 训练决策树模型
X = dt_data[['team1_enc', 'team2_enc', 'team1_avg', 'team2_avg']]
y = dt_data['result_enc']
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X, y)

# 3. 预测阿森纳(主队)对阵曼联的结果
pred_input = pd.DataFrame({
    'team1_enc': [le.transform(['Arsenal'])[0]],
    'team2_enc': [le.transform(['Manchester Utd'])[0]],
    'team1_avg': [team_avg_goals['Arsenal']],
    'team2_avg': [team_avg_goals['Manchester Utd']]
})
dt_pred = dt_model.predict(pred_input)[0]
result_map = {0:'阿森纳胜', 1:'曼联胜', 2:'平局'}
print(f"决策树预测结果:{result_map[dt_pred]}")

任务3:mnlogit回归计算比赛结果概率

# 1. 拟合多分类logit模型,复用任务2的特征和数据集
mnlogit_model = smf.mnlogit("result_enc ~ team1_enc + team2_enc + team1_avg + team2_avg", data=dt_data)
mnlogit_result = mnlogit_model.fit()

# 2. 预测三类结果的概率
prob_pred = mnlogit_result.predict(pred_input)
print(f"阿森纳获胜概率:{round(prob_pred.iloc[0,0]*100,2)}%")
print(f"曼联获胜概率:{round(prob_pred.iloc[0,1]*100,2)}%")
print(f"平局概率:{round(prob_pred.iloc[0,2]*100,2)}%")

优化建议

  • 可新增两队历史对阵记录、最近N场比赛滚动进球/失球均值、队伍排名等特征,大幅提升模型准确率
  • 泊松回归可替换为双变量泊松模型,解决实际比赛中两队进球事件不独立的问题
  • 决策树可调整max_depth、min_samples_split等参数,避免过拟合

内容的提问来源于stack exchange,提问作者larosploc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:00