机器学习系列(11)_决策树挖掘NBA冠军球队数据

简介: 机器学习系列(11)_决策树挖掘NBA冠军球队数据

一、数据整理



#导入库
import numpy as np
from scipy.cluster.vq import *
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import pandas as pd
import numpy as np
from scipy.cluster.vq import *
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from scipy.spatial.distance import cdist
from matplotlib.ticker import MultipleLocator
from matplotlib import style
%matplotlib inline
import numpy as np
import pandas as pd
from scipy import stats, integrate
import seaborn as sns
import matplotlib.pyplot as plt
# seaborn中文乱码解决方案
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=20)
sns.set(font=myfont.get_name(), color_codes=True)

导入NBA数据,我放在我的gitee里面,需要的朋友点击文章最上面的链接自取。

nbadata=pd.read_excel("nbamergeall.xlsx")

NBA数据的属性如下:共27个特征,718条数据。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 718 entries, 0 to 717
Data columns (total 27 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   assistsPg    718 non-null    float64
 1   blocksPg     718 non-null    float64
 2   defRebsPg    718 non-null    float64
 3   fgaPg        718 non-null    float64
 4   fgmPg        718 non-null    float64
 5   fgpct        718 non-null    float64
 6   foulsPg      718 non-null    float64
 7   ftaPg        718 non-null    float64
 8   ftmPg        718 non-null    float64
 9   ftpct        718 non-null    float64
 10  games        718 non-null    int64      # 一共打了多少场比赛
 11  name         718 non-null    object 
 12  offRebsPg    718 non-null    float64
 13  pointsPg     718 non-null    float64
 14  rebsPg       718 non-null    float64
 15  stealsPg     718 non-null    float64
 16  tpaPg        718 non-null    float64  # 每场里面三分球的得分情况
 17  tpmPg        718 non-null    float64
 18  tppct        718 non-null    float64
 19  turnoversPg  718 non-null    float64
 20  yearDisplay  718 non-null    object 
 21  nbayear      718 non-null    int64  
 22  y2k          718 non-null    bool   
 23  ischampion   24 non-null     float64    # 标签,最终是否得冠军,可以看到有24个不是空值
 24  region       718 non-null    object 
 25  league       718 non-null    object 
 26  ew           718 non-null    int64  
dtypes: bool(1), float64(19), int64(3), object(4)
memory usage: 146.7+ KB

这27个特征中有一些特征不重要,因此我们只选取一些较为重要的参数。根据这些参数进行分析,然后预测一些球队得冠军的概率有多高。

nbanames定义我们需要的特征:

nbanames=['assistsPg','blocksPg','defRebsPg','fgaPg','fgmPg','fgpct','foulsPg','ftaPg','ftmPg','ftpct','offRebsPg','rebsPg','stealsPg','tpaPg','tpmPg','tppct','turnoversPg','ischampion']
nbadata['ischampion'].isnull().sum()

bbb4d5217b9e4acd9774ff1cb86636c9.png

nbadata.loc[nbadata['tpaPg']==0]


有六条数据中三分球的得分为0,这可能会对最终的数据造成影响

0bda95d08d7b41c08da5c5cc7e65b3d9.png

nbadata2=nbadata.copy() # 不直接对原数据进行操作,拷贝一份数据
nbadata2=nbadata2[nbanames]
nbadata2.columns

eeda6c2001ab4da9b840356bd70feace.png


二、缺失值处理



由于'ischampion'含有694个空值,因此我们需要将空值变成0

b57463e56f294856aeb29a76204b8ef9.png

nbadata2.loc[nbadata2['ischampion'].isnull(),'ischampion']='no' 
# 将空值替换为字符‘no’
nbadata2.loc[nbadata2['ischampion']==1,'ischampion']='yes'
# 将原本数据为1的地方改成字符‘yes’
nbadata2

6c4a02e97e48404b815ee4a1b51d41b9.png


在对数据有了大概的处理之后,就要对数据进行无量纲化处理了。

这里不过多演示,即不对此数据进行量纲化处理。

nbadata2.describe()

d17af311a3774f5080b116f9dca0ce6e.png


三、创建训练集和测试集



创建训练集和测试集(70%和30%)

# 创建训练集和测试集(70%和30%)
from sklearn.model_selection import train_test_split 
x=nbadata2.iloc[:,:-1] # 这里取的没有包括第18列
x 
y=nbadata2.iloc[:,-1] # 取出是否是冠军这列
y
Xtrain,Xtest,Ytrain,Ytest=train_test_split(x,y,test_size=0.3)


from sklearn.tree import DecisionTreeClassifier #导入决策树
nba_tree=DecisionTreeClassifier(criterion='entropy') # 评判标准使用信息熵
nba_tree.fit(Xtrain,Ytrain) # 拟合
answer=nba_tree.predict(x) # 进行预测
answer_array=np.array([y,answer])
answer_mat=np.matrix(answer_array).T
result=pd.DataFrame(answer_mat)
result.columns=['实际类别','预测类别']
result 

001be157d98a4235b1920ec38f8bc96c.png

增加一列,来对比实际类别和预测类别是否相同:

result['YN']=(result['实际类别']==result['预测类别']) # 得到的结果是布尔值

cbfb5dbf33374b9687619e87de48d682.png

result.loc[result['YN']==False]

2c5fb491e1d0492ca270e130afd6a5c3.png

建模

# 建模
from sklearn import tree 
from sklearn.tree import DecisionTreeClassifier
clf = tree.DecisionTreeClassifier(criterion="entropy")  #默认是基尼系数,实例化
clf = clf.fit(Xtrain, Ytrain)  #训练模型
score = clf.score(Xtest, Ytest) #返回预测的准确度accuracy
score 

得到的准确率:

fadc718f57154ca89ea6085d6adba78e.png


四、绘制决策树



# 画树 NBA
nbafeatures=['assistsPg','blocksPg','defRebsPg','fgaPg','fgmPg','fgpct','foulsPg','ftaPg','ftmPg','ftpct','offRebsPg','rebsPg','stealsPg','tpaPg','tpmPg','tppct','turnoversPg']
import graphviz 
dot_data=tree.export_graphviz(clf
                             ,out_file="NBATree.dot"
                             ,feature_names=nbafeatures
                             ,class_names=["yes","no"]
                             ,filled=True
                             ,rounded=True)
graph=graphviz.Source(dot_data)
graph

2ec5e383f1e9409e9f827ef0aae87d5c.png


这里出现None是因为之前在是否投中三分球那列有几条是0值的数据没有处理。

并且如果有一些数据类型不同的话也没法组合在一起。

解决方法:去除 ,out_file="NBATree.dot"这行代码

# 画树 NBA
nbafeatures=['assistsPg','blocksPg','defRebsPg','fgaPg','fgmPg','fgpct','foulsPg','ftaPg','ftmPg','ftpct','offRebsPg','rebsPg','stealsPg','tpaPg','tpmPg','tppct','turnoversPg']
import graphviz 
dot_data=tree.export_graphviz(clf
#                              ,out_file="NBATree.dot"
                             ,feature_names=nbafeatures
                             ,class_names=["yes","no"]
                             ,filled=True
                             ,rounded=True)
graph=graphviz.Source(dot_data)
graph

image.png

338b2f75628143f8aefb7231773b43a8.png



五、探索决策树



clf.feature_importances_
[*zip(nbafeatures,clf.feature_importances_)]

bba5c6b6401f4638872205aaa6dea5a6.png

六、调参

调参即对之前的决策树进行减枝等操作:

clf=tree.DecisionTreeClassifier(criterion="entropy"
                               ,random_state=30
                               ,splitter="random"
                               ,max_depth=5 # 树只留5层
                               )
clf=clf.fit(Xtrain,Ytrain)
dot_data=tree.export_graphviz(clf
                             ,feature_names=nbafeatures
                             ,class_names=["yes","no"]
                             ,filled=True
                             ,rounded=True)
graph=graphviz.Source(dot_data)
graph

5020dd257a2e40f5af966a5da920bf1f.png


score=clf.score(Xtest,Ytest)
score 

可以看到调参之后的正确率有所提高:

e671cf852f2f48c9be979ee049502226.png


利用学习曲线观察深度是多少的时候能得到最好的

import matplotlib.pyplot as plt
test=[]
for i in range(10):
    clf=tree.DecisionTreeClassifier(max_depth=i+1 # 1-10层
                                    ,criterion="entropy"
                                    ,random_state=30
                                    ,splitter="random"
                                   )
    clf=clf.fit(Xtrain,Ytrain)
    score=clf.score(Xtest,Ytest) # 分别计算测试集上面的表现 
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show() 

可以看出在深度为3或者5的时候,正确率最高

82fa683a24374996b2cde2586ca3dc06.png8f2e1946214247f286cd10c9c442c595.png

用这个调参过的模型做预测:

answer=clf.predict(Xtest)
answer_array=np.array([Ytest,answer])
answer_mat=np.matrix(answer_array).T
result2=pd.DataFrame(answer_mat)
result2.columns=['实际类别','预测类别']
result2

aebec4fa428a4e6883b217271e1b89f6.png

result2['YN']=(result2['实际类别']==result2['预测类别'])
result2.loc[result2['YN']==False]
96e5bd543a654635816c8eb45b4cb8b7.png

七、决策树回归



import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(Xtrain['tpmPg'],Xtrain['ftmPg'],s=20,edgecolor='black',c='darkorange',label='data')

网络异常,图片无法展示
|
32c43615b3b84e09a9d768f33d8fe7bf.png 03b67f80ef7a4f8395a8cb7dc1ff4e3d.png


from sklearn.model_selection import train_test_split 
x=nbadata2.iloc[:,:-1] # 这里取的没有包括第18列
x 
y=nbadata2.iloc[:,-1] # 取出是否是冠军这列
y
Xtrain,Xtest,Ytrain,Ytest=train_test_split(x,y,test_size=0.3)
regr_1=DecisionTreeClassifier(max_depth=2)
regr_2=DecisionTreeClassifier(max_depth=5)
regr_1.fit(x[["tpmPg"]],y)
regr_2.fit(x[["tpmPg"]],y)
y_1=regr_1.predict(Xtest[["tpmPg"]])
y_2=regr_2.predict(Xtest[["tpmPg"]])
plt.figure()
plt.scatter(x[["tpmPg"]],y,s=20,edgecolor="black",c="darkorange",label="data")
plt.plot(Xtest[["tpmPg"]],y_1,color="cornflowerblue",label="max_depth=2",linewidth=2)
plt.plot(Xtest[["tpmPg"]],y_2,color="yellowgreen",label="max_depth=5",linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show() 

d20972775e8d4ff0aecb59c2cc40984c.png


相关文章
|
4天前
|
机器学习/深度学习 数据采集 算法
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
|
5天前
|
数据采集
【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
【5月更文挑战第5天】【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
【5月更文挑战第4天】【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
|
10天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
10天前
|
机器学习/深度学习 算法 数据可视化
【Python机器学习专栏】决策树算法的实现与解释
【4月更文挑战第30天】本文探讨了决策树算法,一种流行的监督学习方法,用于分类和回归。文章阐述了决策树的基本原理,其中内部节点代表特征判断,分支表示判断结果,叶节点代表类别。信息增益等标准用于衡量特征重要性。通过Python的scikit-learn库展示了构建鸢尾花数据集分类器的示例,包括训练、预测、评估和可视化决策树。最后,讨论了模型解释和特征重要性评估在优化中的作用。
|
10天前
|
机器学习/深度学习 Python
【Python机器学习专栏】时间序列数据的特征工程
【4月更文挑战第30天】本文探讨了时间序列数据的特征工程,强调其在捕捉季节性、揭示趋势、处理异常值和提升模型性能中的重要性。介绍了滞后特征、移动窗口统计特征、时间戳特征、频域特征和波动率特征等方法,并提供了Python实现示例。通过有效特征工程,可提高时间序列分析的准确性和预测可靠性。
|
10天前
|
机器学习/深度学习 计算机视觉 Python
【Python 机器学习专栏】图像数据的特征提取与预处理
【4月更文挑战第30天】本文探讨了图像数据的特征提取与预处理在机器学习中的重要性。图像数据具有大容量、信息丰富和冗余性高的特点。特征提取涉及颜色、纹理和形状特征;预处理包括图像增强、去噪和分割。Python的OpenCV和Scikit-image库在处理这些任务时非常有用。常见的特征提取方法有统计、变换和基于模型的方法,而预处理应注意保持图像真实性、适应性调整及验证评估。有效的特征提取和预处理能提升模型性能,Python工具使其更高效。
|
10天前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习专栏】文本数据的特征提取与表示
【4月更文挑战第30天】本文探讨了文本特征提取与表示在机器学习和NLP中的重要性。介绍了词袋模型、TF-IDF和n-gram等特征提取方法,以及稀疏向量和词嵌入等表示方式。Python中可利用sklearn和gensim库实现这些技术。有效的特征提取与表示有助于将文本数据转化为可处理的数值形式,推动NLP和机器学习领域的进步。
|
10天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】使用Scikit-learn进行数据编码
【4月更文挑战第30天】本文介绍了Python Scikit-learn库在机器学习数据预处理中的作用,尤其是数据编码。数据编码将原始数据转化为算法可理解的格式,包括标签编码(适用于有序分类变量)、独热编码(适用于无序分类变量)和文本编码(如词袋模型、TF-IDF)。Scikit-learn提供LabelEncoder和OneHotEncoder类实现这些编码。示例展示了如何对数据进行标签编码和独热编码,强调了正确选择编码方法的重要性。
|
10天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】数据标准化与归一化技术
【4月更文挑战第30天】在机器学习中,数据预处理的两大关键步骤是标准化和归一化,旨在调整数据范围以优化算法性能。标准化将数据缩放到特定区间,如[-1, 1]或[0, 1],适合基于距离的算法,如KNN、SVM。归一化则将数据线性变换到[0, 1],保持相对关系。Python中可使用`sklearn.preprocessing`的`MinMaxScaler`和`StandardScaler`实现这两种操作。选择哪种方法取决于数据分布和算法需求。预处理能提升模型理解和性能,增强预测准确性和可靠性。