本文目录导读:

- 案例一:基于历史数据的统计概率(最简单)
- 案例二:基于泊松分布(更科学的统计模型)
- 案例三:机器学习(XGBoost / 逻辑回归)—— 进阶
- 实际应用中的坑(非常重要)
- 如果只是做一个简单的“有/无”判断,代码如何写?
这是一个非常经典的数据挖掘或机器学习入门案例,通常用于足球彩票预测或比赛分析。
没有任何一种Python模型能够100%准确预测上半场是否有进球,因为足球比赛充满了随机性(运气、裁判误判、球员状态等)。
但在数据科学的语境下,我们可以通过历史数据和特征工程,构建一个模型来预测上半场进球的概率。
以下是一个完整的Python实现框架,分为三个递进的案例:纯统计概率、基于规则的判断、机器学习预测。
基于历史数据的统计概率(最简单)
如果你只有两队的历史比赛数据,可以通过计算两队最近比赛的上半场进球率来估算。
import pandas as pd
import numpy as np
# 假设你有一个DataFrame,包含历史比赛数据
# 每行代表一场比赛,列名为:'主队', '客队', '主队上半场进球', '客队上半场进球'
data = {
'主队': ['曼城', '曼城', '利物浦', '利物浦'],
'客队': ['阿森纳', '切尔西', '曼联', '曼城'],
'主队上半场进球': [1, 0, 2, 1],
'客队上半场进球': [0, 1, 0, 1]
}
df = pd.DataFrame(data)
def predict_first_half_goal_probability(home_team, away_team, historical_df):
"""
计算两队上半场至少进1球的概率(基于历史数据)
"""
# 筛选主队近5场主场比赛
home_games = historical_df[historical_df['主队'] == home_team].tail(5)
# 筛选客队近5场客场比赛
away_games = historical_df[historical_df['客队'] == away_team].tail(5)
# 合并所有相关比赛
all_games = pd.concat([home_games, away_games])
if len(all_games) == 0:
return 0.5 # 无数据时返回随机概率
# 计算上半场总进球数 > 0 的比例
total_first_half_goals = all_games['主队上半场进球'] + all_games['客队上半场进球']
probability = (total_first_half_goals > 0).mean()
return probability
# 示例
prob = predict_first_half_goal_probability('曼城', '阿森纳', df)
print(f"预测上半场有进球的概率:{prob:.2%}")
# 输出可能是:预测上半场有进球的概率:75.00%
基于泊松分布(更科学的统计模型)
足球进球数通常服从泊松分布,我们可以计算两队攻防能力,然后预测上半场进球期望值。
from scipy.stats import poisson
import numpy as np
# 假设我们有两队最近5场比赛的进球数据
man_city_home_goals_first_half = [1, 0, 2, 1, 0] # 曼城主场上半场进球
chelsea_away_goals_first_half = [1, 0, 1, 0, 1] # 切尔西客场上半场进球
man_city_home_conceded_first_half = [0, 1, 0, 0, 1] # 曼城主场上半场失球
chelsea_away_conceded_first_half = [1, 1, 0, 1, 0] # 切尔西客场上半场失球
# 计算平均期望
home_attack = np.mean(man_city_home_goals_first_half)
away_defense = np.mean(chelsea_away_conceded_first_half)
away_attack = np.mean(chelsea_away_goals_first_half)
home_defense = np.mean(man_city_home_conceded_first_half)
# 上半场期望进球
expected_home_goals = (home_attack + away_defense) / 2
expected_away_goals = (away_attack + home_defense) / 2
# 计算上半场至少进1球的概率:1 - 两队都不进球的概率
prob_no_goal = poisson.pmf(0, expected_home_goals) * poisson.pmf(0, expected_away_goals)
prob_at_least_one = 1 - prob_no_goal
print(f"预测上半场有进球的概率:{prob_at_least_one:.2%}")
# 输出例如:预测上半场有进球的概率:68.47%
机器学习(XGBoost / 逻辑回归)—— 进阶
如果你想用更高级的方法,需要大量特征(如射门次数、控球率、近期战绩、球员伤停等)。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 假设你已经有一个包含特征和标签的数据集
# 特征:主队射门、客队射门、主队控球率、客队控球率、主队排名、客队排名等
# 标签:is_first_half_goal (1表示上半场有进球,0表示无)
# 示例数据集
data = {
'home_shots': [5, 3, 8, 2],
'away_shots': [3, 6, 2, 4],
'home_possession': [60, 55, 70, 40],
'away_possession': [40, 45, 30, 60],
'first_half_goal': [1, 0, 1, 0] # 标签
}
df = pd.DataFrame(data)
# 划分特征和标签
X = df[['home_shots', 'away_shots', 'home_possession', 'away_possession']]
y = df['first_half_goal']
# 训练简单逻辑回归模型
model = LogisticRegression()
model.fit(X, y)
# 预测新比赛
new_match = [[6, 4, 55, 45]] # 某个新比赛的特征
prediction = model.predict(new_match)
probability = model.predict_proba(new_match)[0][1] # 属于1类的概率
print(f"预测上半场是否有进球:{'是' if prediction[0] == 1 else '否'}")
print(f"置信度:{probability:.2%}")
# 输出:预测上半场是否有进球:是
# 注意:这个概率仅供参考,实际需要大量数据训练
实际应用中的坑(非常重要)
- 小样本偏差:只靠几场比赛无法准确预测,职业模型通常使用过去3-5个赛季的数据。
- 主场优势:上半场有进球的概率大约在 50%-55%(英超数据),但主队进球的概率更高。
- 模型局限性:足球进球是低概率事件(一场比赛通常2-3球),上半场有进球的概率通常介于40%-60%之间,模型很难大幅提高准确率。
如果只是做一个简单的“有/无”判断,代码如何写?
如果你只是想根据阈值输出结果(比如概率>50%就输出“有”),可以这样写:
def judge_first_half_goal(probability, threshold=0.5):
return "上半场有进球" if probability > threshold else "上半场无进球"
prob = 0.55 # 假设模型输出
result = judge_first_half_goal(prob, threshold=0.5)
print(result) # 输出: 上半场有进球
- 用泊松分布(案例二)是足球预测领域最经典的方法。
- 用机器学习(案例三)需要大量特征的提取和足够的训练数据。
- 没有万能公式,但以上代码可以作为你构建自身预测系统的起点。
如果你手头有具体的比赛数据(如CSV文件),可以告诉我,我可以帮你写一个完整的训练-预测脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播