决策树(decision tree)是一种基本的分类与回归算法,它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。决策树学习包括3个步骤:特征选择、决策树的生成和决策树的剪枝。这些思想主要来源于ID3算法、C4.5算法以及CART算法。
1、决策树模型与学习
决策树由结点(node)和有向边(directed edge)组成,结点分为内部结点(internal node)和叶结点(leaf node),内部结点表示一个特征或属性,叶结点表示一个类。
决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。意思是每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。
决策树将特征空间划分为互不相交的单元(cell)或区域(region),决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。各叶结点上的条件概率往往偏向某一个类,即该类的概率较大,决策树分类时将该结点的实例强行分到条件概率大的那一类去。
基于特征空间划分的类的条件概率模型有无穷多个,我们选择的条件概率模型应不仅对训练数据有很好的拟合,而且对未知数据也应有很好的预测。因此决策树学习用损失函数表示这一目标,损失函数通常是正则化的极大似然函数。
由于从所有可能的决策树中选取最优决策树是NP完全问题,所以通常采用启发式方法,近似求解得到一个次最优(sub-optimal)决策树。
2、特征选择
特征选择在于选取对训练数据具有分类能力的特征,通常的准则是信息增益或信息增益比。
首先给出熵与条件熵的定义。熵(entropy)是表示随机变量不确定性的度量,设XXX是一个取有限个值得离散随机变量,其概率分布为P(X=xi)=piP(X=x_i)=p_iP(X=xi)=pi,则XXX的熵定义为
H(X)=−∑i=1npilogpiH(X)=-\sum_{i=1}^np_ilogp_iH(X)=−i=1∑npilogpi 上式的对数以2为底或以eee为底,此时熵的单位分别为比特(bit)或纳特(nat)。由于熵只依赖于XXX的分布,所以也可写作H(p)H(p)H(p)。
熵越大,随机变量的不确定性就最大,熵的范围是
0≤H(p)≤logn0\le H(p)\le log n0≤H(p)≤logn 0代表XXX的取值是确定的,lognlognlogn代表XXX的nnn种可能的概率相同,即平均分布。
接下来是条件熵(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_{i=1}^np_iH(Y|X=x_i)H(Y∣X)=i=1∑npiH(Y∣X=xi) 可以看到,熵本质上是关于概率的公式,当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
信息增益(information gain)表示得知特征XXX的信息而使类YYY的信息不确定性减少的程度,设特征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的信息增益g(D,A)g(D,A)g(D,A)的计算方法为:
首先用极大似然估计,计算数据集DDD的经验熵H(D)H(D)H(D)
H(D)=−∑k=1K∣Ck∣∣D∣log2∣Ck∣∣D∣H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣ 式中,∣D∣|D|∣D∣代表样本个数,∣Ck∣|C_k|∣Ck∣代表属于类CkC_kCk的样本个数。
接着用极大似然估计,计算特征AAA对数据集DDD的经验条件熵H(D∣A)H(D|A)H(D∣A)
H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)H(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)H(D∣A)=i=1∑n∣D∣∣Di∣H(Di) 式中,根据特征AAA的取值将样本分为nnn个子集,∣Di∣|D_i|∣Di∣代表子集DiD_iDi的样本个数。而对于H(Di)H(D_i)H(Di),其表达式为
H(Di)=−∑k=1K∣Dik∣∣Di∣log2∣Dik∣∣Di∣H(D_i)=-\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}log_2\frac{|D_{ik}|}{|D_i|}H(Di)=−k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣ 式中,∣Dik∣|D_{ik}|∣Dik∣代表子集DiD_iDi中属于类CkC_kCk的样本个数。
最后计算信息增益
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A) 以信息增益作为划分训练数据集的特征,容易偏向于选择取值较多的特征。直观上理解,如果某个特征的可取值数很多,以至于一些取值下可能只有一个样本,则这个取值的经验熵为0,这导致了此特征的经验条件熵很低,信息增益很高。因此使用信息增益比(information gain ratio)对这一问题进行校正。
特征AAA对训练数据集DDD的信息增益比gR(D,A)g_R(D,A)gR(D,A)等于其信息增益g(D,A)g(D,A)g(D,A)与特征AAA本身的熵HA(D)H_A(D)HA(D)之比,即
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_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,nnn是特征AAA取值的个数。若特征AAA的可取值数较多,则g(D,A)g(D,A)g(D,A)较大,同样HA(D)H_A(D)HA(D)也较大,因此保持了平衡。
3、决策树的生成
首先介绍ID3的生成算法。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征建立子结点,再将此特征移除,对子结点递归地调用以上方法,直到所有特征的信息增益均很小或没有特征可以选择未知。
ID3相当于用极大似然法进行概率模型的选择。
接下来是C4.5算法,与ID3相比,C4.5在生成的过程中用信息增益比来选择特征。
4、决策树的剪枝
决策树容易产生过拟合现象,原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决的办法是考虑决策树的复杂度,对已生成的决策树进行简化,即剪枝(pruning)。
决策树的剪枝通过极小化决策树整体的损失函数或代价函数来实现。设树TTT的叶结点个数为∣T∣|T|∣T∣,叶结点ttt有NtN_tNt个样本点,则决策树的损失函数定义为
Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣=C(T)+α∣T∣C_\alpha (T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|=C(T)+\alpha|T|Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣=C(T)+α∣T∣ 式中,Ht(T)H_t(T)Ht(T)是叶结点ttt上的经验熵,计算公式为
Ht(T)=−∑kNtkNtlogNtkNtH_t(T)=-\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t}Ht(T)=−k∑NtNtklogNtNtk 式中,NtkN_{tk}Ntk是叶结点ttt中kkk类样本点的个数。因此,约掉NtN_tNt后,Cα(T)C_\alpha(T)Cα(T)中的C(T)C(T)C(T)项可以写为
C(T)=∑t=1∣T∣∑k=1KNtklogNtkNtC(T)=\sum_{t=1}^{|T|}\sum_{k=1}^KN_{tk}log\frac{N_{tk}}{N_t}C(T)=t=1∑∣T∣k=1∑KNtklogNtNtk 在Cα(T)C_\alpha(T)Cα(T)中,C(T)C(T)C(T)表示模型对训练数据的预测误差,∣T∣|T|∣T∣表示模型复杂度。
剪枝,就是在α\alphaα确定时,选择损失函数最小的模型,或者说损失函数最小的子树。损失函数的极小化,等价于正则化的极大似然估计。
剪枝算法如下:生成整个树TTT后,计算每个结点的经验熵后,递归地从树的叶结点向上回缩,设回缩前后整体树分别为TBT_BTB与TAT_ATA,如果Cα(TA)≤Cα(TB)C_\alpha(T_A)\le C_\alpha(T_B)Cα(TA)≤Cα(TB),则进行剪枝。
5、CART算法
分类与回归树(classification and regression tree, CART)模型是应用广泛的决策树学习方法。
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”。这样的决策树等价于递归地二分每个特征,将特征空间划分为有限个单元并输出条件概率分布。
CART算法包括两步:
(一)决策树生成,生成的决策树要尽量大;
(二)决策树剪枝,用损失函数最小作为剪枝标准,用验证集选择最优子树。
对回归树,用平方误差最小化准则;对分类树,用基尼指数(Gini index)最小化准则。
首先是回归树的生成,假设已将输入空间划分为MMM个单元R1,R2,⋯ ,RMR_1,R_2,\cdots,R_MR1,R2,⋯,RM,且每个单元RmR_mRm上有一个固定的输出值cmc_mcm,则回归树模型可表示为
f(x)=∑m=1McmI(x∈Rm)f(x)=\sum_{m=1}^Mc_mI(x\in R_m)f(x)=m=1∑McmI(x∈Rm) 用平方误差∑xi∈Rm(yi−f(xi))2\sum_{x_i\in R_m}(y_i-f(x_i))^2∑xi∈Rm(yi−f(xi))2来表示训练数据的预测误差,可以推导出cmc_mcm的最优值是RmR_mRm上所有实例xix_ixi所对应输出yiy_iyi的均值,即
c^m=ave(yi∣xi∈Rm)\hat c_m=ave(y_i|x_i\in R_m)c^m=ave(yi∣xi∈Rm) 接着考虑如何对输入空间进行划分。采用启发式方法,选择第jjj个变量xjx^{j}xj和值sss作为切分变量(splitting variable)和切分点(splitting point),然后定义两个区域
R1(j,s)={x∣x(j)≤s}, R2(j,s)={x∣x(j)>s}R_1(j,s)=\{x|x^{(j)}\le s\}, R_2(j,s)=\{x|x^{(j)}>s\}R1(j,s)={x∣x(j)≤s}, R2(j,s)={x∣x(j)>s} 求解下式
minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]\min_{j,s}[\min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2]j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2] 上式内部最优解对应的c1c_1c1与c2c_2c2为
c^1=ave(yi∣xi∈R1(j,s)), c^2=ave(yi∣xi∈R2(j,s))\hat c_1=ave(y_i|x_i\in R_1(j,s)), \hat c_2=ave(y_i|x_i\in R_2(j,s))c^1=ave(yi∣xi∈R1(j,s)), c^2=ave(yi∣xi∈R2(j,s)) 遍历所有输入变量,找到最优的切分变量jjj与切分点sss,重复地将输入空间划分为两个区域,这样的回归树称为最小二乘回归树(least squares regression tree)。
接下来是分类树,分类树用基尼指数选择最优特征与该特征的最优二值切分点。
假设有KKK个类,则概率分布的基尼指数定义为
Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2 对于给定的样本集合DDD,根据极大似然估计,其基尼指数为
Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2 如果样本集合DDD被特征AAA的某一可能值aaa分为D1D_1D1与D2D_2D2两部分,则集合DDD关于特征AAA的条件基尼指数是集合DDD的基尼指数关于特征AAA的期望,其定义为
Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)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) 与熵相似,基尼指数越大,样本集合的不确定性也就越大。基尼指数与熵之半的曲线很接近,都可以近似代表分类误差率。
CART生成算法的过程为:
从根节点开始递归地对每个结点进行操作,首先对每一个特征AAA可能取的每个值aaa,根据A=aA=aA=a将样本分为D1D_1D1与D2D_2D2两个部分,计算A=aA=aA=a时的基尼指数;选择基尼指数最小的特征及切分点作为最优特征与最优切分点。
算法停止的条件是:
(一)结点中的样本个数小于预定阈值;
(二)样本集的基尼指数小于预定阈值(样本基本属于同一类);
(三)没有更多特征。
接下来是CART的剪枝。在剪枝过程中,计算子树的损失函数为
Cα(T)=C(T)+α∣T∣C_\alpha(T)=C(T)+\alpha|T|Cα(T)=C(T)+α∣T∣ 对于固定的α\alphaα,一定存在唯一的使损失函数Cα(T)C_\alpha(T)Cα(T)最小的子树,将其表示为TαT_\alphaTα。当α=0\alpha=0α=0时,整体树是最优的;当α→∞\alpha\to\inftyα→∞时,根结点组成的单结点树是最优的。
从整体树T0T_0T0开始剪枝,对T0T_0T0的任意内部结点ttt,计算以下两棵树的损失函数。
以ttt为单结点树的损失函数是
Cα(t)=C(t)+αC_\alpha(t)=C(t)+\alphaCα(t)=C(t)+α 以ttt为根节点的子树TtT_tTt的损失函数是
Cα(Tt)=C(Tt)+α∣Tt∣C_\alpha(T_t)=C(T_t)+\alpha|T_t|Cα(Tt)=C(Tt)+α∣Tt∣ 因此,当α<C(t)−C(Tt)∣Tt∣−1\alpha<\frac{C(t)-C(T_t)}{|T_t|-1}α<∣Tt∣−1C(t)−C(Tt)时,有
Cα(Tt)<Cα(t)C_\alpha(T_t)<C_\alpha(t)Cα(Tt)<Cα(t) 此时TtT_tTt较优,不剪枝。当α>C(t)−C(Tt)∣Tt∣−1\alpha>\frac{C(t)-C(T_t)}{|T_t|-1}α>∣Tt∣−1C(t)−C(Tt)时,有
Cα(Tt)>Cα(t)C_\alpha(T_t)>C_\alpha(t)Cα(Tt)>Cα(t) 此时ttt较优,对TtT_tTt进行剪枝。
当α=C(t)−C(Tt)∣Tt∣−1\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}α=∣Tt∣−1C(t)−C(Tt)时,TtT_tTt与ttt有相同的损失函数值,根据奥卡姆剃刀原则,ttt比TtT_tTt更可取,对TtT_tTt进行剪枝。
因此,CART剪枝算法的过程为:
对T0T_0T0中每一内部结点ttt计算g(t)=C(t)−C(Tt)∣Tt∣−1g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}g(t)=∣Tt∣−1C(t)−C(Tt),在T0T_0T0中减去g(t)g(t)g(t)最小的TtT_tTt,将得到的子树作为T1T_1T1,同时将最小的g(t)g(t)g(t)作为α1\alpha_1α1,T1T_1T1为区间[α1,α2)[\alpha_1,\alpha_2)[α1,α2)的最优子树。如此剪枝下去直至根结点,在这一过程中不断增加α\alphaα的值,产生新的区间。最后采用交叉验证法在子树序列T0,T1,⋯ ,TnT_0,T_1,\cdots,T_nT0,T1,⋯,Tn中选取最优子树TαT_\alphaTα。