概述
1.基本定义
决策树(Decision Tree)是一种基本的分类和回归算法。该算法模型呈树形结构,主要由结点和有向边组成。结点又分为两种类型:内部结点和叶子结点。内部结点表示在一个属性或特征上的测试,每一个结点分枝代表一个测试输出,每一个叶子结点代表一个类别。决策树学习是以实例为基础的归纳学习。
2.学习过程
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着特征空间的划分,也对应着决策树的构建。
决策树学习常用的算法有ID3、C4.5和CART算法。
2.1 基本定义
由于ID3算法和C4.5算法内部都涉及到熵,所以先对熵及其相关概念作一个简单介绍。
- 熵:熵是表示随机变量不确定性的度量。随机变量的熵值越大则越不稳定。其公式如下: H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-sum_{i=1}^{n}p_{i}logp_{i} H(X)=−i=1∑npilogpi其中, X X X为随机变量, n n n为随机变量 X X X的不同取值个数, p i = P ( X = x i ) p_{i}=P(X=x_{i}) pi=P(X=xi)。
- 条件熵:条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示在已知随机变量 X X X的条件下随机变量 Y Y Y的不确定性。其公式如下: H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=sum_{i=1}^{n}p_{i}H(Y|X=x_{i}) H(Y∣X)=i=1∑npiH(Y∣X=xi)其中, p i = P ( X = x i ) p_{i}=P(X=x_{i}) pi=P(X=xi)
2.2 ID3算法
ID3算法内部使用信息增益作为特征选择方法。信息增益表示得知特征X的信息而使得类Y的信息不确定性减少的程度,标记为 g ( Y , X ) g(Y,X) g(Y,X)。其公式如下: g ( Y , X ) = H ( Y ) − H ( Y ∣ X ) g(Y,X)=H(Y)-H(Y|X) g(Y,X)=H(Y)−H(Y∣X)信息增益大的特征,具有较强的分类能力。
2.3 C4.5算法
C4.5算法内部使用信息增益比进行特征选择,是对ID3算法的一种改进。使用信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题,而信息增益比可以对该问题进行矫正。信息增益比
g
R
(
Y
,
X
)
g_{R}(Y,X)
gR(Y,X)定义为特征A对类Y的信息增益
g
(
Y
,
A
)
g(Y,A)
g(Y,A)与特征A的熵之比。其公式如下:
g
R
(
Y
,
X
)
=
g
(
Y
,
X
)
H
(
X
)
g_{R}(Y,X)=frac{g(Y,X)}{H(X)}
gR(Y,X)=H(X)g(Y,X)信息增益比大的特征,具有较强的分类能力。
理论上,ID3算法和C4.5算法只用于解决分类问题,并且只用于处理离散特征(连续型特征一般要先离散化)。ID3算法和C4.5算法建立的树模型是多叉树。
2.4 CART算法
CART(Classification And Regression Tree,分类与回归树)是一种应用非常广泛的决策树算法。CART算法是在给定输入变量X条件下输出随机变量Y的条件概率分布的学习方法,该方法假设决策树是二叉树,内部节点特征的取值为“是”和“否”。这样的决策树等价于递归地二分划分每个特征,将特征空间划分为有限个单元,并在这些单元上确定预测的条件概率分布。
CART决策树的生成就是递归地构造二叉树的过程。对于回归树利用平方误差最小化准则进行特征选择,对于分类树则使用基尼指数进行特征选择。基尼指数的定义如下:
在分类问题中,假设有
K
K
K个类,样本点属于第
k
k
k个类的概率为
p
k
p_{k}
pk,则概率分布的基尼指数为:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=sum_{k=1}^{K}p_{k}(1-p_{k})=1-sum_{k=1}^{K}p_{k}^{2}
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于给定的样本集合
D
D
D,其基尼指数为
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=1-sum_{k=1}^{K}(frac{|C_{k}|}{|D|})^2
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2其中
C
k
C_{k}
Ck是
D
D
D中属于第
k
k
k类的样本子集,
K
K
K是类的个数。
G
i
n
i
(
D
)
Gini(D)
Gini(D)表示数据集
D
D
D的不确定性。
如果样本集合
D
D
D根据特征
A
A
A是否取某一可能值
a
a
a将数据集分割成
D
1
D_{1}
D1和
D
2
D_{2}
D2两部分,则在特征
A
A
A的条件小,集合
D
D
D的基尼指数定义为:
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A)=frac{|D_{1}|}{|D|}Gini(D_{1})+frac{|D_{2}|}{|D|}Gini(D_{2})
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)改值表示经过
A
=
a
A=a
A=a分割后集合
D
D
D的不确定性。基尼指数值越大,样本集合的不确定性就越大。CART算法就是选择一个基尼指数最小的最优特征和最优切分点。
3.决策树剪枝
3.1 决策树损失函数
假设决策树 T T T的叶结点个数为 ∣ T ∣ |T| ∣T∣, t t t是树的叶结点,该结点有 N t N_{t} Nt个样本,其中 k k k类的样本点有 N t k N_{tk} Ntk个, H t ( T ) H_{t}(T) Ht(T)为叶结点 t t t上的经验熵, α ≥ 0 alpha ge 0 α≥0为参数,则决策树的损失函数可以定义为: C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{alpha}(T)=sum_{t=1}^{|T|}N_{t}H_{t}(T)+alpha|T| Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣第一项表示模型对训练数据的预测误差,第二项中的 ∣ T ∣ |T| ∣T∣表示模型复杂度。其中经验熵为: H t ( T ) = − ∑ k N t k N t l o g N t k N t H_{t}(T)=-sum_{k}frac{N_{tk}}{N_{t}}logfrac{N_{tk}}{N_{t}} Ht(T)=−k∑NtNtklogNtNtk当 α alpha α确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度越低,但是与训练数据的拟合就不够好。
3.2 剪枝原理
剪枝是决策树算法对付“过拟合”的主要手段。其基本策略主要有“预剪枝”和“后剪枝”两种。具体如下:
- 预剪枝:预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
- 后剪枝:后剪枝则是先从训练集中生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化能力能提升,则将该子树替换为叶结点。
决策树的剪枝通过极小化决策树整体的损失函数来实现的。
3.3 实现过程
以后剪枝为例,设一组叶结点回缩到其父结点之前与之后的整体树分别为 T A T_{A} TA和 T B T_{B} TB,其对应的损失函数值分别为 C α ( T A ) C_{alpha}(T_{A}) Cα(TA)和 C α ( T B ) C_{alpha}(T_{B}) Cα(TB),如果 C α ( T A ) ≥ C α ( T B ) C_{alpha}(T_{A}) ge C_{alpha}(T_{B}) Cα(TA)≥Cα(TB),则进行剪枝。
4.Sklearn实现
4.1 函数及其参数
sklearn中提供了专门的决策树分类算法(DecisionTreeClassifier)和决策树回归算法(DecisionTreeRegressor)。下面以DecisionTreeClassifier为例进行说明。
其中几个重要参数的作用如下:
- criterion:评估特征质量函数。取‘gini’时使用基尼指数选择特征,取‘entropy’时使用信息增益选择特征(决策树回归中的参数取值不同)。
- max_depth:树的最大深度。
- min_samples_split:树的内部结点所需的最小样本数,若不满足则不再进行分割。
- min_samples_leaf|树的叶子结点所需的最小样本树。
- max_features:寻找最优划分时需要考虑的特征数目。
- min_impurity_decrease:只有当划分结点后不纯度的减少值超过改值时才会进行对该节点进行分割。该参数的作用类似预剪枝。不纯度减少的评估公示如下:
- ccp_alpha:最小损失-复杂度参数(后剪枝)。设置了该参数之后,会进行剪枝操作并使最后形成的决策树中的每个子树的损失-复杂度函数值都小于该参数。若该参数取默认值,则不进行剪枝。
理论上决策树既可以处理连续型变量也可以处理离散型变量,但该算法内部无法区分这两种类型变量,其内部都当作连续型变量进行处理。该方法内部使用二分法对连续属性进行处理,所以DecisionTreeClassifier()产生的树模型均为二叉树。
4.2 实验
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import pydotplus
from IPython.display import Image,display
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree
iris=load_iris()
X=pd.DataFrame(iris.data,columns=iris.feature_names)
y=pd.DataFrame(iris.target,columns=['target'])
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
clf=DecisionTreeClassifier(criterion='entropy',max_depth=4)
clf.fit(X_train,y_train)
y_test_pred=clf.predict(X_test)
y_train_pred=clf.predict(X_train)
print("训练数据准确率:",accuracy_score(y_train,y_train_pred))
print("训练数据准确率:",accuracy_score(y_test, y_test_pred))
##树结构可视化
dot_data=tree.export_graphviz(clf,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True,
rounded=True)
graph=pydotplus.graph_from_dot_data(dot_data)
display(Image(graph.create_png()))
其最后的树结构为:
Tips:sklearn中使用前序遍历(根->左孩子->右孩子)顺序对上述树结构中的结点进行编号,编号从0开始。
DecisionTreeClassifier()还提供了两个方法可以返回具体每一个记录的决策路径与叶结点编号,具体如下:
方法 | 作用 |
---|---|
apply | 返回每一条记录对应的叶子结点编号 |
decision_path | 返回每一条记录的决策路径 |
算法要点
- 决策树算法主要优点:模型具有可读性、分类速度快。
- 决策树算法可以解决回归问题,但通常不建议使用决策树来解决回归问题(依据决策树的结构可知,决策树解决回归问题时能够预测出的不同Y值的个数直接受限于叶子结点的个数)。
- 决策树生成值只考虑了如何对训练数据进行更好地拟合,而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。
- 决策树可以认为是if-then规则的合集,也可以认为是定义在特征空间和类空间上的条件概率分布。
补充
对于类别特征,尤其是当类别特征中类别个数很多时,并不推荐使用one-hot编码。除了降低了空间和时间效率之外,主要会存在以下两方面问题:
- 会产生样本切分不平衡问题,导致切分增益非常小,浪费了这个特征。使用one-hot编码意味着每个决策节点上只能使用one vs rest(例如是不是狗等)的切分方式。one-hot产生的这一系列特征上只会有少量样本取值为1,绝大部分样本取值为0,这时候切分样本会产生不平衡,切分增益也会很小。较小的那个切分样本集,它占总样本的比例太小,无论增益多大,乘以该比例之后几乎可以忽略;较大的那个拆分样本集,它几乎就是原始的样本集,增益几乎为零。比较直观的理解就是不平衡的切分和不切分没有区别。
- 会影响决策树的学习。因为就算可以对这个类别特征进行切分,独热编码也会把数据切分到很多零散的小空间上。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习效果会变差。
参考资料
- https://zhuanlan.zhihu.com/p/99069186
最后
以上就是陶醉老师为你收集整理的机器学习算法:决策树算法的全部内容,希望文章能够帮你解决机器学习算法:决策树算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复