机器学习笔记:决策树(ID3,C4.5,CART)

学习资料:《统计学习方法》,《机器学习》(周志华),韩小阳ppt,邹博ppt。

决策树是一种树形结构,对实例进行分类和回归的,下面主要说的是用来进行分类,最后说道CART的时候也会说到决策树用到回归问题上。

1、决策树模型与学习

先给出分类决策树模型定义:是一种对实例数据进行分类的树形结构,由节点和有向边组成,而节点分为内部节点和叶节点。内部节点为特征,叶子节点为分类结果,有向边则根据特征将数据集进行划分。

举个妈妈为女儿相亲的例子。妈妈收集了很多相亲的例子,女方会根据男方的特征判断会不会去相亲,最后得到了下面的关于是否去相亲的模型(该例子和图来自与韩小阳制作的ppt)。

机器学习笔记:决策树(ID3,C4.5,CART)_第1张图片

上面的树即为分类决策树模型,而妈妈根据以往的很多数据然后学习得到该模型的过程则是分类决策树的学习过程,而上图左侧的谈话则是根据已有的树模型对新数据进行预测。好了,现在给出标准的决策树的学习定义。

决策树学习:假设给定训练数据集

D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} D={(x1,y1),(x2,y2),...,(xn,yn)}

其中 x i = ( x i 1 , x i 2 , . . . , x i m ) x_i=(x_i^1,x_i^2,...,x_i^m) xi=(xi1,xi2,...,xim)为输入实例(特征向量,共m个特征), y = { 1 , 2 , ⋯   , K } y=\{1,2,\cdots,K\} y={1,2,,K}表示类别。学习的目标就是根据给定的数据集构建一个决策树模型,使得能够对实例进行正确的分类。

注意:得到的树模型会有无穷多个,学习算法得到的不是最优的而是次优的(选取最优的是个NP问题)。

决策树学习算法有3部分构成:

  1. 特征选择
  2. 决策树的生成
  3. 决策树的剪枝

下面来分别讲述

2、特征选择

假设现在有银行贷款申请样本数据集,我们需要根据该数据集进行决策树的学习从而得到分类决策树模型。

机器学习笔记:决策树(ID3,C4.5,CART)_第2张图片

通常的做法是:从根节点开始,选一个最优的特征作为根节点,根据特征值的不同对数据集进行分割,对分割产生的子节点,再递归的进行分割,直到所有实例都属于同一类别,或者没有特征可选了那就把当前节点作为叶节点。

图中可以看到有4个特征,那么把哪个特征作为根节点,然后来进行划分呢?答案是使用信息增益最大的那个特征。下面介绍信息增益

2.1、信息增益

为了便于说明,先给出熵和条件熵的定义

:随机变量不确定性的表现。设X是一个取值个数有限的随机变量,概率分布为 P ( X = x i ) = p i , i = 1 , 2 , … , n P(X=x_i)=p_i,i=1,2,\dots,n P(X=xi)=pi,i=1,2,,n。那么随机变量X的是熵定义为

H ( X ) = − ∑ i = 1 n p i ⋅ l o g p i H(X) = -\sum\limits_{i=1}^{n}p_i\cdot log{p_{i}} H(X)=i=1npilogpi

通常底数为2或者 e e e,式子中可以发现结果与X无关,仅与X的分布有关,所以表示成 H ( p ) = − ∑ i = 1 n p i ⋅ l o g p i H(p)=-\sum\limits_{i=1}^{n}p_i\cdot log{p_{i}} H(p)=i=1npilogpi,显然是个大于等于0的数。值越大那么不确定性越大,相反,如果结果是0那么结果就是确定的。举个例子,假设X是0-1分布, P ( X = 0 ) = p P(X=0)=p P(X=0)=p,那么熵 H ( p ) = − ( p l o g p + ( 1 − p ) l o g ( 1 − p ) ) H(p)=-(plogp+(1-p)log(1-p)) H(p)=(plogp+(1p)log(1p))。当 p = 0 p=0 p=0时, H ( p ) = 0 H(p)=0 H(p)=0也就是结果是确定的,直观上确实是这样,因为0事件不可能发生,结果只会是1事件。下面给出 H ( P ) H(P) H(P)随着 p p p的变化图。

机器学习笔记:决策树(ID3,C4.5,CART)_第3张图片

p = 0.5 p=0.5 p=0.5的时候熵最大,直观上容易理解,说明0,1等可能发生,结果是最难预测的。

设随机变量(X,Y),联合概率分布为
P ( X = x i , Y = y j ) = p i j , i = 1 , 2 , … , n ; j = 1 , 2 , … , m P(X=x_i,Y=y_j)=p_{ij},i=1,2,\dots,n;j=1,2,\dots,m P(X=xi,Y=yj)=pij,i=1,2,,n;j=1,2,,m
给出条件熵 H ( Y ∣ X ) H(Y|X) H(YX)定义如下

