决策树基本算法及其剪枝优化

1、信息论

(1)比特化
假设存在一组随机变量X,各个值出现的概率关系为:P(X=A)=1/4,P(X=B)=1/4,P(X=C)=1/4,P(X=D)=1/4。现在有一组由X变量组成的序列:BACADDCBAC…,如果现在希望将这个序列转换为二进制来进行网络传输,那么我们得到一个这样的序列:01001000111110010010…。在这种情况下,我们可以使用两个比特位来表示一个随机变量,即:A:00,B:01,C:10,D:11。
而当X变量出现的概率值不一样的时候,对于一组序列信息来讲,每个变量平均需要多少个比特位来描述呢?
设X变量出现的概率值为:P(X=A)=1/2,P(X=B)=1/4,P(X=C)=1/8,P(X=D)=1/8。则可以编码为:A:0,B:10,C:110,D:111。
E = 1 × 1 2 + 2 × 1 4 + 3 × 1 8 + 3 × 1 8 E = − log ⁡ 2 ( 1 2 ) × 1 2 − log ⁡ 2 ( 1 4 ) × 1 4 − log ⁡ 2 ( 1 8 ) × 1 8 − log ⁡ 2 ( 1 8 ) × 1 8 = 1.75 \begin{aligned} E&=1\times\frac{1}{2}+2\times\frac{1}{4}+3\times\frac{1}{8}+3\times\frac{1}{8} \\ E&=-\log_2{(\frac{1}{2})\times\frac{1}{2}}-\log_2{(\frac{1}{4})\times\frac{1}{4}}-\log_2{(\frac{1}{8})\times\frac{1}{8}}-\log_2{(\frac{1}{8})\times\frac{1}{8}}=1.75 \end{aligned} EE=1×21+2×41+3×81+3×81=log2(21)×21log2(41)×41log2(81)×81log2(81)×81=1.75
(2)一般化的比特化
假设现在随机变量X具有m个值,分别为:V1,V2,…,Vm,并且各个值出现的概率为P(X=V1)=p1,P(X=V2)=p2,P(X=V3)=p3,…,P(X=Vm)=pm,那么对于一组序列信息来讲,我们可以使用这些变量的期望来表示每个变量平均需要多少个比特位来描述信息。
E ( X ) = − p 1 log ⁡ 2 ( p 1 ) − p 2 log ⁡ 2 ( p 2 ) − . . . − p m log ⁡ 2 ( p m ) = − ∑ i = 1 m p i log ⁡ 2 ( p i ) \begin{aligned} E(X)&=-p_1\log_2(p_1)-p_2\log_2(p_2)-...-p_m\log_2(p_m) \\ &=-\sum_{i=1}^mp_i\log_2(p_i) \end{aligned} E(X)=p1log2(p1)p2log2(p2)...pmlog2(pm)=i=1mpilog2(pi)
(3)信息熵(Entropy)
H(X)叫做随机变量X的信息熵:
H ( X ) = − ∑ i = 1 m p i log ⁡ 2 ( p i ) H(X)=-\sum_{i=1}^mp_i\log_2(p_i) H(X)=i=1mpilog2(pi)
信息量:指的是一个样本/事件所蕴含的信息,如果一个事件的概率越大,那么就可以认为该事件所蕴含的信息越少。极端情况下,比如:“太阳从东方升起”,因为是确定事件,所以不携带任何信息量。
信息熵:1948年,香农引入信息熵;一个系统越是有序,信息熵就越低,一个系统越是混乱,信息熵就越高,所以信息熵被认为是一个系统有序程度的度量。信息熵就是用来描述系统信息量的不确定度。
High Entropy(高信息熵):表示随机变量X是均匀分布的,各种取值情况是等概率出现的。
Low Entropy(低信息熵):表示随机变量X各种取值不是等概率出现,可能出现有的事件概率很大,有的事件概率很小。

(4)条件熵(H(Y|X))
给定条件X的情况下,所有不同x值情况下Y的信息熵的平均值叫做条件熵。
示例数据如下:

专业(X)性别(Y)
数学M
ITM
英语F
数学F
数学M
ITM
英语F
数学F

