前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习 线性回归分析和预测棒球比赛数据

机器学习 线性回归分析和预测棒球比赛数据

作者头像
叶庭云
修改2021-01-23 13:15:17
1.1K0
修改2021-01-23 13:15:17
举报
文章被收录于专栏:Python进阶之路Python进阶之路

文章目录

  • 一、查看数据
  • 二、线性回归分析与预测
  • 对 baseball_02.csv 里面的数据进行分析,并利用 sklearn 的线性回归模型预测球队的表现
  • 有关MLB的详细信息,请参阅以下中文维基百科页面: https://bk.tw.lvfukeji.com/wiki/MLB 你也可以看电影《金钱球》,了解奥克兰田径队是如何利用分析来重塑棒球队的管理的
  • 分析和代码测试是在 jupyter notebook 环境中进行的

一、查看数据

# 导入需要用到的包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import linear_model
%matplotlib inline
# 读取数据  查看前5行数据
baseball = pd.read_csv('baseball_02.csv')
baseball.head(5)

分析时需要用到的字段含义

  • RS:run scored 得分
  • RA:run allowes 失分
  • W:win 获胜次数
  • OBP上垒率/打者不出局率:安打数+保送数+触身球数/打数+保送数+触身球数
  • SLG长打率/衡量打者长打能力:一垒打数+二垒打数_2+三垒打数_3+全垒打数*4/该打者的打数
  • BA打击率:安打数/打数
  • Playoffs 季后赛:0:未进入季后赛 1:进入季后赛
  • OOBP:对手的基本百分比
  • OSLG:对手的重击百分比

二、线性回归分析与预测

第一个预测问题是 一支球队要在常规赛中赢多少场才能进入季后赛? 现在,你可以将常规赛简化成一道数学题。利用1995年至2001年的数据绘制散点图。

# 分组  进入季后赛 与 未进入季后赛分组 统计各自最小的胜投次数
baseball.groupby('Playoffs').min()['W']

从历史数据来看,要进入季后赛,至少需要赢 82 场

# 条件筛选 从1995年至2001年且进入季后赛的队伍  统计这些队伍的获胜次数  散点图可视化
baseball2 = baseball[baseball["Year"]>=1995].copy()
baseball2 = baseball2[baseball2["Year"]<=2001].copy()
baseball2 = baseball2[baseball2["Playoffs"]==1].copy()
plt.figure(figsize=(12, 8), dpi=120)
mpl.rcParams['font.family'] = 'SimHei'
plt.style.use('ggplot')
plt.scatter(range(baseball2.shape[0]),baseball2["W"],color='red')
plt.xlabel('各个队伍')
plt.ylabel('胜投数')
plt.savefig('test_01.png')
baseball2.shape     # (48, 15)

从散点图容易看出,有一个最小值82,但大部分散点在 85 以上,所以一支球队要在常规赛中获胜 85 场以上,进入季后赛的概率很大。

思考一个团队如何才能取得 X 场胜利 当一个队的得分比对手多时,它就会获胜。但是,球队要赢了多少次? 使用一个线性回归模型,回答一个问题:如何能使一个球队获胜,在常规赛中,它的得分需要比失分多多少分? 首先,您只使用2002年以前的数据

baseball2 = baseball[baseball["Year"]<=2002].copy()
baseball2.head()

为了使问题更简单,您可以创建一个变量来保存球队得分和球队失分的差。 然后,您可以将该变量用作线性回归模型中的单个自变量,因变量是获胜次数。

baseball2["newVar"] = baseball2["RS"] - baseball2["RA"]
reg1 = linear_model.LinearRegression()
# 球队得分和球队失分的差
x = baseball2["newVar"].values.reshape(-1,1)
# 获胜次数
y = baseball2["W"].values.reshape(-1,1)
reg1.fit(x,y)
yPred = reg1.predict(x)
# 预测至少胜 85 场进季后赛  在常规赛中,球队的得分需要比失分多89.858009分
predict_sample = reg1.predict([[85]])
print(predict_sample[0][0])

plt.figure(figsize=(12, 8), dpi=120)
plt.rcParams['axes.unicode_minus']=False  # 用于解决不能显示负号的问题
plt.clf()
# fig,ax = plt.subplots(1,1)
plt.scatter(x,y,label="true",color='blue')
plt.scatter(x,yPred,label="pred",color='red')
plt.xlabel('得分与失分之差')
plt.ylabel('获胜次数')
plt.savefig('test_02.png')   # 保存图片
plt.legend()   # 显示图例

根据拟合的线性回归模型,如果一支球队想要赢得 85 场胜利,它球队的得分比失分需要多大约 90 分。

现在,从上面的线性回归模型中,你知道一个团队应该比它允许的 X 胜是多少次。 从本质上讲,一支球队的得分应该超过它允许的获胜次数。接下来,我们要预测球队的得分和允许的失分。 关于得分,假设两个棒球统计数据比其他任何东西都重要: (1)上垒百分比(OBP):玩家在垒上的时间百分比(包括步行) (2)重击百分比(SLG):玩家在回合中绕垒的距离(测量力量) (3)对于你的回归模型,你还包括另一个变量,(BA):击球得分

