if-then
规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。假设给定训练数据集 D = { ( x 1 , x 1 ) , ( x 2 , x 2 ) , ⋯ , ( x N , x N ) } D=\{(x_1,x_1),(x_2,x_2),\cdots,(x_N,x_N)\} D={(x1,x1),(x2,x2),⋯,(xN,xN)}其中, x i = ( x i ( 1 ) , x i ( 2 ) , ⋯ , x i ( n ) ) n x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^n xi=(xi(1),xi(2),⋯,xi(n))n为输入实例(特征向量),n为特征个数, y i ∈ { 1 , 2 , ⋯ , K } y_i\in \{1,2,\cdots,K\} yi∈{1,2,⋯,K}为类标记, i = 1 , 2 , ⋯ , N i=1,2,\cdots,N i=1,2,⋯,N,N为样本容量。决策树学习的目标是根据给定的训练数据构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习本质上是从训练数据集中归纳出一组分类规则。与训练数据集不相矛盾的决策树,即能对训练数据正确分类的决策树,可能有多个,也可能一个都没有。我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。从另一个角度看,决策树学习是由训练数据集估计条件概率模型。基于特征空间划分的类的条件概率模型有无穷多个。我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。
决策树学习用损失函数表示这一目标。决策树的损失函数通常是正则化的极大似然函数。决策树学习的策略是以损失函数为目标函数的最小化。
当损失函数确定后,学习问题就变为在损失函数意义下,选择最优决策树的问题。因为从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题,这样得到的决策树是次最优的。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。开始构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶结点,并将这些子集分到所对应的叶结点中去。如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。如此递归的进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶结点上,即都有了明确的类。这就生成了一棵决策树。
以上方法生成的决策树,可能对训练数据有很好的分类能力。但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合现象。我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。具体地,就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。
如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
可以看出,决策树学习算法包含特征选择、决策树的生成、决策树的剪枝过程。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。
决策树学习常用的算法有ID3,C4.5,与CART,下面结合这些算法分别叙述决策树学习的特征选择、决策树的生成和剪枝过程。
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大区别,则称这个特征是没有分类能力的。经验上,扔掉这样的特征对决策树学习的进度影响不大,通常特征选择的准则是信息增益或信息增益比。
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。设 X X X是一个取有限个值的离散随机变量,其概率分布为 P ( X = x i ) = p i , i = 1 , 2 , ⋯ , n P(X=x_i)=p_i,i=1,2,\cdots,n P(X=xi)=pi,i=1,2,⋯,n则随机变量 X X X的熵定义为 H ( X ) = − ∑ i = 1 n p i l o g ( p i ) H(X)=-\sum_{i=1}^np_ilog(p_i) H(X)=−i=1∑npilog(pi)若 p i = 0 p_i=0 pi=0,则定义 0 l o g ( 0 ) = 0 0log(0)=0 0log(0)=0.当对数以2为底或以e为底,这时熵的单位分别被称作比特(bit)或纳特(nat)。由定义可知,熵只依赖于 X X X的分布,而与 X X X的取值无关,所以也可以将 X X X的熵记作 H ( p ) H(p) H(p),即 H ( p ) = − ∑ i = 1 n p i l o g ( p i ) H(p)=-\sum_{i=1}^np_ilog(p_i) H(p)=−i=1∑npilog(pi)
熵越大,随机变量的不确定性越大,从定义可以验证 0 ≤ H ( p ) ≤ l o g ( n ) 0\le H(p) \le log (n) 0≤H(p)≤log(n)当随机变量只取两个值,例如1,0时,即 X X X的分布为 P ( X = 1 ) = p , P ( X = 0 ) = 1 − p , 0 ≤ p ≤ 1 P(X=1)=p,P(X=0)=1-p,0\le p \le 1 P(X=1)=p,P(X=0)=1−p,0≤p≤1熵为 H ( p ) = − p l o g 2 p − ( 1 − p ) l o g 2 ( 1 − p ) H(p)=-plog_2p-(1-p)log_2(1-p) H(p)=−plog2p−(1−p)log2(1−p)这时,熵 H ( p ) H(p) H(p)随概率 p p p变化的曲线如图所示。(分布为伯努利分布时熵与概率的关系)。
当 p = 0 p=0 p=0或 p = 1 p=1 p=1时, H ( p ) = 0 H(p)=0 H(p)=0,随机变量完全没有不确定性。当 p = 0.5 p=0.5 p=0.5时, H ( p ) = 1 H(p)=1 H(p)=1,熵取值最大,随机变量不确定性最大。
设随机变量 ( X , Y ) (X,Y) (X,Y),其联合概率分布为 P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , ⋯ , n ; j = 1 , 2 , ⋯ , m P(X=x_i,Y=y_i)=p_{ij},i=1,2,\cdots,n;j=1,2,\cdots,m P(X=xi,Y=yi)=pij,i=1,2,⋯,n;j=1,2,⋯,m条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示在已知随机变量 X X X的条件下,随机变量 Y Y Y的不确定性。随机变量 X X X给定条件下随机变量 Y Y Y的条件熵H(Y|X),定义为 X X X给定条件下 Y Y Y的条件概率分布的熵对 X X X的数学期望 H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i) H(Y∣X)=i=1∑npiH(Y∣X=xi)
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵。信息增益表示得知特征 X X X的信息,而使得类 Y Y Y的信息的不确定性减少的程度。
信息增益:
特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征 A A A给定条件下 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(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)
信息增益的算法
输入:训练数据集D和特征A;
输出:特征A对训练数据集D的信息增益g(D,A).
(1)计算数据集D的经验熵H(D)
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K{{|C_k|}\over{|D|}}log_2{{|C_k|}\over{|D|}} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
(2)计算特征A对数据集D的经验条件熵H(D|A)
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) H(D|A)=\sum_{i=1}^n{{|D_i|}\over{|D|}}H(D_i) H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)
(3)计算信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正,这是特征选择的另一准则。
信息增益比
特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集 D D D关于特征 A A A的值的熵 H A ( D ) H_A(D) HA(D)之比,即 g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)={{g(D,A)}\over{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 ∣ H_A(D)=-\sum_{i=1}^n{{|D_i|}\over{|D|}}log_2{{|D_i|}\over{|D|}} HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣,n是特征A取值的个数。
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益很小或没有特征可以选择为止,最后得到一棵决策树。ID3相当于用极大似然法进行概率模型的选择。
ID3算法
输入:训练集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
输出:决策树 T T T
(1)若 D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,并将类 C k C_k Ck作为该结点的类标记,返回 T T T
(2)若 A = ∅ A=\varnothing A=∅,则 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
(3)否则,否则按照信息增益的算法,计算 A A A中各特征对 D D D的信息增益,选择信息增益最大的特征 A g A_g Ag
(4)如果 A g A_g Ag的信息增益小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
(5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai将 D D D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
(6)对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A−{Ag}为特征集,递归地调用(1)~(5),得到子树 T i T_i Ti,返回子树 T i T_i Ti
C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来选择特征。
C4.5的生成算法
输入:训练集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
输出:决策树 T T T
(1)若 D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,并将类 C k C_k Ck作为该结点的类标记,返回 T T T
(2)若 A = ∅ A=\varnothing A=∅,则 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
(3)否则,否则按照信息增益的算法,计算 A A A中各特征对 D D D的信息增益,选择信息增益最大的特征 A g A_g Ag
(4)如果 A g A_g Ag的信息增益比小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
(5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai,将 D D D分割为子集若干非空 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
(6)对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A−{Ag}为特征集,递归地调用(1)~(5),得到子树 T i T_i Ti,返回子树 T i T_i Ti
决策树生成算法递归地产生决策树,直到不能继续下去为止,这样产生的决策树往往对训练数据的分类很准确,但对未知的测试数据却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多的考虑如何提高对训练数据的正确分类,从而构造出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中,将已生成的树进行简化的过程称为剪枝(Pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶子结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
树的剪枝算法
输入:生成算法产生的整个树 T T T,参数 α \alpha α
输出:修剪后的子树 T α T_{\alpha} Tα
(1)计算每个结点的经验熵
(2)递归地从树的叶结点向上回缩
设计一组叶结点回缩到其父结点之前,与之后的整体树分别为 T B 与 T A T_B与T_A TB与TA,其对应的损失函数分别是 C α ( T B ) 与 C α ( T A ) C_{\alpha}(T_B)与C_{\alpha}(T_A) Cα(TB)与Cα(TA),如果 C α ( T B ) ≤ C α ( T A ) C_{\alpha}(T_B)\le C_{\alpha}(T_A) Cα(TB)≤Cα(TA)则进行剪枝,即将其父结点变为新的叶结点。
(3)返回(2)直至不能继续为止,得到损失函数最小的子树 T α T_{\alpha} Tα
最小二乘回归树生成算法
输入:训练数据集 D D D
输出:回归树 f ( x ) f(x) f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域,并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量 j j j与切分点 s s s,求解 m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 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] minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]遍历遍历 j j j,对固定的切分变量 j j j扫描切分点 s s s,选择使上式达到最小值的 ( j , s ) (j,s) (j,s)
(2)用选定的 ( j , s ) (j,s) (j,s)划分区域并决定相应的输出值
(3)继续对两个子区域调用步骤(1)(2)直至满足停止条件
(4)将输入空间划分为M个区域 R 1 , R 2 , ⋯ , R M R_1,R_2,\cdots,R_M R1,R2,⋯,RM,生成决策树 f ( x ) = ∑ m = 1 M c ^ m I ( x ∈ R m ) f(x)=\sum_{m=1}^M\hat c_mI(x\in R_m) f(x)=m=1∑Mc^mI(x∈Rm)
1. 剪枝,形成一个子树序列
2.在剪枝得到的子树序列中通过交叉验证选取最优子树