信息熵计算如下:

v j v_j vj P ( X = v j ) P(X=v_j) P(X=vj) H ( Y ∥ X = v j ) H(Y\|X=v_j) H(YX=vj)
数学0.51
IT0.250
英语0.250

条件熵计算公式:
H ( Y ∣ X ) = ∑ j = 1 P ( X = v j ) H ( Y ∣ X = v j ) H ( Y ∣ X ) = 0.5 × 1 + 0.25 × 0 + 0.25 × 0 = 0.5 \begin{aligned} H(Y|X)&=\sum_{j=1}P(X=v_j)H(Y|X=v_j) \\ H(Y|X)&=0.5\times1+0.25\times0+0.25\times0=0.5 \end{aligned} H(YX)H(YX)=j=1P(X=vj)H(YX=vj)=0.5×1+0.25×0+0.25×0=0.5
条件熵的另外一个公式如下:
H ( Y ∣ X ) = H ( X , Y ) − H ( X ) H(Y|X)=H(X,Y)-H(X) H(YX)=H(X,Y)H(X)
上式表示,事件(X,Y)发生所包含的熵,减去事件X单独发生的熵,即为在事件X发生的前提下,Y发生“新”带来的熵,这个也就是条件熵本身的概念。这个公式的推导如下:
H ( Y ∣ X ) = ∑ j = 1 P ( X = v j ) H ( Y ∣ X = v j ) = ∑ x P ( x ) H ( Y ∣ x ) = ∑ x p ( x ) ( − ∑ y p ( y ∣ x ) log ⁡ ( p ( y ∣ x ) ) ) = − ∑ x ∑ y p ( x ) p ( y ∣ x ) log ⁡ ( p ( y ∣ x ) ) = − ∑ x ∑ y p ( x ) p ( y ∣ x ) log ⁡ ( p ( x , y ) p ( x ) ) = − ∑ x ∑ y p ( x ) p ( y ∣ x ) log ⁡ ( p ( x , y ) ) − [ − ∑ x ( ∑ y p ( x , y ) ) log ⁡ ( p ( x ) ) ] = H ( X , Y ) − [ − ∑ x p ( x ) log ⁡ ( p ( x ) ) ] = H ( X , Y ) − H ( X ) \begin{aligned} H(Y|X)&=\sum_{j=1}P(X=v_j)H(Y|X=v_j) \\ &=\sum_xP(x)H(Y|x) \\ &=\sum_xp(x)(-\sum_yp(y|x)\log(p(y|x))) \\ &=-\sum_x\sum_yp(x)p(y|x)\log(p(y|x)) \\ &=-\sum_x\sum_yp(x)p(y|x)\log(\frac{p(x,y)}{p(x)}) \\ &=-\sum_x\sum_yp(x)p(y|x)\log(p(x,y))-[-\sum_x(\sum_yp(x,y))\log(p(x))] \\ &=H(X,Y)-[-\sum_xp(x)\log(p(x))] \\ &=H(X,Y)-H(X) \end{aligned} H(YX)=j=1P(X=vj)H(YX=vj)=xP(x)H(Yx)=xp(x)(yp(yx)log(p(yx)))=xyp(x)p(yx)log(p(yx))=xyp(x)p(yx)log(p(x)p(x,y))=xyp(x)p(yx)log(p(x,y))[x(yp(x,y))log(p(x))]=H(X,Y)[xp(x)log(p(x))]=H(X,Y)H(X)

2、决策树

