机器学习——分类算法之决策树

前言

主要涉及ID3决策树、C4.5决策树、CART决策树、决策树的剪枝、连续值和缺失值的处理。

决策树是基于树结构来进行决策的,一般的一颗决策树包含一个根结点、若干个内部结点和若干个叶结点。叶结点对应于决策结果,其他每个结点则对应于一个属性测试,每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集。

决策树的工作原理和我们平时做决定时所采用的的机制是很相似的,也就是根据一堆if、else规则来进行判断,不同的判断条件也就构成了不同的模型。

决策树的学习目的是为了产生一颗泛化能力强的决策树,为了达到此目的,最重要的环节包括属性的划分、决策树的剪枝。

属性划分的要求、目标:希望决策树的分支结点点所包含的样本尽可能属于同一类别,即结点的纯度越来越高。

那么基于上面的学习目标,产生了三种划分属性的度量指标:信息增益、增益率、基尼指数。

1、信息熵

“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标,代表一个系统中蕴含多少信息量,信息量越大表明一个系统的不确定性就越大,就存在越多的可能性,即信息熵大。

下面开始推导ID3算法。

假定当前样本集合D中第k类样本所占的比例为Pk(k=1,2,...,y)P_{k}(k=1,2,...,|y|),则D的信息熵为:
Ent(D)=k=1yPklog2Pk(1)Ent(D)= -\sum_{k=1}^{|y|}P_{k}log_{2}P_{k}\tag{1}
其中,|y|表示样本类别总数,PkP_{k}表示第k类样本所占的比例,且0Pk1,k=1nPk=10\leq P_{k}\leq 1,\sum_{k=1}^{n}P_{k}=1Ent(D)值越小,纯度越高。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
举例说明式(1):
假设当前数据集有5个样本D={x1,x2,x3,x4,x5}D = \{x_{1},x_{2},x_{3},x_{4},x_{5}\},其标签为分别为{0,0,1,2,2}(三类,k=1,2,3),那么每一类所占比为P1=2/5,P2=1/5,P3=2/5P_{1} = 2 / 5 ,P_{2} = 1 / 5,P_{3} = 2 / 5,则此时的信息熵为:
Ent(D)=k=13Pklog2Pk=P1log2P1P2log2P2P3log2P3=25log225+15log215+25log225Ent(D)=-\sum_{k =1}^{3}P_{k}log_{2}P_{k}=-P_{1}log_{2}P_{1}-P_{2}log_{2}P_{2}-P_{3}log_{2}P_{3}\\=-\frac{2}{5}log_{2}\frac{2}{5}+-\frac{1}{5}log_{2}\frac{1}{5}+-\frac{2}{5}log_{2}\frac{2}{5}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

上面说了“Ent(D)值越小,纯度越高”,那么这个程度该怎样量化呢?就是说什么样的样本可以说是程度高?什么样的样本可以说是纯度低?下面通过求解信息熵的最大值和最小值来说明这个问题。
+++++++++++++++++++++++++++++++++++++证明信息熵的取值范围+++++++++++++++++++++++++
证明式:
0Ent(D)log2y(2)0\leq Ent(D)\leq log_{2}|y|\tag{2}

1、首先求Ent(D)的最大值:
若令y=n,Pk=xk|y|=n,P_{k}=x_{k},那么信息熵Ent(D)就可以看做一个n元实值函数,也即:
Ent(D)=f(x1,x2,...,xn)=k=1nxklog2xk(3)Ent(D)=f(x_{1},x_{2},...,x_{n})=-\sum_{k=1}^{n}x_{k}log_{2}x_{k}\tag{3}
其中,0xk1,k=1nxk=10\leq x_{k}\leq1,\sum_{k=1}^{n} x_{k}=1

所以,此时若想求信息熵的最大值,等价于求n元实值函数f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})的最大值,也就是将原求信息熵的最大值转成了求多元实值函数求最值的问题,并且对于每一个xkx_{k}都要满足约束0xk1,k=1nxk=10\leq x_{k}\leq1,\sum_{k=1}^{n} x_{k}=1,即求有约束的最大值问题。

如果不考虑约束0xk10\leq x_{k}\leq1,仅考虑k=1nxk=1\sum_{k=1}^{n} x_{k}=1的话,对f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})求最大值等价于如下最小化问题:
min k=1nxklog2xk(4)min\ \sum_{k=1}^{n}x_{k}log_{2}x_{k}\tag{4}
s.t. k=1nxk=1(5)s.t.\ \sum_{k=1}^{n}x_{k}=1\tag{5}
很明显上面的目标函数(4)是凸函数(结合x的取值范围和目标函数的二阶导数恒大于0),并且其约束条件(5)明显是线性函数,所以该问题就是凸优化问题。