条件熵:条件熵 H ( Y ∣ X ) H(Y|X) H(YX)表示在已知随机变量 X X X的条件下,随机变量 Y Y Y的不确定性。定义为 X X X给定条件下 Y Y Y的条件概率分布的熵对X的数学期望。

H ( Y ∣ X ) = ∑ i = 1 n p i ⋅ H ( Y ∣ X = x i ) H(Y|X)=\sum\limits_{i=1}^{n}p_i\cdot H(Y|X=x_i) H(YX)=i=1npiH(YX=xi)

其中 p i = P ( X = x i ) , i = 1 , 2 , . . . , n p_i=P(X=x_i),i=1,2,...,n pi=P(X=xi),i=1,2,...,n

信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。

信息增益:特征A对训练数据集D的信息增益表示为 g ( D , A ) g(D,A) g(D,A),定义为集合D的经验熵 H ( D ) H(D) H(D)与特征A给定条件下D的条件熵 H ( D ∣ A ) H(D|A) H(DA)之差,也可叫做互信息。

g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

H ( D ) H(D) H(D)表示对数据集进行分类的不确定性。而条件熵 H ( D ∣ A ) H(D|A) H(DA)表示在特征A给定的条件下对数据集D进行分类的不确定性,之差表示不确定性在A特征下减少的程度。

对于决策树问题下面给出具体的计算过程。(PS:太难抄了,直接网上copy图了)

机器学习笔记:决策树(ID3,C4.5,CART)_第4张图片

现在解决上面的问题,使用哪个特征作为根节点,假设4个特征依次记为 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1,A2,A3,A4,分别计算 g ( D , A 1 ) , g ( D , A 2 ) , g ( D , A 3 ) , g ( D , A 4 ) g(D,A_1),g(D,A_2),g(D,A_3),g(D,A_4) g(D,A1),g(D,A2),g(D,A3),g(D,A4)取最大者对应的特征作为根节点,直观上解释就是使用该特征作为根节点能减少的分类不确定性程度最大,即分类确定性更大了。

2.1、信息增益比

使用信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。现在使用信息增益比来进行校正。

信息增益比:特征A对训练数据集D的信息增益表示为 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集D关于特征A的熵 H A ( D ) H_A(D) HA(D)之比,即:

g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)

其中 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ D l o g 2 D i D , n 是 特 征 A 取 值 的 个 数 H_A(D)=-\sum\limits_{i=1}^{n} \frac{|D_i|}{D}log_2\frac{D_i}{D},n是特征A取值的个数 HA(D)=i=1nDDilog2DDi,nA

现在特征选择的方法有了,即使用信息增益和信息增益比,基于这两种选择准则,对应了决策树的生成方法ID3和C4.5,其实关于如果生成上面也大致说过了,也就是从根节点开始,选一个最优的特征作为根节点,根据特征值的不同对数据集进行分割,对分割产生的子节点,再递归的进行分割,直到所有实例都属于同一类别,或者没有特征可选了那就把当前节点作为叶节点。

3、决策树的生成

决策树的生成算法,这里说的是分类树,包括基于信息增益准则的ID3算法和基于信息增益比的C4.5算法。

3.1、ID3算法生成决策树

ID3算法是基于信息增益来进行特征选择的,从根节点开始,使用信息增益最大值所对应的特征A来进行划分,比如对于上面的例子来说根节点使用 A 4 A_4 A4是否有房子来进行划分,这样就形成了两个分支,一个分支节点是有房子的集合,另一个分支是没房子的集合,然后递归的进行这样的操作,直到所有实例都属于同一类或者没有特征可以划分了,最后形成决策树。具体如下

ID3算法
输入:训练数据集 D D D,特征集 A A A,阈值 α \alpha α
输出:决策树 T T T

  1. 如果 D D D中所有实例都属于同一类 C k C_k Ck,将T作为单节点树(叶节点),将类 C k C_k Ck作为该节点的类标记,返回 T T T
  2. 如果特征已经空了,将T作为单节点树(叶节点),将 D D D中实例数最大的类 C k C_k Ck作为该节点的类标记,返回 T T T
  3. 否则,按照前面所说的计算各个特征 A A A D D D的信息增益,选择信息增益最大的特征 A g A_g Ag
    3.1 如果 A g < α A_g<\alpha Ag<α,将T作为单节点树(叶节点),那么将 D D D中实例数最大的类 C k C_k Ck作为该节点的类标记,返回 T T T
    3.2 否则,对 A g A_g Ag中的每种可能取值 a i a_i ai,根据 A g = a i A_g=a_i Ag=ai进行分割,分割得到若干非空子集 D i D_i Di,记为子节点 T i T_i Ti,对每个子节点 i i i,以为 D i D_i Di为训练集,以为 A − A g A-{A_g} AAg为特征集,回退到第一步,继续执行(是个递归过程),返回 T i T_i Ti