# 运行一个带有上述三个变量的线性回归模型来预测得分
x = baseball2[["OBP","SLG","BA"]].values.reshape(-1,3)
y = baseball2[["RS"]].values.reshape(-1,1)
reg2 = linear_model.LinearRegression()
reg2.fit(x,y)
yPred = reg2.predict(x)
baseball2["3var_pred"] = yPred
baseball2[["OBP","SLG","BA","RS","3var_pred"]].head()
# 运行另一个只有两个变量的线性回归模型,OBP和SLG
x = baseball2[["OBP","SLG"]].values.reshape(-1,2)
y = baseball2[["RS"]].values.reshape(-1,1)
reg3 = linear_model.LinearRegression()
reg3.fit(x,y)
yPred = reg3.predict(x)
baseball2["OBP SLG pred"] = yPred
baseball2[["OBP","SLG","RS","OBP SLG pred"]].head()

如果一支棒球队的OBP为0.311,SLG为0.405,我们期望该队得分多少分?

x = np.array([0.311,0.405]).reshape(-1,2)
var2_Pred = reg3.predict(x)
print(var2_Pred[0][0])

我们可以使用线性回归模型来预测允许的失分。 使用以下两个变量,OOBP(对手的基本百分比)和OSLG(对手的重击百分比)。

print(baseball.columns)
baseball3 = baseball.dropna(subset=['OOBP'], axis=0, inplace=False)
baseball3 = baseball.dropna(subset=['OSLG'], axis=0, inplace=False)
#baseball2.head()
x = baseball3[["OOBP","OSLG"]].values.reshape(-1,2)
y = baseball3[["RA"]].values.reshape(-1,1)
reg4 = linear_model.LinearRegression()
reg4.fit(x,y)
yPred = reg4.predict(x)
baseball3["OOBP OSLG pred"] = yPred
baseball3[["OOBP","OSLG","RA","OOBP OSLG pred"]].head()

如果一支棒球队的对手OBP(OOBP)为0.297,对手SLG(OSLG)为0.370,预期球队允许失分多少?

x = np.array([0.297,0.370]).reshape(-1,2)
yPred = reg4.predict(x)
print(yPred[0][0])

现在让我们假设我们使用线性回归模型来预测2002年奥克兰A队将赢得多少场比赛 在我们的数据中,‘Team’ 变量中的 OAK 代表oaklanda。 运行的模型使用团队统计数据。我们将使用 2001 年的团队统计数据来预测 2002 年的情况。 2001年奥克兰A队的 OBP 和 SLG 是多少?根据我们的得分模型,这个队预计能得分多少?

# 提取2001年oaklanda的数据
baseball2 = baseball[baseball["Team"]=="OAK"].copy()
baseball2 = baseball2[baseball2["Year"]==2001].copy()[["OBP","SLG"]]
print(baseball2.head())  # OBP和SLG
x = baseball2.values.reshape(-1,2)
yPred = reg4.predict(x)
print()
print(yPred[0][0])   # 预测得分
RS = yPred[0][0]

2001年奥克兰A队的OOBP和OSLG是多少?根据我们的允许失分模型,该球队预计失分多少

baseball2 = baseball[baseball["Team"]=="OAK"].copy()
baseball2 = baseball2[baseball2["Year"]==2001].copy()[["OOBP","OSLG"]]
print(baseball2.head())
x = baseball2.values.reshape(-1,2)
yPred = reg3.predict(x)
print()
print(yPred[0][0])    # 预测失分
RA = yPred[0][0]

现在我们已经预测了2002年奥克兰A的得分和失分。根据预测和我们的获胜模型,预计球队会赢多少场?

x = np.array(RS - RA).reshape(-1,1)
wPred = reg1.predict(x)[0][0]
print(wPred)
# 大约会赢101场

根据预测的获胜次数,你预测球队是否会在2002年进入季后赛?

这支球队会在2002年进入季后赛,根据线性回归模型预测出的获胜的场数约为101场,大于85。

从我们的数据中,你可以了解2002年奥克兰A队的实际表现。 你认为你的预测在得分、允许跑数和获胜数方面是否接近实际表现?

oak2002 = baseball[baseball["Team"]=="OAK"].copy()
oak2002 = oak2002[oak2002["Year"]==2002].copy()
print(f'Playoffs:{oak2002["Playoffs"].values}')    
print("事实  RS:%.2f  RA:%.2f  W:%.2f"%(oak2002["RS"],oak2002["RA"],oak2002["W"]))
print("预测  RS:%.2f  RA:%.2f  W:%.2f"%(RS,RA,wPred))

这支球队2020年的确进入季后赛了,预测的得分、失分、获胜场数与真实数据相比差异不大,因为每年团队层面的差异并不大

所以用2001年的数据来预测2002年的数据也不会有太大的差异,误差较小。

作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、查看数据
  • 二、线性回归分析与预测
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档