显然,对于0xk10\leq x_{k}\leq1时,该问题为凸优化问题,而对于凸优化问题来说,满足KKT条件的点即为最优解。由于此最小化问题仅含等式约束,那么能另其拉格朗日函数的一阶偏导数等于0的点即为满足KKT条件的点。

由上面红色字体的分析,根据拉格朗日乘子法,该优化问题的拉格朗日函数为:
L(x1,x2,...,xn,λ)=k=1nxklog2xk+λ(k=1nxk1)(6)L(x_{1},x_{2},...,x_{n},\lambda) =\sum_{k=1}^{n}x_{k}log_{2}x_{k}+\lambda (\sum_{k=1}^{n}x_{k}-1)\tag{6}
对上面拉格朗日函数分别关于x1,...,xn,λx_{1},...,x_{n},\lambda求一阶偏导数,并令偏导数等于0

首先x1x_{1}求偏导,并令其等于0:
L(x1,x2,...,xn)x1=x1[k=1nxklog2xk+λ(k=1nxk1)]=log2x1+x11x1ln2+λ=log2x1+1ln2+λ=0(7)\frac{\partial L(x_{1},x_{2},...,x_{n})}{\partial x_{1}}=\frac{\partial }{\partial x_{1}}[\sum_{k=1}^{n}x_{k}log_{2}x_{k}+\lambda (\sum_{k=1}^{n}x_{k}-1)]=log_{2}x_{1}+x_{1\cdot \frac{1}{x_{1}ln2}}+\lambda \\=log_{2}x_{1}+\cdot \frac{1}{ln2}+\lambda =0\tag{7}
所以可得λ\lambda:
λ=log2x11ln2(8)\lambda = -log_{2}x_{1}-\frac{1}{ln2}\tag{8}

同理,当令剩下的x2,..xnx_{2},..x_{n}的导数为0时,求出的lambdalambda都类似于式(8),这里就不一一求了,即:
λ=log2x11ln2=log2x21ln2=...=log2xn1ln2(9)\lambda = -log_{2}x_{1}-\frac{1}{ln2}=-log_{2}x_{2}-\frac{1}{ln2}=...=-log_{2}x_{n}-\frac{1}{ln2}\tag{9}
然后对式(6)中的λ\lambda求偏导:
L(x1,x2,...,xn)λ=λ[k=1nxklog2xk+λ(k=1nxk1)]=0(10)\frac{\partial L(x_{1},x_{2},...,x_{n})}{\partial \lambda}=\frac{\partial }{\partial \lambda}[\sum_{k=1}^{n}x_{k}log_{2}x_{k}+\lambda (\sum_{k=1}^{n}x_{k}-1)]=0\tag{10}
由式(10)可得:
k=1nxk=1(11)\sum_{k=1}^{n}x_{k}=1\tag{11}
所以根据式(9)和(11)可得该最小化问题的最优解
x1=x2=...=xn=1n(12)x_{1}=x_{2}=...=x_{n}=\frac{1}{n}\tag{12}
又因为xkx_{k}还需要满足约束0xk10\leq x_{k}\leq 1,显然01n10\leq \frac{1}{n}\leq 1,所以x1=x2=...=xnx_{1}=x_{2}=...=x_{n}是满足所有约束的最优解,也即为当前最小化问题的最小值点,同时也是f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})的最大值点。
x1,x2,...,xn=1nx_{1},x_{2},...,x_{n}=\frac{1}{n}带入f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})中可得:
f(1n,...,1n)==k=1n1nlog21n=n1nlog21n=log2n(13)f(\frac{1}{n},...,\frac{1}{n})==\sum_{k=1}^{n}\frac{1}{n}log_{2}\frac{1}{n}=-n\cdot \frac{1}{n}log_{2}\frac{1}{n}=log_{2}n\tag{13}

证明完了信息熵的最大值,现在给出一个总结:
f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})在满足约束0xk1,k=1nxk=10\leq x_{k}\leq1,\sum_{k=1}^{n} x_{k}=1时的最大值为log2nlog_{2}n
关于信息熵的取值范围已经给出证明,当信息熵取值最大时,表明信息是最不纯的,那么最不纯的时候有什么表现呢,即当信息熵取值最大时,样本有什么样的表现呢?
我们知道xkx_{k}表示的就是第k类样本在集合中所占比例,观察式(12),当信息熵值最大时,xkx_{k}均相等,也即PkP_{k}均相等。也就是说,此时样本集合中的各类样本式均匀分布的,那么这时候样本集合的纯度就是最低的时候。


2、现在开始证明信息熵Ent(D)的最小值

如果不考虑约束k=1nxk=1\sum_{k=1}^{n}x_{k}=1,仅考虑0xk10\leq x_{k}\leq 1的话,由式(3),可知f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})可以看做是n个互不相关的一元函数的加和,也即:
f(x1,x2,...,xn)=k=1ng(xk)(14)f(x_{1},x_{2},...,x_{n})=\sum_{k=1}^{n}g(x_{k})\tag{14}
其中,g(xk)=k=1nxklog2xk,0xk1g(x_{k})=-\sum_{k=1}^{n}x_{k}log_{2}x_{k},0\leq x_{k}\leq 1

