决策树的原理、方法以及python实现——机器学习笔记

* * * * * *  The Machine Learning Noting Series  * * * * * *

策树(Decision Tree)是机器学习的核心算法之一,在较小训练样本或有限计算资源下仍有较好表现,它包括分类树和回归树,是目前应用最广泛的分类预测和回归预测方法。

导航

0 引言

1 决策树的概念

    分类树

    回归树

2  决策树的生长

     分类算法

     分类过程

3  决策树的剪枝

     剪枝算法

     剪枝过程

4  python代码实现——实例应用

- - - - - - - - - - -

0  引言

考虑这样一个药品筛选问题,大批患有同种疾病的不同病人,服用5种候选药后取得同样的效果,现有每个病人服药前的几项生理指标数据,要通过这些数据来得到选药的建议,即要根据任何一个此类病人的生理指标来得到最合适药物的建议,这就可以使用决策树方法,建立以药物为输出变量,以生理指标为输入变量的多分类预测模型。此案例在文章最后给出。

1  决策树概念

分类树

以一个例子说明决策树概念。右侧图为一个典型的树深度等于4的决策树。树深度是树根到树叶的最大层数,通常为决策树模型复杂度的度量。每个椭圆为树的节点,有向箭头将各层节点连在一起构成树的分支,一个分支的上下节点分别成为父、子节点,每个父节点下均仅有2个子节点的称为2叉树,2个以上节点的为多叉树。根节点包含所有样本,按照某种分类算法分出的子节点分别包含父节点的部分样本,在末端且没有子节点的称为叶节点。

左侧图为右侧决策树的分类边界示意。右侧决策树根节点按 X2<5 规则生成第一层的左右两个子节点,分别对应左图水平线 X2=5 分割形成的上下两个区域,后面的分割依次类推。

 回归树

回归树本质上也是对 p+1 (p个输入变量)维空间的划分,下图展示了两个输入变量 X1 和 X2 以及一个输出变量 Y 的回归平面。左图为使用线性回归模型 Y=\beta _{0}+\beta _{1}X_{1}+\beta _{2}X_{2}+\varepsilon 所得的回归平面,右图为回归树的回归面。右图回归面按照一定的规则进行划分,例如最高面是按照规则 X1<-2.9和X2>3.4 划分的。图中深色观察测点的输出变量实际值大于预测值,样本观测点位于回归面上方,浅色点相反,可见回归树复杂度高,能有效分析输入和输出变量间的非线性关系,解决非线性回归问题。

 分类树空间划分的先后顺序和位置,每次划分应使分出的两个区域所包含的观测点的输出变量取值差异及异质性尽量低,即两区域的离差平方(或MES)和应为最小,公式为:(其中R为划分区域,\widehat{y}为输出变量预测值)

min\left [ \sum_{X_{i}\in R_{1}}^{}\left ( y_{i}-\widehat{y}_{R_{1}} \right )^{2}+\sum_{X_{i}\in R_{2}}^{}\left ( y_{i}-\widehat{y}_{R_{2}} \right )^{2} \right ]

2  决策树的生长

分类回归树CART(Classification and Regression Tree)为二叉树,使用贪心算法,自顶向下的递归二分策略实现区域划分。其他算法包括ID3和C4.5这里不做介绍。

分类算法

分类由节点异质性(也称为纯洁度(Purity))决定,异质性越小表明子节点观测值类别相同程度越高,分类越合适。

⚫ CART分类树使用基尼系数(Gini)(或者熵[参考点击这里] )度量节点异质性,节点 t 的基尼系数为:

G(t)=1-\sum_{k-1}^{K}P^{2}(k\mid t)=\sum_{k-1}^{K}P(k\mid t)\left [ 1- P(k\mid t)\right ]

其中 K 为输出变量的类别数,P(k\mid t) 是节点 t 中输出变量取第 k 类的概率。可见当节点 t 中输出变量均取同一类值即没有异质性时,基尼系数取最小值为0;当输出变量异质性最大时基尼系数取到最大值 1-1/k .

