通过得分,篮板,助攻,出场时间四个数据来预测属于哪位球员。 选取了'LeBron James','Chris Paul','James Harden','Kevin Love','Dwight Howard'五位球员单场数据。
本文使用数据全部来自于科赛网 ,字段解释如下:
字段 | 内容 |
---|---|
player | 球员 |
pts | 得分 |
reb | 篮板 |
ast | 助攻 |
time | 出场时间 |
season | 赛季 |
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors import KNeighborsClassifier as KNN
由于seaborn包作图对中文并不是很友好,我们将原有的字段名都设置为英文。选取我们所需要的五位球员数据命名为data。
#设置主题
sns.set(style="ticks")
#导入数据
data = pd.read_csv('/Users/***/Downloads/NBA.zip/player_season.csv',encoding = 'utf-8')
#避免seaborn包中文显示为方框问题,改为英文
data.columns = ['player', 'season', 'team', 'result', 'score', 'starter', 'time', 'made_percent', 'made', 'shoot',
'3_made_percent', '3_made', '3_shoot', 'ft_percent', 'fta', 'ft', 'reb', u'reb_a', 'reb_b',
'ast', 'stl', 'blk', 'tov', 'foul', 'pts']
data = data.loc[data['player'].isin(['LeBron James','Chris Paul','James Harden','Kevin Love','Dwight Howard'])]
data.head()
image.png
其实这一步本身是不需要的,但我们还是想先在训练之前看下不同球员的数据特点。 首先我们通过散点图看5位球员的得分情况
plt.figure(figsize = (15,8)) #设置绘图尺寸
sns.stripplot(x='season', y='pts',data = data ,hue = 'player',jitter=True,size = 5)
image.png
接下来我们通过密度图看下5位球员在篮板助攻上的表现:
f, axes = plt.subplots(3, 2, figsize=(8, 12))
player_list = ['LeBron James','Chris Paul','James Harden','Kevin Love','Dwight Howard']
for ax,name,s in zip(axes.flat,player_list,np.linspace(0, 3, 5)):
cmap = sns.cubehelix_palette(start=s, light=1, as_cmap=True)
x = data[data['player']==name].reb
y = data[data['player']==name].ast
sns.kdeplot(x, y, cmap=cmap, shade=True, cut=5, ax=ax)
ax.set(xlim=(0, 20), ylim=(0, 20))
f.tight_layout()
image.png
各项数据看完心里算是有了一个大概,每个球员都有自己的技术特点:
最后我们16-17赛季的数据作为测试集,其他赛季的数据作为训练集,看看预测准确率能够达到多少~
#取16-17赛季数据作为测试集
data_train = data[data['season']!=u'16-17']
data_test = data[data['season']==u'16-17']
#得分,篮板,助攻,出场时间为特征,球员为标签
train_x = np.array(data_train[['pts','reb','ast','time']]).tolist()
train_y = np.array(data_train[['player']]).tolist()
test_x = np.array(data_test[['pts','reb','ast','time']]).tolist()
test_y = np.array(data_test[['player']]).tolist()
#训练模型
neigh = KNN(n_neighbors=10)
neigh.fit(train_x, train_y)
#使用模型预测,最后与实际结果对计算准确率
m = 0.0
n = 0.0
for x,y in zip(test_x,test_y):
if neigh.predict([x])[0] == y[0]:
n = n+1
m = m+1
print '预测准确率为:%.2f%%' % (n/m*100)
预测准确率为:49.143%
最后准确率50%不到,马马虎虎~