那么当g(x1),g(x2),,...,g(xn)g(x_{1}),g(x_{2}),,...,g(x_{n})分别取到其最小值时,f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})也就取到了最小值。

由于g(x1),g(x2),,...,g(xn)g(x_{1}),g(x_{2}),,...,g(x_{n})定义域和函数表达式均相同,所以只需求出g(x1)g(x_{1})的最小值也就求出了g(x1),g(x2),,...,g(xn)g(x_{1}),g(x_{2}),,...,g(x_{n})的最小值。

下面考虑求g(x1)g(x_{1})的最小值:
首先,对g(x1)g(x_{1})关于x1x_{1}求一阶和二阶导数:

g,(x1)=d(x1log2x1)dx1=log2x1x11x2ln2=log2x11ln214)(()g^{,}(x_{1})=\frac{d(-x_{1}log_{2}x_{1})}{dx_{1}}=-log_{2}x_{1}-x_{1 }\cdot\frac{1}{x_{2}ln2}=-log_{2}x_{1}-\frac{1}{ln2}\tag(14)
g,,(x1)=d(g,(x1))dx1=d(log2x11ln2)dx1=1x1ln2(15)g^{,,}(x_{1})=\frac{d(g^{,}(x_{1}))}{dx_{1}}=\frac{d(-log_2x_1-\frac{1}{ln2})}{dx_{1}}=-\frac{1}{x_{1}ln2}\tag{15}

显然,当0xk10\leq x_{k}\leq 1时,所以g(x1)g(x_{1})的二阶导小于0,所以g(x1)g(x_{1})是一个在其定义域范围内开口向下的凹函数,那么其最小值必然在边界取,于是分别取x1=0x1=1x_{1}=0和x_{1}=1带入到g(x1)g(x_{1})可得:
g(0)=0log20=0g(1)=1log21=0(16)g(0)=-0log_{2}0=0 \\ g(1)=-1log_{2}1=0\tag{16}

所以g(x1)g(x_1)的最小值为0,同理可得g(x2),g(x3),...,g(xn)g(x_{2}),g(x_{3}),...,g(x_{n})的最小值也为0,那么f(x1,x2,...,xn)f(x_{1},x_{2},...,x_{n})的最小值此时也为0。

但是此时仅考虑0xk10\leq x_{k}\leq1时取到的最小值,若考虑约束k=1nxk=1\sum_{k=1}^{n} x_{k}=1的话,那么(x1,x2,...,xn)(x_{1},x_{2},...,x_{n})的最小值一定大于等于0。(此时两个约束都考虑) 如果令某个xk=1x_{k}=1,那么根据约束k=1nxk=1\sum_{k=1}^{n} x_{k}=1可知x1=x2=...=xk1=xk+1=...=xn=0x_{1}=x_{2}=...=x_{k-1}=x_{k+1}=...=x_{n}=0将其带入式(3)中可得:
f(0,0,...,0,1,0,...,0)=0log200log20...0log201log210log20,...,0log20=0(17)f(0,0,...,0,1,0,...,0)=-0log_{2}0-0log_{2}0-...-0log_{2}0-1log_{2}1-0log_{2}0-,...,-0log_{2}0=0\tag{17}

所以xk=1,x1=x2=...=xk1=xk+1=...=xn=0x_{k}=1,x_{1}=x_{2}=...=x_{k-1}=x_{k+1}=...=x_{n}=0一定是f(x1,x2,...,fn)f(x_{1},x_{2},...,f_{n})在满足约束0xk1,k=1nxk=10\leq x_{k}\leq1,\sum_{k=1}^{n} x_{k}=1的条件下的最小值点,其最小值为0。

证明完了信息熵的最大值,现在给出一个总结: 当样本的信息熵等于0的时候,样本的纯度是最高的,那么纯度最高时样本有什么样的特性呢? 由信息熵最小值的推导过程可知,当信息熵最小时,某个样本$x_{k}=1$,其他的等于0,而$x_{k}$表示得到就是$P_{k}$,这就说明该样本集合中仅仅只包含一类样本(k类),那么很显然,这时候的纯度就是最高的

+++++++++++++++++信息熵的最大值、最小值证明完毕,以及最取最大值和最小值时样本的特征也已说明+++++++++

2、条件熵

什么是条件熵?
答:通俗地说,可以理解为 在知道一些已知条件下,计算出来的信息熵。

条件熵的定义:在已知样本属性a的取值情况下,度量样本集合纯的一种指标

H(Da)=v=1VDvDEnt(Dv)(17)H(D|a)=\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})\tag{17}

