源码链接:
https://download.csdn.net/download/qq_58012062/87541713?spm=1001.2014.3001.5501
数据提取:链接:https://pan.baidu.com/s/1kcttx000FfaLBk1QAJbBAw
提取码:jbbk
1 实验背景
NBA 作为世界上水平最高的篮球联赛,吸引了无数的球迷。每一场 NBA 比 赛都会产生大量的数据信息,如果能够有效地运用这些数据,便可以充分发挥 出其潜在价值。
在每年赛季开始之前,大量的媒体专家都会对本赛季 NBA 常规赛的情况进 行预测,这其中球队战绩和明星球员的个人数据是大家着重讨论的话题。及时 而准确的完成对这些数据的预测一方面有利于各球队管理层在赛季进行前采 用合适的决策,另一方面可以最大化商业公司的利益。本实验采用机器学习的 方法在赛季开始前完成对本赛季 NBA 球队战绩以及个人数据的预测等。
2.1 NBA数据爬取(实验工具:PyCharm)(做一个简介,在这里不重点讲爬取)
(1)导入库和所需要爬取的网站
(2)发送请求,获取数据
(3)解析html
(4)解析opponent数据
(5)获取表格body数据
(6)存储成csv文件
(7)运行爬虫
3.NBA球星生涯数据集分析(EDA和随机森林)
3.1.1 项目介绍
(1).项目目标
通过分析科比和巴特勒职业生涯比赛的相关数据,掌握Numpy, Pandas, Matplotlib, Seaborn等常用数据分析库的用法,掌握常规的数据预处理的方法以及特征工程。掌握建立随机森林模型,模型参数调整,构建最好的模型,预测测试数据,并保存测试数据的方法。
(2).科比生涯简介
不论你是否看NBA,都应该听说过科比布莱恩特这个名字,它是最接近篮球之神乔丹的运动员。科比于1996年以13顺位的选秀身份进入联盟,一生都效力于洛杉矶湖人队。于2016年宣布退役,职业生涯获奖无数,5次NBA总冠军,2次FMVP,1次MVP,4次AMVP,18次全明星,生涯总得分超33000分,未来的名人堂球员等。在今年的1月26日,科比乘坐的私人飞机不幸失事,科比和二女儿吉安娜永远地离开了我们,这对无数球迷是一个莫大的打击。虽然科比离开了我们,但曼巴精神将激励着一代又一代的年轻人去追逐自己的梦想。
(3).巴特勒生涯简介
吉米·巴特勒(Jimmy Butler),1989年9月14日出生于美国得克萨斯州休斯敦(Houston, Texas),美国职业篮球运动员,司职得分后卫/小前锋,效力于NBA迈阿密热火队。
吉米·巴特勒于2011年通过选秀进入NBA,先后效力于公牛、森林狼、76人以及热火队,2014-15赛季荣膺进步最快球员,2020-21赛季当选NBA抢断王,6次入选NBA全明星阵容,4次入选NBA最佳阵容第三阵容,5次入选NBA最佳防守阵容第二阵容。
吉米·巴特勒代表美国男篮参加了2016年里约奥运会,并随队获得奥运会男篮金牌。
(4).科比数据集简介(随机森林)
该数据集收录了自96赛季~2016赛季,科比整个职业生涯的比赛记录,共有30697条数据。每一条数据都是一次出手记录,其中包括动作类型,投篮类型,投射距离,投射位置,是否命中等25个特征。在该数据集中我们将以是否命中篮筐为标签值来进行分析,带有标签值的数据共25697条。我们将以这25697条数据作为训练数据进行建模,来对不带标签的5000条数据进行预测。
.巴特勒数据集简介(EDA)
该数据集收录了自2011赛季~至今,巴特勒整个职业生涯的比赛记录,共有20697条数据。每一条数据都是一次出手记录,其中包括动作类型,投篮类型,投射距离,投射位置,是否命中等25个特征。在该数据集中我们将以是否命中篮筐为标签值来进行分析,带有标签值的数据共15697条。我们将以这15697条数据作为训练数据进行建模,来对不带标签的5000条数据进行预测。
(6).数据集中各列特征说明
列名称 |
含义 |
action_type |
动作类型,如跳投,扣篮,上篮 |
combined_shot_type |
组合投篮类型,如跳投,扣篮,勾手,擦板,罚球 |
game_event_id |
比赛的编号 |
lat |
出手的纬度 |
loc_x |
出手的x坐标 |
loc_y |
出手的y坐标 |
lon |
出手的经度 |
minutes_remaining |
距离比赛结束,还剩多少分钟 |
period |
交手的场次,取值为1~7 |
playoffs |
是否是打季后赛 |
season |
赛季,如21~22赛季 |
seconds_remaining |
距离比赛结束,还剩多少秒 |
shot_distance |
出手距离 |
shot_made_flag |
是否命中 |
shot_type |
投射类型,两分球还是三分球 |
shot_zone_area |
出手区域,左侧,右侧,中场,后场等 |
shot_zone_basic |
另一种划分出手区域的方式,中线,禁区,油漆区,左侧底角,右侧底角等 |
shot_zone_range |
出手区域的距离,小于8英尺,8-16英尺,16-24英尺,24英尺以上等 |
team_id |
球队编号 |
team_name |
球队名称 |
game_date |
比赛日期 |
matchup |
对阵双方 |
opponent |
对手 |
game_id |
比赛的编号 |
shot_id |
出手的编号 |
3.1.2 项目知识点
探索性数据分析(EDA):
探索性数据分析 (EDA) 是一种数据分析方法,它采用多种技术(主要是图形):
1、最大限度地洞察数据集;
2、揭示底层结构;
3、提取重要变量;
4、检测异常值和异常;
5、测试基本假设;
6、开发简约模型;
7、确定最佳因子设置。
EDA 中使用的特定图形技术通常非常简单,由以下各种技术组成:
1、绘制原始数据(例如 数据轨迹、 直方图、 双直方图、 概率图、 滞后图、 块图和约登图)。
2、绘制简单的统计数据,例如原始数据的均值图、 标准差图、 箱线图和主效应图。
3、定位这些图以最大化我们的自然模式识别能力,例如每页使用多个图。
不同EDA问题应用不同工具:
1、对于单变量可以应用概率图、概率图相关系数图、单变量和多变量控制图、4-plot。
2、进行比较可使用块图、散点图、箱形图
3、进行筛选可以使用块图、概率图、双直方图
4、数据优化可以使用块图、最小二乘拟合、等高线图
5、回归问题可以使用最小二乘拟合、散点图、6-plot
6、对于时间序列可使用自相关图、光谱图、复解调幅度图、复解调相位图、ARIMA 模型
7、对于多变量分析可以使用星图、散点图矩阵、调节图、剖面图、主成分、聚类、Discrimination、分类等。
随机森林模型:
随机森林(Random Forest)是一种经典的Bagging模型,其弱学习器为决策树模型。如下图所示,随机森林模型会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值(针对回归模型)或者投票情况(针对分类模型)来获取最终结果。
随机森林的核心:
1)随机:训练样本的随机化(稳定性的基础是多样性)
2)森林:多颗决策树
随机森林的构造:
1)构造随机森林需要考虑的点:①只有一份训练数据;②确保多颗决策树要优于但棵决策树
2)随机森林的构造:
随机森林的预测:
分类问题:少数服从多数,比如说随机森林由三棵树构成,两棵树分类为同意,一棵树分类为不同意,那么最终结果为不同意
回归问题:取平均值
3.1.3 实验步骤
项目1:巴特勒生涯数据集分析(EDA)(实验工具:Jupyter)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
%matplotlib inline
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import KFold
Butler = pd.read_csv('Butler_data.csv')
Butler.head(4)
(3).数据集清洗和预处理
Butler.describe()
Butler.shape#处理前总共有30697个数据
Butler = Butler[pd.notnull(Butler['shot_made_flag'])]#通过以上数据集的列举对空值进行处理
Butler.describe()
Butler.shape#处理后则使用25697个有用数据
Butler.info()#该数据集共有0-24也就是25个特征
(4). 数据探索性分析
plt.rcParams['font.sans-serif']=['SimHei']#防止中文标签报错
plt.rcParams['axes.unicode_minus']=False#防止负号报错
#查看巴特勒出手类型的分布
plt.figure(figsize = (10,6))
Butler['combined_shot_type'].value_counts().plot(kind = 'bar')
plt.xlabel('出手类型');plt.ylabel('出手次数');plt.title('吉米.巴特勒职业生涯不同出手类型的次数统计')
#查看巴特勒两分球,三分球的出手数
plt.figure(figsize = (8,6))
Butler['shot_type'].value_counts().plot(kind = 'bar')
plt.xlabel('远投还是中距离');plt.ylabel('出手次数');plt.title('吉米.巴特勒职业生涯远投和中距离的出手数')
plt.xticks(rotation = 0)
#查看巴特勒出手距离的分布
plt.figure(figsize = (8,6))
Butler['shot_distance'].hist(bins = 100)
plt.xlabel('出手距离');plt.ylabel('出手次数');plt.title('吉米.巴特勒出手距离的分布')
#绘制箱型图
plt.figure(figsize = (6,4))
sns.boxplot(data = Butler,y = 'shot_distance')
plt.xlabel('出手距离');plt.ylabel('出手次数');plt.title('吉米.巴特勒出手距离的分布')
#可视化巴特勒的出手区域,按照不同的标准划分的出手区域
import matplotlib.cm as cm
plt.figure(figsize = (20,10))
def scatter_plot_by_category(feat):
alpha = 0.1
gs = Butler.groupby(feat)
cs = cm.rainbow(np.linspace(0,1,len(gs)))
for g,c in zip(gs,cs):
plt.scatter(g[1].loc_x,g[1].loc_y,color = c,alpha = alpha)
plt.subplot(1,3,1)
scatter_plot_by_category(Butler['shot_zone_area'])
plt.title('shot_zone_area')
plt.subplot(1,3,2)
scatter_plot_by_category(Butler['shot_zone_basic'])
plt.title('shot_zone_basic')
plt.subplot(1,3,3)
scatter_plot_by_category(Butler['shot_zone_range'])
plt.title('shot_zone_range')
Butler['shot_distance'].describe()#各距离投射占比
#巴特勒在各个位置投篮的次数
area = Butler['shot_zone_basic'].value_counts()
b = np.array([0,1,2,3,4,5,6])
plt.barh(b,area,align ='center')
plt.yticks(b,('中距离','进攻有理区','底线之外的三分','除进攻有理区外的禁区','右边底线三分','左边底线三分','后场'))
plt.xlabel('次数',fontsize=10)
plt.title('吉米.巴特勒在各区域投篮次数',fontsize=20)
plt.tight_layout()# 紧凑显示图片,居中显示
plt.show()
#查看巴特勒的出手命中率
plt.figure(figsize = (6,4))
Butler['shot_made_flag'].value_counts(normalize = True).plot(kind = 'bar')
plt.xlabel('命中情况');plt.ylabel('命中个数');plt.title('吉米.巴特勒的出手命中率')
#观察不同出手类型与命中率之间的关系
sns.barplot(data = Butler,x = 'combined_shot_type',y = 'shot_made_flag')
#观察两分球与三分球的命中率
sns.barplot(data = Butler,x = 'shot_type',y = 'shot_made_flag')
#观察出手距离与命中率之间的关系
sns.scatterplot(data = Butler, x = 'shot_distance',y = 'shot_made_flag' )
sns.violinplot(data = Butler, y = 'shot_distance',x = 'shot_made_flag' )
巴特勒善于有把握方式的得分也就是近距离得分
从巴特勒数据集分析和结合数据资料得出:
由上图可以看出吉米.巴特勒在NBA里是一个攻防兼备,得分稳定的锋卫摇摆人(可打后卫也可打前锋)。巴特勒今年的季后赛下半场场均17分,投篮命中率59%,越是关键的时刻巴特勒越来劲。截止到目前为止,巴特勒已经拿下了3场40+,并且巴特勒每轮比赛都有40+的表现。从某种程度上说,巴特勒本赛季季后赛的发挥甚至超过了伦纳德,而且在洛瑞受伤之后,巴特勒还成为了热火场上最关键的组织点,进攻防守组织一把抓,巴特勒已经进入到了全新的模式当中。
对于巴特勒来说,过去他曾向热火众将许下诺言,他要夺冠而且一刻也不要等了,上赛季被淘汰时所有人都说巴特勒异想天开,现在的他则是用自己的实际行动来履行自己的诺言。如果本赛季巴特勒能够率队夺冠,那这又将是一个天天平平的普通球员,靠着自己的努力成为历史级别球员的故事。
项目2:科比生涯数据集分析(随机森林)(实验工具:Jupyter)
2.数据集清洗
结论:由上述结果可以看出,该数据集共有25个特征,其中24个特征都是完整的,只有shot_made_flag这个特征是存在缺失值的。所以接下来我们会将数据集切分为两部分,含有shot_made_flag的数据集作为训练集,确实shot_made_flag的数据集作为测试集。通过对训练集进行建模,来预测测试集上的shot_made_flag值。
3.数据预处理
结论:由于该测试集没有标签,所以我们需要通过交叉验证的方式将训练集分为训练样本和验证样本,用验证集来评估模型的好坏。最终选取最好的模型,对测试样本进行预测。
4.建立随机森林模型
结论:预测的结果放在kobe_prediction.csv中
从科比数据集分析和结合数据资料得出:
单看从科比比赛数据预测出的time_free training(空余训练时间)就可以看出科比训练有多么刻苦,左图每个格子代表科比每年中每个月的训练时间(单位:小时),而一个月最多是31天的744小时,左图最大为709小时(大多数靠近),最小为1小时(个别)。从这个数据我想到了科比曾说过的一句话。
勇于担当,不言弃,不服输,在逆境中创造奇迹,这正是曼巴精神所在。