(1)什么是决策树?
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构建决策树来进行分析的一种方式,是一种直观应用概率分析的一种图解法;决策树是一种预测模型,代表的是对象属性与对象值之间的映射关系;决策树是一种树形结构,其中每个内部节点表示一个属性的测试,每个分支表示一个测试输出,每个叶节点代表一种类别;决策树是一种非常常用的有监督的分类算法。
决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。
决策树分为两大类:分类树和回归树,前者用于分类标签值,后者用于预测连续值,常用算法有ID3、C4.5、CART等。
(2)决策树构建过程
决策树算法的重点就是决策树的构造。决策树的构造就是进行属性选择度量,确定各个特征属性之间的拓扑结构(树结构);构建决策树的关键步骤就是分裂属性,分裂属性是指在某个节点按照某一类特征属性的不同划分构建不同的分支,其目标就是让各个分裂子集尽可能的’纯’(让一个分裂子类中待分类的项尽可能的属于同一个类别)。
构建步骤如下:

  1. 将所有的特征看成一个一个的节点;
  2. 遍历每个特征的每一种分割方式,找到最好的分割点;将数据划分为不同的子节点,eg:N1、N2 …Nm;计算划分之后所有子节点的’纯度’信息;
  3. 对第二步产生的分割,选择出最优的特征以及最优的划分方式;得出子节点:N1、N2 … Nm;
  4. 对子节点N1、N2 … Nm分别继续执行2-3步,直到每个最终的子节点都足够’纯’。

(3)决策树特征属性类型
根据特征属性的类型不同,在构建决策树的时候,采用不同的方式,具体如下:
1)属性是离散值,而且不要求生成的是二叉决策树,此时一个属性就是一个分支。
2)属性是离散值,而且要求生成的是二叉决策树,此时使用属性划分的子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3)属性是连续值,可以确定一个值作为分裂点split_point,按>split_point和<=split_point生成两个分支。
(4)决策树分割属性选择
决策树算法是一种“贪心”算法策略,只考虑在当前数据特征情况下的最好分割方式,不能进行回溯操作。
对于整体的数据集而言,按照所有的特征属性进行划分操作,对所有划分操作的结果集的“纯度”进行比较,选择“纯度”越高的特征属性作为当前需要分割的数据集进行分割操作,持续迭代,直到得到最终结果。决策树是通过“纯度”来选择分割特征属性点的。
(5)决策树量化纯度
决策树的构建是基于样本概率和纯度进行构建操作的,那么进行判断数据集是否“纯”可以通过三个公式进行判断,分别是Gini系数、熵(Entropy)、错误率,这三个公式值越大,表示数据越“不纯”;越小表示越“纯”;实践证明这三种公式效果差不多,一般情况使用熵公式。
G i n i = 1 − ∑ i = 1 n P 2 ( i ) H ( E n t r o p y ) = − ∑ i = 1 n P ( i ) log ⁡ 2 ( P ( i ) ) E r r o r = 1 − max ⁡ i = 1 n P ( i ) \begin{aligned} Gini&=1-\sum_{i=1}^n P^2(i) \\ H(Entropy)&=-\sum_{i=1}^nP(i)\log_2(P(i)) \\ Error&=1-\max_{i=1}^n{P(i)} \end{aligned} GiniH(Entropy)Error=1i=1nP2(i)=i=1nP(i)log2(P(i))=1i=1maxnP(i)
当计算出各个特征属性的量化纯度值后使用信息增益度来选择出当前数据集的分割特征属性;如果信息增益度的值越大,表示在该特征属性上的纯度越大 ,那么该属性就越应该在决策树的上层,计算公式为:
G a i n = Δ = H ( D ) − H ( D ∣ A ) Gain=\Delta=H(D)-H(D|A) Gain=Δ=H(D)H(DA)
Gain为特征A对训练数据集D的信息增益,它为集合D的信息熵H(D)与给定特征A下D的条件熵H(D|A)之差。
(6)决策树算法的停止条件
决策树构建的过程是一个递归的过程,所以必须给定停止条件,否则过程将不会停止,一般情况有两种停止条件:

  • 当每个子节点只有一种类型的时候停止构建
  • 当前节点中记录数小于某个阈值,同时迭代次数达到给定值时,停止构建过程,此时使用max(p(i))作为节点的对应类型

方式一可能会使树的节点过多,导致过拟合(Overfiting)等问题,比较常用的方式是使用方式二作为停止条件。
(7)决策树算法效果评估
决策树的效果评估和一般的分类算法一样,采用混淆矩阵来进行计算准确率、召回率、精确率等指标,也可以采用叶子节点的纯度值总和来评估算法的效果,值越小,效果越好。