上式中关于各个变量一定要搞懂!其中,a表示样本的某个属性,假定属性a由V个可能的取值{a1,a2,...,aV}\{a^{1},a^{2},...,a^{V}\},样本集合D中在属性a上取值为ava^{v}的样本记为DvD^{v}Ent(Dv)Ent(D^{v})表示样本集合DvD^{v}的信息熵。H(Da)H(D|a)值越小,纯度越高。

ID3算法

现在知道了信息熵和条件熵了,那么就可以定义ID3算法了。

ID3决策树是以信息增益为准则来划分属性的决策树。

信息增益:
Gain(D,a)=Ent(D)v=1VDvDEnt(Dv)=Ent(D)H(Da)(18)Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})=Ent(D)-H(D|a)\tag{18}
观察上式(18),信息增益就等于信息熵减去条件熵,得出来的差值就表示样本集合纯度的提升度。为什么这么说?因为信息熵表示的是没有任何已知条件下,计算出来的样本的纯度;而条件熵是在知道一些一直条件下算出来的集合的纯度,那么他们的差值就表示:在知道一些已知条件情况下,纯度得到的提升
选择信息增益值最大的属性作为划分属性,因为信息增益越大,则意味着使用该属性来进行划分所获得的“纯度提升”越大。


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
下面举个具体例子来实现ID3算法(来自西瓜书)。
以下面的西瓜数据集来学习一棵没剥开的是不是好瓜的决策树,显然|y|=2。
在这里插入图片描述
观察上面数据集,其中“是好瓜”的视为正例,“不是好瓜”视为负例,其中正例占p1=817p_{1}=\frac{8}{17},反例占p2=917p_{2}=\frac{9}{17}
于是根据式(1)可计算出根节点的信息熵:
Ent(D)=k=12pklog2pk=(817log2817+917log2917)=0.998Ent(D)=-\sum_{k=1}^{2}p_{k}log_{2}p_{k}=-(\frac{8}{17}log_{2}\frac{8}{17}+\frac{9}{17}log_{2}\frac{9}{17})=0.998
然后分别计算出当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益。
以"色泽"为例,它有3个可能的取值:{青绿,乌黑,浅白},若使用该属性对D进行划分,则可得到3个子集,分别记为:D1(=绿)D^{1}(色泽=青绿)D2(=)D^{2}(色泽= 乌黑)D3(=)D^{3}(色泽= 浅白)
那么按照这三个子集,可将原数据集分成如下三个部分:子集D1D^{1}包含编号为{1,4,6,10,1317}的6个样例,其中正例占p1=36p_{1}=\frac{3}{6},反例占p2=36p_{2}=\frac{3}{6};D2D^{2}包含编号为{2,3,7,8,9,15}的6个样例,其中正、反例分别占p1=46p2=26p_{1}=\frac{4}{6},p_{2}=\frac{2}{6};D3D^{3}包含编号为{5,11,12,14,16}的五个样例,其中正、反例分别占p1=15,p2=45p_{1}=\frac{1}{5},p_{2}=\frac{4}{5}
计算用“色泽”划分之后所获得的3个分支节点的信息熵为:
Ent(D1)=(36log236+36log236)=1.00Ent(D^{1})=-(\frac{3}{6}log_{2}\frac{3}{6}+\frac{3}{6}log_{2}\frac{3}{6})=1.00
Ent(D2)=(46log246+26log226)=0.918Ent(D^{2})=-(\frac{4}{6}log_{2}\frac{4}{6}+\frac{2}{6}log_{2}\frac{2}{6})=0.918
Ent(D3)=(15log215+45log245)=0.722Ent(D^{3})=-(\frac{1}{5}log_{2}\frac{1}{5}+\frac{4}{5}log_{2}\frac{4}{5})=0.722
然后,根据式(18)可计算出属性“色泽”的信息增益为:
Gain(D,)=Ent(D)v=13DvDEnt(Dv)=0.998(617×Ent(D1)+617×Ent(D2)+517×Ent(D3))=0.998(617×1.000+617×0.918+517×0.722)=0.109Gain(D,色泽)=Ent(D)-\sum_{v=1}^{3}\frac{|D^{v}|}{|D|}Ent(D^{v})\\=0.998-(\frac{6}{17}\times Ent(D^{1}) +\frac{6}{17} \times Ent(D^{2})+\frac{5}{17}\times Ent(D^{3}) )\\=0.998-(\frac{6}{17}\times1.000+\frac{6}{17} \times 0.918+\frac{5}{17}\times 0.722 )=0.109
类似的,可计算出其他属性的信息增益:
Gain(D,)=0.143 Gain(D,)=0.141; Gain(D,)=0.381 Gain(D,)=0.289 Gain(D,)=0.006Gain(D,根蒂)=0.143;\ Gain(D,敲声)=0.141;\ Gain(D,纹理)=0.381;\ Gain(D,脐部)=0.289;\ Gain(D,触感)=0.006
对比上面求出的所有属性的信息增益,属性“纹理”的信息增益最大,所以它被选为划分属性,下图是基于“纹理”对根节点进行划分的结果:
在这里插入图片描述
然后,决策树学习算法将对每个分支节点做进一步划分,以上图中第一个分直节点(“纹理=清晰”)为例,该节点包含的样例集合D1D^{1}中有编号{1,2,3,4,5,6,8,10,15}的9个样例,可用属性集合为{色泽,根蒂,敲声,脐部,触感}。基于D1D^{1}计算出各属性的信息增益:
Gain(D1,)=0.043; Gain(D1,)=0.458 Gain(D1,)=0.331; Gain(D1,)=0.458 Gain(D1,)=0.458Gain(D^{1},色泽)=0.043;\ Gain(D^{1},根蒂)=0.458;\ Gain(D^{1},敲声)=0.331;\ Gain(D^{1},脐部)=0.458;\ Gain(D^{1},触感)=0.458
“根蒂”、“脐部”、“触感”3个属性均取得了最大的信息增益,可选其中之一作为划分属性(注意:叶节点就是当前属性的特征全部属于一类,即全部属于正例或全部属于负例,例如下图中的属性根蒂的两个特征:蜷缩和硬挺)。类似的,对每个分支节点进行上述操作,最终得到的决策树如下:
在这里插入图片描述

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C4.5决策树

