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

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

一、查看数据


# 导入需要用到的包importnumpyasnpimportpandasaspdimportseabornassnsimportmatplotlib.pyplotaspltimportmatplotlibasmplfromsklearnimportlinear_model%matplotlibinline


# 读取数据  查看前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 场


# -*- coding: UTF-8 -*-"""@Author  :叶庭云@公众号  :风采更胜往昔@CSDN    :https://yetingyun.blog.csdn.net/"""# 条件筛选 从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()


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


# -*- coding: UTF-8 -*-"""@Author  :叶庭云@公众号  :风采更胜往昔@CSDN    :https://yetingyun.blog.csdn.net/"""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"] =yPredbaseball2[["OBP","SLG","BA","RS","3var_pred"]].head()


# 运行另一个只有两个变量的线性回归模型,OBP和SLGx=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"] =yPredbaseball2[["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"] =yPredbaseball3[["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和SLGx=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队的实际表现。
你认为你的预测在得分、允许跑数和获胜数方面是否接近实际表现?


# -*- coding: UTF-8 -*-"""@Author  :叶庭云@公众号  :风采更胜往昔@CSDN    :https://yetingyun.blog.csdn.net/"""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))


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

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

目录
相关文章
|
12天前
|
机器学习/深度学习 数据采集 数据处理
谷歌提出视觉记忆方法,让大模型训练数据更灵活
谷歌研究人员提出了一种名为“视觉记忆”的方法,结合了深度神经网络的表示能力和数据库的灵活性。该方法将图像分类任务分为图像相似性和搜索两部分,支持灵活添加和删除数据、可解释的决策机制以及大规模数据处理能力。实验结果显示,该方法在多个数据集上取得了优异的性能,如在ImageNet上实现88.5%的top-1准确率。尽管有依赖预训练模型等限制,但视觉记忆为深度学习提供了新的思路。
21 2
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
54 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
1月前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
45 3
|
1月前
|
机器学习/深度学习 算法 Python
“探秘机器学习的幕后英雄:梯度下降——如何在数据的海洋中寻找那枚失落的钥匙?”
【10月更文挑战第11天】梯度下降是机器学习和深度学习中的核心优化算法,用于最小化损失函数,找到最优参数。通过计算损失函数的梯度,算法沿着负梯度方向更新参数,逐步逼近最小值。常见的变种包括批量梯度下降、随机梯度下降和小批量梯度下降,各有优缺点。示例代码展示了如何用Python和NumPy实现简单的线性回归模型训练。掌握梯度下降有助于深入理解模型优化机制。
30 2
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
机器学习中空间和时间自相关的分析:从理论基础到实践应用
空间和时间自相关是数据分析中的重要概念,揭示了现象在空间和时间维度上的相互依赖关系。本文探讨了这些概念的理论基础,并通过野火风险预测的实际案例,展示了如何利用随机森林模型捕捉时空依赖性,提高预测准确性。
50 0
机器学习中空间和时间自相关的分析:从理论基础到实践应用
|
21天前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的线性回归
【10月更文挑战第25天】本文将深入浅出地介绍线性回归模型,一个在机器学习领域中广泛使用的预测工具。我们将从理论出发,逐步引入代码示例,展示如何利用Python和scikit-learn库实现一个简单的线性回归模型。文章不仅适合初学者理解线性回归的基础概念,同时也为有一定基础的读者提供实践指导。
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
探索机器学习:从线性回归到深度学习
在这篇文章中,我们将一起踏上一场激动人心的旅程,穿越机器学习的广阔天地。我们将从最基本的线性回归开始,逐步深入到复杂的深度学习模型。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起探索这个充满无限可能的世界吧!
|
1月前
|
机器学习/深度学习 数据可视化 算法
机器学习中的回归分析:理论与实践
机器学习中的回归分析:理论与实践
|
1月前
|
机器学习/深度学习 数据采集 算法
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
38 2
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。