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
相关产品推荐
相关产品推荐