ID3算法没有考虑连续特征,也没有考虑缺失值的问题。
使用信息增益来进行属性的划分会存在一个缺陷:以信息增益为准则的ID3决策树对可取值数目较多的属性有所偏好
下面就用数学来说明上述问题:
信息熵增益:
Gain(D,a)=Ent(D)v=1VDvDEnt(Dv)=Ent(D)v=1VDvD(k1ypklog2pk)=Ent(D)v=1VDvD(k=1yDkvDvlog2DkvDv)(19)Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})\\=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}(-\sum_{k1}^{|y|}p_{k}log_{2}p_{k})\\=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}(-\sum_{k=1}^{|y|}\frac{|D_{k}^{v}|}{|D^{v}|}log_{2}\frac{|D_{k}^{v}|}{|D^{v}|})\tag{19}

其中,DkvD^{v}_{k}表示在样本集合D中在属性a上取值为ava^{v}且类别为k的样本。

为了说明问题,假设一种极端的情况,即假设取ava^{v}的样本个数只有1个,说明属性a可取值个数和样本个数是一样多,即:V=D,Dkv=Dv=1V=|D|,D^{v}_{k}=D^{v}=1,显然此时属性a可以视为取值数目较多的属性。将该情况下的Dkv=Dv=1D^{v}_{k}=D^{v}=1带入到式(19)中,发现H(D|a)=0,当被减数条件熵取0的时候信息增益取最大,所以此时以信息增益最大的那个属性作为划分属性的话,那么肯定选属性a作为划分属性,但是这样选择出来的决策树泛化能力特别差,严重过拟合

要修复ID3算法的这个缺陷,就提出了C4.5决策树,下面开始说明C4.5决策树。

C4.5决策树是以信息增益率为准则来选择划分属性的决策树。
定义信息增益率:
Gainratio(D,a)=Gain(D,a)IV(a)(20)Gain_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}\tag{20}
其中,
IV(a)=v=1VDvDlog2DvD(21)IV(a)=-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}log_{2}\frac{|D^{v}|}{|D|}\tag{21}
观察信息增益率(20)可知,它在信息增益的基础上再除以一个惩罚项IV(a)IV(a),那么再观察惩罚项IV(a)IV(a),发现其类似于前面说的信息熵的表达式。在说信息熵的时候已经交代过:当各类样本分布均匀的时候,它们的信息熵就越大。那么将这个思想应用到信息增益率(20)上,即属性a的可取值数目越多的话,那么惩罚项IV(a)IV(a)就会越来越大,从而导致信息增益率越来越小这样一来,对于那些可取值数目较多的属性获得更大的惩罚,使得其信息增益率小。

C4.5决策树解决了“可取值较多数目的偏好”问题,那么又带来了另一个问题:相反的,信息增益率偏好于那些取值数目较少的属性
为了解决这个问题,C4.5决策树提出了这个方法:算法首先找出信息增益高出平均水平的属性,再在这些属性里面选择信息增益率最高的属性作为最优划分属性

C4.5算法的不足:

a. C4.5算法生成的是多叉树,生成决策树对的效率比较慢
b.C4.5只能用于分类
c.C4.5由于使用了熵模型,里面有大量的耗时的对数运算

CART决策树

CART决策树是以基尼指数为准则来选择划分属性的决策树

