决策树是怎么回事?
其实就是对实例进行分类的树形结构。决策树由节点(node)和有向边(directed edge)组成。节点包括内部节点(internal node)和叶节点(leaf node)。内部节点表示一个属性或特征,叶结点表示一个类。
这是一个非常简单的分类器,关于它更细致的描述这里就不再赘述,我们谈论几个要点:熵(entropy)、条件熵、Gini系数、预剪枝和后剪枝,连续值属性的处理等。
熵(entropy)
熵就是描述一个系统或一系列事件的混乱程度或者不确定程度,熵值越大,不确定性越大;熵值越小,不确定性越小。
在机器学习中,描述事件的不确定性我们利用的是统计学知识中的概率,概率能描述一件事情发生的可能性大小,但是却描述不了事件的混乱程度,而熵就这样应运而生了。
设XXX是一个取有限个值的离散随机变量,其概率分布(不要和分布函数混淆)为
P(X=xi)=pi,i=1,2,⋯ ,nP(X=x_i)=p_i,\quad i=1,2,\cdots,n
P(X=xi)=pi,i=1,2,⋯,n则随机变量XXX的熵定义为
H(X)=−∑i=1npilogpiH(X)=-\sum^n_{i=1}p_i\log p_iH(X)=−i=1∑npilogpi
若pi=0p_i=0pi=0,则定义0log0=00\log 0=00log0=0,这是显然的,因为根据极限的理论
limx→0+xlnx=limx→0+lnx1x=洛必达limx→0+1x−1x2=0\underset{x\to0^+}{\lim}x\ln x=\underset{x\to0^+}{\lim}\frac{\ln x}{\frac{1}{x}}\xlongequal{洛必达}\underset{x\to0^+}{\lim}\frac{\frac{1}{x}}{-\frac{1}{x^2}}=0x→0+limxlnx=x→0+limx1lnx洛必达x→0+lim−x21x1=0
可以发现,熵的取值范围如下:0≤H(X)≤logn0\leq H(X)\leq \log n0≤H(X)≤logn
如果在一个随机事件中,各个事件X=xiX=x_iX=xi的可能性都一样,即等可能发生,则此时随机事件达到了熵值的最大值。
条件熵(conditional entropy)
条件熵H(Y∣X)H(Y|X)H(Y∣X)表示在已知随机变量XXX的条件下随机变量YYY的不确定性或混乱程度,定义为XXX给定条件下YYY的条件概率分布的熵对XXX的数学期望H(Y∣X)=∑i=1npiH(Y∣X=xi) H(Y|X)=\sum^n_{i=1}p_iH(Y|X=x_i)H(Y∣X)=i=1∑npiH(Y∣X=xi)这里,pi=P(X=xi),i=1,2,⋯ ,n.p_i=P(X=x_i),i=1,2,\cdots,n.pi=P(X=xi),i=1,2,⋯,n.
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所得到的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy).我们在算法中经常是以频率估概率。
信息增益
信息增益定义
信息增益是构建决策树时选定属性或特征的绝对指标。
信息增益从字面意思猜测,应该是我们从中获取了多少有用信息。
特征AAA对训练数据集DDD的信息增益g(D,A)g(D,A)g(D,A),定义为g(D,A)=H(D)−H(D∣A)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)可见,信息增益表征由于特征AAA而使得对数据集DDD的分类的不确定性减小的程度。不同的特征,往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。信息增益一般也称为互信息(mutual information)。
基本记号
- 设训练数据集为DDD,∣D∣|D|∣D∣表示样本的个数.
- 设数据集DDD有KKK个类Ck,k=1,2,⋯ ,K,∣Ck∣C_k,k=1,2,\cdots,K,|C_k|Ck,k=1,2,⋯,K,∣Ck∣为属于类CkC_kCk的样本个数,∑k=1K∣Ck∣=∣D∣\sum^K_{k=1}|C_k|=|D|∑k=1K∣Ck∣=∣D∣.
- 设特征AAA有nnn个不同的取值{a1,a2,⋯ ,an}\{a_1,a_2,\cdots,a_n\}{a1,a2,⋯,an},根据特征AAA的取值将DDD划分为nnn个不同的子集D1,D2,⋯ ,DnD_1,D_2,\cdots,D_nD1,D2,⋯,Dn,∣Di∣|D_i|∣Di∣为DiD_iDi的样本个数,有∑i∣Di∣=∣D∣\sum_i|D_i|=|D|∑i∣Di∣=∣D∣.
- 记子集DiD_iDi中属于类CkC_kCk的样本的集合为Dik,∣Dik∣D_{ik},|D_{ik}|Dik,∣Dik∣的DikD_{ik}Dik的样本个数.
- 数据集DDD的经验熵H(D)H(D)H(D)
H(D)=−∑k=1K∣Ck∣∣D∣log2∣Ck∣∣D∣H(D)=-\sum^K_{k=1}\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣ - 计算特征AAA对训练数据集DDD的经验条件熵H(D∣A)H(D|A)H(D∣A)
H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)=−∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log2∣Dik∣∣Di∣ H(D|A)=\sum^n_{i=1}\frac{|D_i|}{|D|}H(D_i)=-\sum^n_{i=1}\frac{|D_i|}{|D|}\sum^K_{k=1}\frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣ - 计算信息增益
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)
信息增益比
- 以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题.
- 使用信息增益比可以对这一问题进行校正,这是特征选择的另一准则.
其实很简单,如果特征AAA的取值比较多,不仅说明特征AAA对数据集DDD的分类能力比较好,同时也说明特征AAA本身的不确定性比较大,即特征AAA自身的熵值HA(D)H_A(D)HA(D)比较大,那么如果特征AAA自身的熵值有多大,就对关于特征AAA的信息增益进行相应大小的惩罚,就可以纠正这一问题。
信息增益比的数学定义:
gR(D,A)=g(D,A)HA(D)
g_R(D,A)=\frac{g(D,A)}{H_A(D)}
gR(D,A)=HA(D)g(D,A)其中,HA(D)=−∑i=1n∣Di∣∣D∣log2∣Di∣∣D∣H_A(D)=-\sum^n_{i=1}\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|}HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
nnn是特征AAA取值的个数,HA(D)H_A(D)HA(D)是计算属性本身的熵值,不要搞混了.
- ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归的构建决策树;
- C4.5算法与ID3算法相似,但是应用了信息增益比选择特征。
CART算法
CART即Classification And Regression Tree.
决策树的生成就是递归的构建二叉决策树的过程,对回归树用平方误差最小化准则,对于分类树用基尼指数(Gini index)最小化的准则,进行特征选择,生成二叉树。
回归树生成算法(参考李航)
在训练数据集所在的空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。
具体的算法查看《统计学习方法》5.5节及《西瓜书》4.4节,这里我主要描述下怎么在特定切分变量jjj上寻找最优切分点 ttt.
这里其实可以用试点发不断逼近最优的切分点ttt,但是在这里边的步长可以放大,最优切分点已经变成最优切分区间了,具体又是怎么做呢?
给定样本集合DDD和连续属性aaa,假定 aaa 在DDD上出现了 nnn 个不同的取值,则将这些值从小到大排列,记为{a1,a2,⋯ ,an}\{a^1,a^2,\cdots,a^n\}{a1,a2,⋯,an},基于划分点 ttt 可将DDD分为子集D+−和D+−D^-_+和D^-_+D+−和D+−,对于相邻的属性取值ai与ai+1a^i与a^{i+1}ai与ai+1来说,ttt 在区间[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)中取任意值所产生的划分结果都相同,因此对于连输属性aaa,我们可考察包含n−1n-1n−1个元素的候选划分点集合:
Ta={ai+ai+12∣1≤i≤n−1}T_a=\left\{\frac{a^i+a^{i+1}}{2}|1\leq i\leq n-1\right\}
Ta={2ai+ai+1∣1≤i≤n−1}然后我们可以像离散属性值一样来考察这些划分点,选择最优的划分点进行样本集合的划分。
《统计学习方法》是利用平方误差最小化准则,《西瓜书》是利用信息增益最大化的准则,二者其实并不矛盾,是一致的。这里参考西瓜书的方法,
g(D,a)=maxt∈Ta g(D,a,t)=maxt∈Ta g(D)−∑λ∈{−,+}∣Dtλ∣∣D∣g(Dtλ)\begin{aligned}g(D,a)&=\underset{t\in T_a}{\max} \ g(D,a,t)\\ &=\underset{t\in T_a}{\max} \ g(D)-\sum_{\lambda\in\{-,+\}}\frac{|D_t^\lambda|}{|D|}g(D^\lambda_t)
\end{aligned}
g(D,a)=t∈Tamax g(D,a,t)=t∈Tamax g(D)−λ∈{−,+}∑∣D∣∣Dtλ∣g(Dtλ)
其中,g(D,a,t)g(D,a,t)g(D,a,t)是样本集DDD基于划分点 ttt 二分后的信息增益,于是我们就可以使g(D,a,t)g(D,a,t)g(D,a,t)最大化从而得到在属性aaa上的最优划分点。
CART分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点.
CART分类树的生成机制和ID3算法、C4.5算法生成决策树的机制一样,只是CART算法利用了Gini指数衡量某一特征给数据集分类带来的不确定性减小的程度,对应于ID3和C4.5中的信息增益。
下面我们仅描述Gini指数。
Gini指数
基尼指数和熵都是针对随机事件的不确定性进行衡量,二者殊途同归;同时也可以把基尼指数近似看成是熵的一阶泰勒展开。
- 基尼指数的定义
分类问题中,假设有KKK个类,样本点属于第kkk类的概率为pkp_kpk,则概率分布的基尼指数定义为:Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2{\rm Gini}(p)=\sum^K_{k=1}p_k(1-p_k)=1-\sum^K_{k=1}p_k^2 Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于给定的样本集合DDD,其基尼指数为:Gini(p)=1−∑k=1K(∣Ck∣∣D∣)2{\rm Gini}(p)=1-\sum^K_{k=1}\left(\frac{|C_k|}{|D|}\right)^2Gini(p)=1−k=1∑K(∣D∣∣Ck∣)2这里,CkC_kCk是DDD中属于第kkk类的样本子集,KKK是类的个数。
如果样本集合DDD根据特征AAA是否取某一可能值aaa被分割成D1D_1D1和D2D_2D2两部分,即
D1={(x,y)∈D∣A(x)=a},D2=D−D1D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1D1={(x,y)∈D∣A(x)=a},D2=D−D1
则特征AAA的条件下,集合DDD的基尼指数定义为
Gini(D,A)=∣D1∣∣D∣Gini∣D1∣∣D∣+∣D2∣∣D∣Gini∣D2∣∣D∣{\rm Gini}(D,A)=\frac{|D_1|}{|D|}{\rm Gini}\frac{|D_1|}{|D|}+\frac{|D_2|}{|D|}{\rm Gini}\frac{|D_2|}{|D|}Gini(D,A)=∣D∣∣D1∣Gini∣D∣∣D1∣+∣D∣∣D2∣Gini∣D∣∣D2∣从以上的表述不难看出,在基于某一属性生成决策树时,不管该属性有多少不同的取值,都是按照二分法处理,即生成的是二叉树。
剪枝处理(pruning)
剪枝是决策树学习算法对付“过拟合”的主要手段。
- 《西瓜书》的剪枝策略:决策树剪枝的基本策略有“预剪枝”和**“后剪枝**”。具体描述请参考《西瓜书》4.3节,总之就是利用“验证集”样本考察非叶结点,如果将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。
《统计学习方法》的剪枝策略
这里引进了决策树学习的损失函数、参数α\alphaα,模型对训练数据的也测误差C(T)C(T)C(T),以及模型的复杂度∣T∣|T|∣T∣,比较细碎,但是理解不难,不再繁述。