⚫ CART回归树使用方差度量异质性,节点 t 方差为:

S^{2}(t)=\frac{1}{N_{t}}\sum_{i=1}^{N_{t}}\left [ y_{i} \right (t)-\overline{y}(t)]^{2}

其中,y(t) 为节点 t 中样本观测 X 的输出变量值,\overline{y} 为节点 t 中输出变量的均值。

分类过程

分类树节点的划分应使左(G_{left})右(G_{right})子节点的基尼系数均取到最小值,但通常无法做到,因此只需取两者的加权平均数最小即可,权重为左右节点各自的样本量占比。可见,从父节点到子节点,输出变量的异质性下降为:

\Delta G(t)=G(t)-[\frac{N_{t_{left}}}{N_{t}} \cdot G(t_{left})+\frac{N_{t_{right}}}{N_{t}} \cdot G(t_{right})]

“最佳”分组变量和组限应使\Delta G(t)取最大值。同理,若使用熵而非基尼系数,则使用熵Ent(t)替代上式中的 G(t)

\Delta Ent(t)=Ent(t)-[\frac{N_{t_{left}}}{N_{t}} \cdot Ent(t_{left})+\frac{N_{t_{right}}}{N_{t}} \cdot Ent(t_{right})]

“最佳”分组同样需使上式达到最大值。需要说明的是,熵取最小值0代表节 t 无异质性,最大值取到 -log_{2}\frac{1}{K} . 上式中的\Delta Ent(t)即为信息增益

回归树分类过程和分类树类似,只是异质性度量使用节点方差代替基尼系数。回归树异质性下降为:

\Delta S^{2}(t)=S^{2}(t)-[\frac{N_{t_{left}}}{N_{t}} \cdot S^{2}(t_{left})+\frac{N_{t_{right}}}{N_{t}} \cdot S^{2}(t_{right})]

“最佳”分组同样需使上式达到最大值。

3  决策树的剪枝

剪枝算法

CART的后剪枝采用最小代价复杂度剪枝法(Minimal Cost Complexity Pruning,MCCP),剪枝的目的是解决模型的过拟合,以得到测试误差最小的树,或者说,达到复杂度和测试误差的平衡。

可以使用叶节点个数来测度决策树的复杂度,将误差看成树的“测试代价”,那么树 T 的代价复杂度定义为:

R_{\alpha }(T)=R(T)+\alpha \left | \widetilde{T} \right |

其中,\left | \widetilde{T}\right |为树T的叶节点个数,α为复杂度参数(Complexity Parameter,CP参数),R(T)为测试误差:对于分类树使用判错率计算;对于回归树使用均方误差或者离差平方和计算,即此时:

R(T)=\sum_{m=1 }^{\left | \widetilde{T} \right |} \sum_{x_{i}\in R_{m}}^{}\left ( y_{i}-\widehat{y} _{R_{m}}\right )^{2}

一般希望测试误差R(T)和模型复杂度\left | \widetilde{T}\right |均较低,但两者其实是此高彼低的关系,因此只要两者之和即代价复杂度R_{\alpha }(T)较小即可。

此外,树T代价复杂度是α的函数,α=0时表示不考虑复杂度的影响,基于代价复杂度最小是最优树的原则,此时的最优树为叶节点最多的树。显然最优树与CP参数α有关,因此可以通过调整α的取值得到一系列当前最优树,而真正的最优树就在其中。

剪枝过程

在从叶节点逐渐向根节点方向剪枝的过程中,需要判断先剪哪一只,是否需要剪枝的问题。即在判断是否应剪掉中间节点{t}下的子树T_{t}时,应计算两者的代价复杂度,其中中间节点的代价复杂度通常被视为剪掉其所有子树后的代价复杂度(此时仅有一个叶节点):

R_{\alpha }(\left \{ t \right \})= R(\left \{ t \right \})+\alpha

中间节点的子树的代价复杂度为:

R_{\alpha }(T_{t})=R(T_{t})+\alpha\left | \widetilde{T_{t}}\right |

其中R(T_{t})为左右两个子节点测试误差的加权均值,权重为各自样本量占比。

基于代价复杂度最小原则,若R_{\alpha }(\left \{ t \right \})\leq R_{\alpha }(T_{t}),即\alpha \geq \frac{R(\left \{ t \right \})\leq R(T_{t})}{\left | \widetilde{T_{t}}\right |-1}时,则应剪掉子树,因为它对降低测试误差贡献很小。

CART后剪枝主要分为两个阶段

 4  python代码实现——实例应用

继续引言中的例子,先说明结果,python代码放在最后。

 左图可以得出,树深度达到4时两个误差均达到最小,因此最有树深度为4,右图可以看出,影响药物效果的生理指标中,最重要因素为Na/K,性别没有影响。

左图表明模型整体预测正确率为99%,对药物B的查准率较低,但整体查准率P和查全率R均达99%,说明模型分类预测性能理想。右图为此案例的决策树,从前4行可以看出,当生理指标4≤14.83,指标2小于等于0.5以及指标0小于等于49.5时,推荐使用药物A,其余类推。

本案例python代码(来自参考文献,数据可向我索要)

# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import warnings
warnings.filterwarnings(action = 'ignore')
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
import sklearn.linear_model as LM
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.datasets import make_regression
from sklearn import tree
from sklearn.preprocessing import LabelEncoder
# 数据详情
data=pd.read_csv('药物研究.txt')
le = LabelEncoder()
le.fit(data["Sex"])
data["SexC"]=le.transform(data["Sex"])
data["BPC"]=le.fit(data["BP"]).transform(data["BP"])
data["CholesterolC"]=le.fit(data["Cholesterol"]).transform(data["Cholesterol"])
data["Na/K"]=data["Na"]/data["K"]
data.head()
# 生成决策树
X=data[['Age','SexC','BPC','CholesterolC','Na/K']]
Y=data['Drug']
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)
trainErr=[]
testErr=[]
K=np.arange(2,10)
for k in K:
    modelDTC = tree.DecisionTreeClassifier(max_depth=k,random_state=123)
    modelDTC.fit(X_train,Y_train)
    trainErr.append(1-modelDTC.score(X_train,Y_train))
    testErr.append(1-modelDTC.score(X_test,Y_test))
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,4))
axes[0].grid(True, linestyle='-.')
axes[0].plot(np.arange(2,10),trainErr,label="训练误差",marker='o',linestyle='-')
axes[0].plot(np.arange(2,10),testErr,label="测试误差",marker='o',linestyle='-.')
axes[0].set_xlabel("树深度")
axes[0].set_ylabel("误差")
axes[0].set_title('树深度和误差')
axes[0].legend()

bestK=K[testErr.index(np.min(testErr))]
modelDTC = tree.DecisionTreeClassifier(max_depth=bestK,random_state=123)
modelDTC.fit(X_train,Y_train)
axes[1].bar(np.arange(5),modelDTC.feature_importances_)
axes[1].set_title('输入变量的重要性')
axes[1].set_xlabel('输入变量')
axes[1].set_xticks(np.arange(5))
axes[1].set_xticklabels(['年龄','性别','血压','胆固醇','Na/K'])
plt.show()

# 打印决策树
print("模型的评价:\n",classification_report(Y,modelDTC.predict(X)))
print(tree.export_text(modelDTC))

参考文献

《Python机器学习 数据建模与分析》,薛薇 等/著