基尼值:
Gini(D)=k=1ykkpkpk=k=1ypkkkpk=k=1ypk(1pk)=1k=1ypk2(22)Gini(D)=\sum_{k=1}^{|y|}\sum_{k^{'}\neq k}p_{k}p_{k^{'}}=\sum_{k=1}^{|y|}p_{k}\sum_{k^{'}\neq k}p_{k^{'}}=\sum_{k=1}^{|y|}p_{k}(1-p_{k})=1-\sum_{k=1}^{|y|}p^{2}_{k}\tag{22}
直观地来看,基尼值就是表示集合D中,随机抽出两个样本,不是同一类别的概率。
基尼指数:
Giniindex(D,a)=v=1VDvDGini(Dv)(23)Gini_index(D,a)=\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Gini(D^{v})\tag{23}
基尼指数就是在基尼值得前面加上了权重,基尼值和基尼指数越小,样本集合纯度越高。
CART决策树既能做分类任务,又能做回归任务。

1、CART决策树的分类算法

算法流程:

  1. 根据基尼指数公式Giniindex(D,a)=v=1VDvDGini(Dv)Gini_index(D,a)=\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Gini(D^{v})找出基尼指数最小的属性aa_{*};
  2. 计算属性aa_{*}的所有可能取值的基尼值Gain(Dv),v=1,2,...,VGain(D^{v}),v=1,2,...,V,选择基尼值最小的取值ava^{v}_{*}作为划分点,将集合D划分为D1和D2两个集合(节点),其中D1集合的样本为a=ava_{*}=a_{*}^{v}的样本,D2集合为aava_{*}\neq a_{*}^{v}的样本;
  3. 对集合D1和D2重复步骤1和步骤2,直至满足停止条件。

2、CART决策树的回归算法

CART决策树的回归算法几乎和CART决策树的分类算法几乎是一样的,只是换了一个公式来寻找最优划分属性。
CART决策树的回归算法:

  1. 根据以下公式找出最优化分属性aa_{*}和最优划分点ava_{*}^{v}:

    a,av=argmina,av[minc1xiD1(a,av)(yic1)2+minc1xiD1(a,av)(yic2)2](24)a_{*},a^{v}_{*}=\underset {a,a^{v}}{argmin}[\underset{c1}{min}\sum_{x_{i}\in D_{1}(a,a^{v})}(y_{i}-c1)^{2}+\underset{c1}{min}\sum_{x_{i}\in D_{1}(a,a^{v})}(y_{i}-c2)^{2}]\tag{24}
    其中,D1(a,av)D_{1}(a,a^{v})表示属性a上取值小于等于ava^{v}的样本集合,D2(a,av)D_{2}(a,a^{v})表示属性a上取值大于ava^{v}的样本集合,c1表示D1D_{1}的样本输出均值,c2表示D2D_{2}的样本输出均值(式(24)是该算法的损失函数);

  2. 根据ava_{*}^{v}将集合D划分为D1D_{1}D2D_{2}两个集合(节点);

  3. 对集合D_{1}和D2D_{2}重复步骤1和步骤2,直至满足停止条件。

剪枝

由于决策树算法非常容易过拟合,对于生成的决策树必须要进行剪枝。

1、预剪枝

预剪枝就是在构造决策树的过程中,先对每个节点在划分前进行估计,如果当前结点的划分不能带来决策树模型的泛华性增加,则不对当前结点进行划分并且将当前结点标记为叶结点。
举例(使用西瓜书数据集4.2):
在这里插入图片描述
观察上面的数据集,是好瓜和不是好瓜各有5个,那么根节点的信息熵为:
Ent(D)=k=12pklog2pk=(12log212+12log212)=1Ent(D)= -\sum_{k=1}^{2}p_{k}log{2}p_{k}=-(\frac{1}{2}log_{2}\frac{1}{2}+\frac{1}{2}log_{2}\frac{1}{2})=1
基于根节点,计算出每个属性的信息增益(直接给结果了):
Gain(D,a1)=1(410×1+410×0.811+0)=0.276Gain(D,a2)=1(12×0.971+25×1+0)=0.115Gain(D,a3)=1(610×1+310×0.918+0)=0.174Gain(D,a4)=1(610×1+310×0.918+0)=0.174Gain(D,a5)=1(410×0.811+410×01+0)=0.276Gain(D,a6)=1(610×1+410×1)=0色泽:Gain(D,a_{1})=1-(\frac{4}{10}\times 1 + \frac{4}{10} \times 0.811 + 0)=0.276\\ 根蒂:Gain(D,a_{2})=1-(\frac{1}{2}\times 0.971 + \frac{2}{5} \times 1 + 0)=0.115\\ 敲声:Gain(D,a_{3})=1-(\frac{6}{10}\times 1 + \frac{3}{10} \times 0.918 + 0)=0.174\\ 纹理:Gain(D,a_{4})=1-(\frac{6}{10}\times 1 + \frac{3}{10} \times 0.918 + 0)=0.174\\ 脐部:Gain(D,a_{5})=1-(\frac{4}{10}\times 0.811 + \frac{4}{10} \times 01 + 0)=0.276\\ 触感:Gain(D,a_{6})=1-(\frac{6}{10}\times 1 + \frac{4}{10} \times 1 )=0
通过比较,“脐部”和“色泽”的信息增益最大,均为0.276,所以可以从这两个属性中随机挑选一个作为划分属性。这里选择脐部作为划分属性,那么会产生3个分支:
在这里插入图片描述
下面就需要用预剪枝来判断是不是应该进行这个划分,判断的标准就是比较划分前后其泛华能力是否有提升
划分之前,所有的样本都在根结点,把该节点记为叶节点,其类别标记为训练集中样本数量最多的类