决策树的损失函数如下,该值越小,算法效果越好。
l o s s = ∑ t = 1 l e a f ∣ D t ∣ ∣ D ∣ H ( t ) loss=\sum_{t=1}^{leaf}\frac{|D_t|}{|D|}H(t) loss=t=1leafDDtH(t)
(8)决策树分割节点选择示例

ID拥有房产(是/否)婚姻状态(单身/已婚/离婚)年收入(单位:千元)无法偿还债务(是/否)
1单身125
2已婚100
3单身100
4已婚110
5离婚60
6离婚95
7单身85
8已婚75
9单身90
10离婚220

设x为是否拥有房产,y为是否无法偿还债务,则房产的信息熵和信息增益计算如下。
p ( x = 是 ) = 0.4 p ( x = 否 ) = 0.6 p ( y = 是 ∣ x = 是 ) = 0 p ( y = 否 ∣ x = 是 ) = 1 p ( y = 是 ∣ x = 否 ) = 0.5 p ( y = 否 ∣ x = 否 ) = 0.5 I n f o ( D 有 房 产 ) = H ( D 有 房 产 ) = − 1 × log ⁡ 2 ( 1 ) − 0 × log ⁡ 2 ( 0 ) = 0 I n f o ( D 无 房 产 ) = H ( D 无 房 产 ) = − 0.5 × log ⁡ 2 ( 0.5 ) − 0.5 × log ⁡ 2 ( 0.5 ) = 1 I n f o ( D ) = − ∑ i = 1 2 P ( i ) log ⁡ 2 ( P ( i ) ) = − 0.7 × log ⁡ 2 ( 0.7 ) − 0.3 × log ⁡ 2 ( 0.3 ) = 0.88 G a i n ( 房 产 ) = I n f o ( D ) − ∑ j = 1 2 N ( D j ) N ( D ) × I n f o ( D j ) = 0.88 − 0.4 × 0 − 0.6 × 1 = 0.28 G a i n ( 婚 姻 ) = 0.205 G a i n ( 收 入 = 80 ) = 0.116 G a i n ( 收 入 = 97.5 ) = 0.395 \begin{aligned} p(x=是)&=0.4 \\ p(x=否)&=0.6 \\ p(y=是|x=是)&=0 \\ p(y=否|x=是)&=1 \\ p(y=是|x=否)&=0.5 \\ p(y=否|x=否)&=0.5 \\ Info(D_{有房产})&=H(D_{有房产}) \\ &=-1\times\log_2(1)-0\times\log_2(0) \\ &=0 \\ Info(D_{无房产})&=H(D_{无房产}) \\ &=-0.5\times\log_2(0.5)-0.5\times\log_2(0.5) \\ &=1 \\ Info(D)&=-\sum_{i=1}^2P(i)\log_2(P(i)) \\ &=-0.7\times\log_2(0.7)-0.3\times\log_2(0.3) \\ &=0.88 \\ Gain(房产)&=Info(D)-\sum_{j=1}^2\frac{N(D_j)}{N(D)}\times Info(D_j) \\ &=0.88-0.4\times0-0.6\times1 \\ &=0.28 \\ Gain(婚姻)&=0.205 \\ Gain(收入=80)&=0.116 \\ Gain(收入=97.5)&=0.395 \end{aligned} p(x=)p(x=)p(y=x=)p(y=x=)p(y=x=)p(y=x=)Info(D)Info(D)Info(D)Gain()Gain()Gain(=80)Gain(=97.5)=0.4=0.6=0=1=0.5=0.5=H(D)=1×log2(1)0×log2(0)=0=H(D)=0.5×log2(0.5)0.5×log2(0.5)=1=i=12P(i)log2(P(i))=0.7×log2(0.7)0.3×log2(0.3)=0.88=Info(D)j=12N(D)N(Dj)×Info(Dj)=0.880.4×00.6×1=0.28=0.205=0.116=0.395
其中年收入的分割点如下。

X(年收入)Y(无法偿还债务)分割点
6067.5
7580
8587.5
9092.5
9597.5
100100
100105
110117.5
125172.5
220 