《机器学习与Pytnon实践》,黄勉 编著

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 《机器学习学习笔记.pdf》是一本关于机器学习的学习笔记的电子书,其内容涵盖了机器学习的基本概念、算法原理和实践应用等方面。 该电子书的主要内容包括但不限于以下几个方面: 1. 机器学习基础:介绍了机器学习的基本概念、发展历史和核心原理,帮助读者建立起对机器学习的整体认识和理解。 2. 机器学习算法:详细介绍了常见的机器学习算法,包括监督学习算法(如线性回归、逻辑回归、决策树、支持向量机等)、无监督学习算法(如聚类算法、降维算法等)和强化学习算法等,使读者能够了解和掌握不同类型的机器学习算法及其应用场景。 3. 机器学习实践:讲解了机器学习的实践方法和流程,涵盖了数据预处理、特征工程、模型选择和评估等方面的内容,帮助读者掌握如何在实际问题中应用机器学习技术。 4. 应用案例:通过实际案例的介绍和分析,展示了机器学习在自然语言处理、计算机视觉、推荐系统等领域的应用,激发读者对机器学习在实际问题中的应用的兴趣和思考能力。 通过阅读《机器学习学习笔记.pdf》,读者可以系统地学习机器学习的基础知识和算法原理,了解机器学习的应用场景和实践方法,并通过实际案例的分析加深对机器学习技术的理解。这本电子书可以作为机器学习初学者的入门学习资料,也适合有一定机器学习基础的读者作为参考和进一步学习的资料。希望通过这本电子书的阅读,读者能够理解和掌握机器学习的相关知识,为未来在机器学习领域的学习和研究打下坚实的基础。 ### 回答2: 《机器学习学习笔记.pdf》是一本介绍机器学习的学习资料。机器学习是一种通过利用数据来训练计算机算法的方法,使其能够自动地从数据中学习和提高性能。这本学习笔记涵盖了机器学习的基本概念、原理方法,适合初学者和对机器学习感兴趣的读者。 首先,学习笔记机器学习的基本概念入手,包括机器学习的定义、应用领域以及机器学习的三个主要任务:监督学习、无监督学习和强化学习。然后,详细介绍了机器学习的基本原理,如训练集、测试集、特征选择和模型评估等。此外,学习笔记还介绍了几种常见的机器学习算法,如决策树、支持向量机和深度学习等。 除了理论知识,学习笔记还提供了实践案例和代码示例,帮助读者更好地理解和应用机器学习算法。读者可以通过实践案例来掌握机器学习算法的具体应用,并且可以利用代码示例进行实际编程实践。同时,学习笔记还讨论了机器学习的一些挑战和未来的发展方向,如数据质量、模型解释性和自动化机器学习等。 总的来说,《机器学习学习笔记.pdf》是一本全面介绍机器学习的学习资料。它结合理论和实践,旨在帮助读者建立对机器学习的基本理解,并具备在实际问题中应用机器学习算法的能力。无论是初学者还是有一定机器学习基础的读者,都可以从中获得有益的知识和经验。 ### 回答3: 《机器学习学习笔记.pdf》是一本关于机器学习的学习笔记文档。机器学习是人工智能领域的重要分支,它研究如何使计算机系统自动从数据中学习和改进,以完成特定任务。这本学习笔记以简洁明了的方式介绍了机器学习的基本概念、算法和实践应用。 笔记中首先介绍了机器学习的基础知识,包括监督学习、无监督学习和强化学习等不同的学习类型。然后详细讲解了常用的机器学习算法,如线性回归、逻辑回归、决策树、支持向量机等。每种算法都给出了清晰的定义和示例,并详细解释了算法的原理和应用场景。 此外,《机器学习学习笔记.pdf》还包括了机器学习的实践应用和案例分析。它介绍了如何通过Python等编程语言和机器学习库进行实际的机器学习项目开发,包括数据预处理、特征工程、模型训练和评估等环节。对于初学者来说,这部分内容非常有价值,可以帮助他们快速进入实际应用的阶段。 总结来说,《机器学习学习笔记.pdf》是一本很好的机器学习入门教材,它详细介绍了机器学习的基本概念和常用算法,并提供了实际项目的实践指导。无论是对于想要了解机器学习基础知识的初学者,还是对于已经有一定机器学习经验的开发者来说,这本学习笔记都是一本值得阅读和参考的资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值