别,因此该节点可以标记为好瓜(正负例一样多,所以坏瓜也行)。然后用验证集对其性能进行评估,

可以看出上面图中的验证集中,样本{4,5,8}为好瓜,被决策树分类正确;其他的样本{9,11,12,13}被

误分类为好瓜,所以此时的正确率为3743%\frac{3}{7}\approx 43\%。(记住这是没划分之前的正确率)

根据信息增益最大选择划分属性后的决策时如上图,那么此时再次用验证集来来评估这个决策树,此

时的正确率是:5771%\frac{5}{7}\approx71\%,很明显这个准确率大于没划分前的准确率,因此可以用

属性“脐部”进行划分。

决策树算法对结点2继续进行划分,再次使用信息增益挑选出值最大的那个特征,信息增益最大的那个特征是“色泽”(具体计算不写了),则使用“色泽”划分后的决策树为:

在这里插入图片描述
再使用预剪枝方法对此次划分进行判断,应不应该进行这个划分:首先“脐部”为“凹陷”的属性集合中

有3个好瓜,1个不是好瓜,那么在使用属性“色泽”划分之前的决策树的划分应该为好瓜;使用“色泽”

属性划分后,使用验证集进行计算,划分后的有4个被正确分类,3个被误分类,那么此时的正确率

4757.1%\frac{4}{7}\approx 57.1\% ,明显小于使用“色泽”划分之前的准确率,所以禁止划分该分支。

后面也是按照这个方法来,这里就不一一赘述了。
那么最后的得到如下的决策树:
在这里插入图片描述

**总结:**对比剪枝决策树和未剪枝决策树,可以看出,预剪枝决策树的很多分支都没有展开,这虽然降低了过拟合的风险,但有可能带来欠拟合的风险

2、后剪枝

后剪枝就是先把决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该节点对应的子树换为叶结点能够带来泛化性能的提升,则把该子树替换为叶结点。
举例:
假设使用上面的数据集,利用信息增益最大的算法得到的决策树如下,下面开始对该树进行后剪枝。
在这里插入图片描述后剪枝算法首先考察图中的结点(6),若将以其为根节点的子树删除,即相当于把结点(6)替换为

子节点,替换后的叶结点的样本(脐部=稍凹,根蒂=稍蜷,色泽=乌黑)包括编号为{7,15}的训练样

本,把该叶结点标记为“好瓜”(因为这里正负样本数量相等,所以随便寄一个类别),因此此时的决

策树在验证集上分类正确的样本为{4,8,11,12},,准确率为47=57.1%\frac{4}{7}=57.1\%(未剪枝的决策

树分类正确的样本为{4,11,13},精度为42.9%42.9\%),所以后剪枝策略决定剪枝。接着考察结点(5),

同样的操作,把其为根节点的子树替换为叶结点,替换后的叶结点包含编号为{6,7,15}的训练样本,

根据“多数原则”把该叶结点标记为“好瓜”,测试的决策树准确率认为57.1%,所以不进行剪枝。结点

(2)和(3)仍然进行上述操作(不具体说了),最后得到的决策树如下,其准确率为71.4%:
在这里插入图片描述
总结:对比预剪枝和后剪枝策略,能够发现后剪枝决策树通常比预剪枝保留了更多的分支,一般情况

下,后剪枝决策树的欠拟合风险小,泛化性能往往也要优于预剪枝。但后剪枝过程是在构建完全

决策树之后进行的,并且要自底向上的对树中的所有非叶结点进行逐一考察,因此其**训练时间开

要比未剪枝决策树和预剪枝决策树都要大得多**。

连续值和缺失值的处理

上面也有提到,ID3算法不能处有缺实值的数据集,而C4.5和CART弥补了这个缺陷。

1、连续值的处理

对于大多数数据,因为连续性数据的取值数目不再有限,所以不能像前面一样处理离散属性使用枚举法对属性进行划分,因此需要将连续属性离散化,常用的离散化方法是二分法。(C4.5采用的策略)