3.2、C4.5算法生成决策树

C4.5算法跟ID3算法过程基本一致,只是使用了信息增益比代替了ID3算法的信息增益,这里就不重复了。

4、决策树剪枝

决策树生成的算法中可以看到,从根节点开始一步步往下细分,最后生成的树会较为复杂,对训练数据的预测效果会很好,但是对新数据预测效果就没那么准确了,也就是产生了过拟合现象。那么我们需要让这个较复杂的树变的简单点,也就是对生成的决策树进行剪枝。具体的就是从已生成的决策树中,裁剪掉一些叶子节点或者子树,并将其父节点作为新的叶子节点,从而简化分类树模型。

下面介绍后剪枝(还有一种叫预剪枝,参考西瓜书)

剪枝策略是通过极小化决策树的损失函数来实现的。下面介绍带正则化项的损失函数
设树T的叶节点个数为 ∣ T ∣ |T| T, t是树T的叶节点,该叶节点有 N t N_t Nt个样本点,其中 k k k类的样本点有 N t k , k = 1 , 2 , . . . , K N_{tk},k=1,2,...,K Ntkk=1,2,...,K 个, H t ( T ) H_t(T) Ht(T)为叶节点t上的经验熵,则决策树的损失函数定义如下:

C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_\alpha (T) = \sum\limits_{t=1}^{|T|}N_tH_t(T)+\alpha |T| Cα(T)=t=1TNtHt(T)+αT

其中 H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T)=-\sum\limits_{k}\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=kNtNtklogNtNtk,那么写到一起就是

C α ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k l o g N t k N t + α ∣ T ∣ = C ( T ) + α ∣ T ∣ C_\alpha (T)=-\sum\limits_{t=1}^{|T|}\sum\limits_{k=1}^{K}N_{tk}log\frac{N_{tk}}{N_t}+\alpha |T|=C(T)+\alpha|T| Cα(T)=t=1Tk=1KNtklogNtNtk+αT=C(T)+αT

剪枝的目标是极小化损失函数,当 α \alpha α确定的时候,叶子节点越多模型越复杂,则正则化项目 α ∣ T ∣ \alpha |T| αT就越大了,即惩罚越大。下面粗略给出剪枝算法(书上写的看的不是很明白,可以参考西瓜书,写的较清楚)

后剪枝算法

输入:生成算法生成的树T,参数 α \alpha α
输出:剪枝后的树 T α T_\alpha Tα

  1. 计算每个节点(叶子节点?)的经验熵。
  2. 从最下层叶子节点进行回溯,退到了父节点,进行如下计算
    2.1、剪枝前整体的树的损失函数值 C α ( T A ) C_\alpha (T_A) Cα(TA)
    2.2、假设将该父节点为根节点的子树剪掉,同时替换原来父节点位置为叶子节点(比如原来的 结果是3个a类,1个b类,那我们选择替换的就是a类,即该叶子节点标记为a类),同时计算整体树的损失函数值 C α ( T B ) C_\alpha(T_B) Cα(TB)
    2.3、如果 C α ( T B ) < C α ( T A ) C_\alpha(T_B)<C_\alpha (T_A) Cα(TB)<Cα(TA),那么2.2的替换成功,确定进行2.2的剪枝和替换。

3、回到第一步,继续进行,直到没法再剪枝,得到损失函数最小的子树 T α T_\alpha Tα

5、CART算法

CART(分类与回归树,假设树是二叉树)模型即可以用来进行分类,也可以用来进行回归。同样包括了特征的选择,树的生成和剪枝过程。下面会分别介绍

5.1、CART 回归树的特征选择和生成

回归指的是数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} D={(x1,y1),(x2,y2),...,(xn,yn)} 中的 Y Y Y是连续变量,我们考虑生成回归树模型。假设已经输入空间划分成了 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,每块区域对应一个值 c m c_m cm,那么回归树模型表示为:

f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum\limits_{m=1}^{M}c_mI(x \in R_m) f(x)=m=1McmI(xRm)

空间划分确定了,学习目标就是最小化数据的预测误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum\limits_{x_i \in R_m}(y_i-f(x_i))^2 xiRm(yif(xi))2,从而得到每块区域上的最优值 c m c_m cm,对应的是该区域的均值

