一、前言
本文所讲的实战内容是用机器学习的方法来分析科比职业生涯数据的实例,利用随机森林算法训练处一个预测科比投篮模型。主要用了python的numpy,pandas,matplotlib和sklearn库。
本文出现的所有代码,均可在我的github上下载,欢迎Follow、Star:github地址
二、设计思路
先来看看这份科比生涯的数据集:数据集下载
这个表格记录了科比30000多个镜头的详细数据,共有25个标签。
具体的设计思路是将这25个标签代表的数据进行分析,找出对科比投篮结果有影响的标签,利用机器学习中随机森林的算法训练出可以预测科比是否能够投篮命中的模型。
先来看看这25个标签具体代表什么(自己不是篮球的专业人士和爱好者,所以具体的内容可能有所出入,不过不会影响到分析结果)
- action_type(用什么方式投的篮)
- combined_shot_type(结合什么方式投篮)
- game_event_id(游戏事件ID)
- game_id(游戏ID)
- la(投篮的经度)
- loc_x (投篮的x坐标)
- loc_y(投篮的y坐标)
- lon(投篮的纬度)
- minutes_remaining(离比赛结束还有多少分钟)
- period(第几场)
- playoffs(是不是季后赛)
- season(赛季)
- seconds_remaining(离比赛结束还有多少秒)
- shot_distance(投篮离篮筐的的距离)
- shot_made_flag (是不是进球了(主要的标签))
- shot_type(2分球还是3分球区域)
- shot_zone_area(投篮区域的表示方法一)
- shot_zone_basic(投篮区域的表示方法二)
- shot_zone_range(投篮区域的表示方法三)
- team_id(队伍ID)
- team_name(队伍名字)
- game_date(比赛时间)
- matchup(比赛双方队伍)
- opponent(自己所在队伍名字)
- shot_id(镜头ID)
可以看到,这25个标签中对于科比能否投篮命中有一些无关紧要的数据,比如team_id,因为这30000多份样本中全是在湖人队打的,shot_id,game_id等等这个数据也无关紧要,具体的分析将会在下面讲解。
三、数据分析
首先我们导入数据,编写代码如下
import pandas as pd
# 导入数据
filename= "data.csv"
raw = pd.read_csv(filename)
print(raw.shape)
print(raw.head()) #head函数打印前5行,如果需要打印前10行,这样写
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行结果如下
接下来我们再来分析这一份数据表,我们发现其中shot_made_flag这个标签竟然有缺失值,这个表示了科比是否进球了,作为最重要的数据,是不能随意进行填充的,我们必须删除掉这些样本进行下一步的工作,代码如下
import pandas as pd
# 导入数据
filename= "data.csv"
raw = pd.read_csv(filename)
kobe = raw[pd.notnull(raw['shot_made_flag'])]
print(kobe.shape)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
运行结果如下
此时我们只有25697个数据进行训练了。
接着我们分析lat,loc_x,loc_y,lon这4个标签,这4个标签说明了科比投篮的位置,而具体指的是什么呢,有什么关系吗,我们画散点图来看一下。
编写代码如下
import pandas as pd
import matplotlib.pyplot as plt
# 导入数据
filename= "data.csv"
raw = pd.read_csv(filename)
#删除shot_made_flag为空的数据项,并且命名为kobe用作训练
kobe = raw[pd.notnull(raw['shot_made_flag'])]
#画散点图用来分析lat loc_x loc_y lon这4个标签
alpha = 0.02 #指定一个数字,用于后面的透明度
plt.figure(figsize=(6,6)) #指定画图域
# loc_x and loc_y
plt.subplot(121) #一行两列 第一个位置
plt.scatter(kobe.loc_x, kobe.loc_y, color='R', alpha=alpha) #画散点图
plt.title('loc_x and loc_y')
# lat and lon
plt.subplot(122) #一行两列 第二个位置
plt.scatter(kobe.lon, kobe.lat, color='B', alpha=alpha)
plt.title('lat and lon')
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
运行结果如图所示
我们大致可以看出,这4个坐标大致表示了距离篮筐的距离,那样的话,我们接下来用于数据处理的时候选择其中的一组数据即可了。
shot_type,shot_zone_area,shot_zone_basic,shot_zone_range 这4个标签代表了投篮的区域,其实还是说明一件事,这里就不做赘述了,当然shot_zone_area,shot_zone_basic,shot_