(9)决策树生成算法
建立决策树的主要是以下三种算法:ID3、C4.5和CART(Classification And Regression Tree)。
1)ID3算法
ID3算法是决策树的一个经典的构造算法,内部使用信息熵以及信息增益来进行构建,每次迭代选择信息增益最大的特征属性作为分割属性。
信息熵计算公式:
H ( D ) = − ∑ i = 1 n P ( i ) log ⁡ 2 ( P ( i ) ) H(D)=-\sum_{i=1}^nP(i)\log_2(P(i)) H(D)=i=1nP(i)log2(P(i))
信息增益计算公式:
G a i n = Δ = H ( D ) − H ( D ∣ A ) Gain=\Delta=H(D)-H(D|A) Gain=Δ=H(D)H(DA)
优点:

  • 决策树构建速度快
  • 实现简单

缺点:

  • 计算依赖于特征数目较多的特征,而属性值最多的属性并不一定最优
  • ID3算法不是递增算法
  • ID3算法是单变量决策树,对于特征属性之间的关系不会考虑
  • 抗噪性差
  • 只适合小规模数据集,需要将数据放到内存中

2)C4.5算法
在ID3算法的基础上,进行算法优化提出的一种算法(C4.5)。现在C4.5已经是特别经典的一种决策树构造算法。C4.5使用信息增益率来取代ID3算法中的信息增益,在树的构造过程中会进行剪枝操作进行优化,能够自动完成对连续属性的离散化处理。C4.5算法在选中分割属性的时候选择信息增益率最大的属性,涉及到的公式如下。
信息熵计算公式:
H ( D ) = − ∑ i = 1 n P ( i ) log ⁡ 2 ( P ( i ) ) H(D)=-\sum_{i=1}^nP(i)\log_2(P(i)) H(D)=i=1nP(i)log2(P(i))
信息增益计算公式:
G a i n = Δ = H ( D ) − H ( D ∣ A ) Gain=\Delta=H(D)-H(D|A) Gain=Δ=H(D)H(DA)
信息增益率计算公式:
G a i n _ r a t i o ( A ) = G a i n ( A ) H ( A ) Gain\_ratio(A)=\frac{Gain(A)}{H(A)} Gain_ratio(A)=H(A)Gain(A)
优点:

  • 产生的规则易于理解
  • 准确率较高
  • 实现简单

缺点:

  • 对数据集需要进行多次顺序扫描和排序,所以效率较低
  • 只适合小规模数据集,需要将数据放到内存中

3)CART算法
使用基尼系数作为数据纯度的量化指标来构建的决策树算法就叫做CART(Classification And Regression Tree,分类回归树)算法。CART算法使用GINI增益作为分割属性选择的标准,选择GINI增益最大的作为当前数据集的分割属性。CART可用于分类和回归两类问题。CART构建是二叉树。
基尼系数计算公式:
G i n i = 1 − ∑ i = 1 n P 2 ( i ) Gini=1-\sum_{i=1}^nP^2(i) Gini=1i=1nP2(i)
GINI增益计算公式:
G a i n = Δ = G i n i ( D ) − G i n i ( D ∣ A ) Gain=\Delta=Gini(D)-Gini(D|A) Gain=Δ=Gini(D)Gini(DA)
4)ID3、C4.5、CART分类树算法总结

  • ID3和C4.5算法均只适合在小规模数据集上使用
  • ID3和C4.5算法都是单变量决策树
  • 当属性值取值比较多的时候,最好考虑C4.5算法,ID3得出的效果会比较差
  • 决策树分类一般情况只适合小数据量的情况(数据可以放内存)
  • CART算法是三种算法中最常用的一种决策树构建算法
  • 三种算法的区别仅仅只是对于当前树的评价标准不同而已,ID3使用信息增益、C4.5使用信息增益率、CART使用基尼系数
  • CART算法构建的一定是二叉树,ID3和C4.5构建的不一定是二叉树
算法支持模型树结构特征选择连续值处理缺失值处理剪枝
ID3分类多叉树信息增益不支持不支持不支持
C4.5分类多叉树信息增益率支持支持支持
CART分类、回归二叉树基尼系数、均方差支持支持支持