c m = a v e ( y i ∣ x i ∈ R m ) c_m=ave(y_i|x_i \in R_m) cm=ave(yixiRm)
现在 c m c_m cm也得知了,最后我们需要知道如果进行空间划分,具体点就是,选择哪个特征 J J J,选择这个特征的切分的 s s s(一次切分就分成了两块区域 R 1 ( j , s ) , R 2 ( j , s ) R_1(j,s),R_2(j,s) R1(j,s),R2(j,s)),很自然的想到,每次划分(根节点开始)应该选择的特征和切分点应满足

min ⁡ [ ∑ x i ∈ R 1 ( J , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 1 ( J , s ) ( y i − c 2 ) 2 ] \min [\sum\limits_{x_i \in R_1(J,s)}(y_i-c_1)^2+\sum\limits_{x_i \in R_1(J,s)}(y_i-c_2)^2] min[xiR1(J,s)(yic1)2+xiR1(J,s)(yic2)2]

R 1 ( j , s ) = { x ∣ x j < = s } , R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s)=\{x|x^j<=s\},R_2(j,s)=\{x|x^j>s\} R1(j,s)={xxj<=s},R2(j,s)={xxj>s}

以及 c 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) , c 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) c_1=ave(y_i|x_i \in R_1(j,s)),c_2=ave(y_i|x_i \in R_2(j,s)) c1=ave(yixiR1(j,s)),c2=ave(yixiR2(j,s))

具体的,假设拿根节点开始,遍历所有的j,然后找到切分的s,从而构成一个对 ( j , s ) (j,s) (j,s),这样就形成了两块区域,后面在这两块区域进行同样的操作。具体的算法描述如下(最小二乘回归树生成算法)

最小二乘回归树生成算法

输入:训练集 D D D
输出:回归树 f ( x ) f(x) f(x)

1.选择最优切分变量 j j j和切分点 s s s
求解 min ⁡ [ ∑ x i ∈ R 1 ( J , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 1 ( J , s ) ( y i − c 2 ) 2 ] \min [\sum\limits_{x_i \in R_1(J,s)}(y_i-c_1)^2+\sum\limits_{x_i \in R_1(J,s)}(y_i-c_2)^2] min[xiR1(J,s)(yic1)2+xiR1(J,s)(yic2)2]
具体地,遍历 j j j,对固定的切分变量 j j j扫描切分点 s s s,选择使得上述式子达到最小的对 ( j , s ) (j,s) (j,s)
2. 用 1 1 1产生的 ( j , s ) (j,s) (j,s)划分区域并决定相应的输出值:
R 1 ( j , s ) = { x ∣ x j < = s } , R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s)=\{x|x^j<=s\},R_2(j,s)=\{x|x^j>s\} R1(j,s)={xxj<=s},R2(j,s)={xxj>s}
c 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) , c 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) c_1=ave(y_i|x_i \in R_1(j,s)),c_2=ave(y_i|x_i \in R_2(j,s)) c1=ave(yixiR1(j,s)),c2=ave(yixiR2(j,s))

3.重复步骤1,2直至满足条件为止
4.经过以上步骤将空间划分成M个区域 R 1 , . . . , R M R_1,...,R_M R1,...,RM,从而得到回归树模型 f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum\limits_{m=1}^{M}c_mI(x \in R_m) f(x)=m=1McmI(xRm)

5.2、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\limits_{k=1}^{K}p_k(1-p_k)=1-\sum\limits_{k=1}^{K}p_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
对于给定样本 D D D,那么基尼指数为
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum\limits_{k=1}^{K}(\frac{|C_k|}{|D|})^2 Gini(D)=1k=1K(DCk)2,
其中 ∣ C k ∣ |C_k| Ck表示属于第k类的实例数量, G i n i ( D ) Gini(D) Gini(D)的值越大那么不确定性越大

前面已经说了CART是二叉树,所以每个节点最多只有两个分支,比如根据特征A的取值是否为a而被分成了两个子集 D 1 , D 2 D_1,D_2 D1,D2,则在特征A的条件下,集合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(D1)+\frac{|D_2|}{D}Gini(D2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

G i n i ( D , A ) Gini(D,A) Gini(D,A) 表示经 A = a A=a A=a的分割后集合D的不确定性,这些定义似乎与熵很类似。

生成算法

算法和ID3极为类似,主要区别就在于生成的是二叉树,所以选取特征的时候,需要对特征 j j j的各个值 a a a分为是和否来进行划分,划分成 D 1 , D 2 D_1,D_2 D1,D2后再分别在 D 1 , D 2 D_1,D_2 D1,D2上做同样的操作,具体的就不写了 。

CART剪枝

感觉不是能理解的很清晰,下面就给出邹博老师关于这部分ppt

机器学习笔记:决策树(ID3,C4.5,CART)_第5张图片
机器学习笔记:决策树(ID3,C4.5,CART)_第6张图片

你可能感兴趣的:(机器学习)