样本集D中的连续属性a,假设属性a有n个不同的取值,对其进行大小排序,记为{a1,a2,...,an}\{a^{1},a^{2},...,a^{n}\},根据属性可得到n-1个划分点,划分点的集合为:
Ta={ai+ai+12 1in1}(24)T_{a}=\{\frac{a^{i}+a^{i+1}}{2}\ |1\leq i \leq n-1\}\tag{24}

对于取值集合TaT_{a}中的每t值会将属性a离散为一个属性值只有两个值,分别是{a>t}和{a<=t}的属性,计算新属性的信息增益,找到信息增益最大的t值即为该属性的最优划分点:
Gain(D,a)=maxtTa Gain(D,a,t)=maxTa Ent(D)λ,+DtλDEnt(Dtλ)(25)Gain(D,a)=\underset{t\in T_{a}}{max}\ Gain(D,a,t)=\underset{\in T_{a}}{max}\ Ent(D)-\sum_{\lambda \in{-,+}}\frac{|D_{t}^{\lambda }|}{|D|}Ent(D_{t}^{\lambda})\tag{25}

2、缺失值的处理

现实数据集中的样本通常因为某种原因是缺失的,如果有缺失值的属性的个数比较小,那么可以粗暴地将有缺失值的属性剔除掉;如果有缺失值的属性较多,就不能简单地删除。

在决策树中处理含有缺失值的样本的时候,需要解决两个问题:

  • 1、如何在属性缺失值缺失的情况下进行划分属性的选择?
  • 2、给定划分属性,若该样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?
    举例说明解决方法:
    对于问题1
    含有缺失值的数据集合如下:

在这里插入图片描述
给定训练集D和属性a,令表示D\overset{-}{D}中在属性a上没有缺失值得样本集(比如,假设a=色泽,则D=2,3,4,6,7,8,9,10,11,12,14,15,16,17\overset{-}{D}={2,3,4,6,7,8,9,10,11,12,14,15,16,17}

那么对于第一个问题:我们可以根据D\overset{-}{D}(即在该属性上没有缺失值的样本集)来计算属性a的信息增益或者其他指标。我们只要再给根据计算出来的值一个权重,皆可以表示该训练集D中属性a的优劣。

假定属性a有V个可取值{a1,a2,...,aV}\{a^{1},a^{2},...,a^{V}\},令Dv\overset {-}{D^{v}}表示D中在属性a上取值为ava^{v}的样本集,Dk\overset{-}{D_{k}}表示D\overset {-}{D}中属于第k个类(k=1,2,…,|y|)的样本子集,则显然D=k=1V1Dk,DV=1v1Dv\overset {-}{D}=\cup ^{V_{1}}_{k=1}\overset{-}{D_{k}},\overset {-}{D}\cup ^{v_{1}}_{V=1}\overset{-}{D^{v}},假定为每个样本X赋予一个权重WxW_{x}(在决策树的初始阶段,根节点中样本的权重初始化为1),并定义:
ρ=xDvWxxDWx, (25)\rho = \frac {\sum_{x\in \overset {-}{D^{v}}}W_{x}}{{\sum_{x\in D}}W_{x}}\tag{25},\ 表示无缺失值样本所占的比例
pk=xDkWxxDWx (1ky), k(26)\overset{-}{p_{k}}=\frac{\sum_{x\in \overset{-}{D_{k}}}W_{x}}{\sum_{x\in \overset{-}{D}}W_{x}}\ (1\leq k\leq |y|)\tag{26},\ 表示无缺失值样本中第k类所占的比例
rv=xDvWxxDWx (1vV), aav(27)\overset{-}{r_{v}}=\frac{\sum_{x\in \overset{-}{D_{v}}}W_{x}}{\sum_{x\in \overset{-}{D}}W_{x}}\ (1\leq v\leq V)\tag{27},\ 表示无缺失值样本中在属性a上取值a^{v}的样本所占比例
根据上面的三个公式,此时可以将信息增益推广为:
Gain(D,a)=ρ×Gain(D,a)=ρ×(Ent(D)v=1VrvEnt(Dv))(28)Gain(D,a)=\rho \times Gain(\overset{-}{D},a)=\rho \times (Ent(\overset{-}{D})-\sum_{v=1}^{V}\overset{-}{r_{v}}Ent(\overset {-}{D^{v}}))\tag{28}

那么上面给出的第一个问题,用式(28)就可以估算出来。

对于问题2:
若样本x在划分属性a上的取值已知,则将x划入与其取值对应的子节点,且样本权值在子节点中保持为wxw_{x}。若样本x在划分属性a上的取值未知,则将x同时划入所有子节点,且样本权值在与属性值ava^{v}对应的子节点中调整为rvwx\overset{-}{r_{v}}\cdot w_{x};直观的看,这就是让同一个样本以不同的概率划入到不同的子节点中去。

用一个实例说明C4.5是怎样利用上述思想来解决缺失值的(直接截图了!!!!)
在这里插入图片描述
在这里插入图片描述
生成的决策树如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章