3、决策树的优化策略

(1)分类树和回归树的区别
分类树采用信息增益、信息增益率、基尼系数来评价树的效果,都是基于概率值进行判断的。分类树的叶子节点的预测值一般为叶子节点中概率最大的类别作为当前叶子的预测值。
在回归树中,叶子节点的预测值一般为叶子节点中所有值的均值来作为当前叶子节点的预测值。所以在回归树中一般采用MSE作为树的评价指标,即均方差。
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 MSE=\frac{1}{n}\sum_{i=1}^n(y_i-\hat{y_i})^2 MSE=n1i=1n(yiyi^)2
一般情况下,只会使用CART算法构建回归树。
决策树做回归算法的缺陷:

  • 因为预测值是使用叶子节点中所有样本的y值的均值作为预测值的,如果叶子节点中的y值分布不集中的情况下,就有可能导致预测效果不好,如果树的层次比较少的时候,模型可能存在欠拟合的问题
  • 因为预测值是使用叶子节点中所有样本的y值的均值作为预测值的,如果各个叶子节点中的值都是分段的一组数据,那么模型的预测值其实是比较分散的,不像线性回归中是一个连续的值

(2)决策树的剪枝优化
决策树过拟合一般情况是由于节点太多导致的,剪枝优化对决策树的正确率影响是比较大的,也是最基本、最常用的一种优化方式。主要分为两大类:

  • 前置剪枝:在构建决策树的过程中,提前停止。结果是决策树一般比较小,实践证明这种策略无法得到比较好的结果
  • 后置剪枝:在决策树构建好后,然后再开始裁剪,一般使用两种方式:
  1. 用单一叶子节点代替整个子树,叶节点的分类采用子树中最主要的分类
  2. 将一个子树完全替代另外一棵子树

后置剪枝的主要问题是计算效率问题,存在一定的浪费情况。

(3)后剪枝总体思路
由完全树T0 开始,剪枝部分节点得到T1 ,再次剪枝得到T2,直到仅剩树根的树Tk。在验证数据集上对这k+1个树进行评价,选择最优树Ta(损失函数最小的树)。
使用验证集选择最优子树:

  • 对于给定的决策树T0,计算所有内部非叶子节点的剪枝系数
  • 查找最小剪枝系数的节点,将其子节点进行删除操作,剪枝得到决策树Tk。如果存在多个最小剪枝系数节点,选择包含数据项最多的节点进行剪枝操作
  • 重复上述操作,直到产生的剪枝决策树Tk只有1个节点
  • 得到决策树T0、T1、T2 …Tk
  • 使用验证样本集选择最优子树Ta

(4)决策树剪枝损失函数及剪枝系数
使用验证集选择最优子树的标准,可以使用原始损失函数来考虑:
l o s s = ∑ t = 1 l e a f ∣ D t ∣ ∣ D ∣ H ( t ) loss=\sum_{t=1}^{leaf}\frac{|D_t|}{|D|}H(t) loss=t=1leafDDtH(t)
叶节点越多,决策树越复杂,损失越大。添加剪枝系数,修改后的损失函数为:
l o s s α = l o s s + α × l e a f loss_{\alpha}=loss+\alpha\times leaf lossα=loss+α×leaf
考虑根节点为r的子树,剪枝前后的损失函数分别为 l o s s ( R ) loss(R) loss(R) l o s s ( r ) loss(r) loss(r),当这两者相等的时候,可以求得剪枝系数。
l o s s α ( r ) = l o s s ( r ) + α l o s s r ( R ) = l o s s ( R ) + α × R l e a f α = l o s s ( r ) − l o s s ( R ) R l e a f − 1 \begin{aligned} loss_{\alpha}(r)&=loss(r)+\alpha \\ loss_r(R)&=loss(R)+\alpha\times R_{leaf} \\ \alpha&=\frac{loss(r)-loss(R)}{R_{leaf}-1} \end{aligned} lossα(r)lossr(R)α=loss(r)+α=loss(R)+α×Rleaf=Rleaf1loss(r)loss(R)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页