算法核心:在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。
具体方法:从根结点(root node)开始,对结点计算所有可能的特征信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择未知。最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
算法:ID3算法
输入:训练数据集D,特征集A,阈值 ϵ \epsilon ϵ;
输出:决策树T
(1)若D中所有实例属于同一类 C k C_k Ck,则T为单结点数,并将类 C k C_k Ck作为该结点的类标记,返回T;
(2)若 A = ∅ A=\emptyset A=∅,则T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
(3)否则,按信息增益算法计算A中各特征对D的信息增益,选择信息增益最大的特征 A g A_g Ag;
(4)如果 A g A_g Ag的信息增益小于阈值 ϵ \epsilon ϵ,则置T为单结点数,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
(5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai将D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
(6)对第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。
例:对贷款申请的训练数据集,利用ID3算法建立决策树。
解:利用信息增益例子的结果,由于特征 A 3 A_3 A3(有自己的房子)的信息增益值最大,所以选择特征 A 3 A_3 A3作为根结点的特征。它将训练数据集D划分为两个子集 D 1 D_1 D1( A 3 A_3 A3取值为“是”
和 D 2 D_2 D2( A 3 A_3 A3取值为“否”)。由于 D 1 D_1 D1只有同一类的样本点,所以它成为一个叶结点,结点的类标记为“是”。
对 D 2 D_2 D2则需从特征 A 1 A_1 A1(年龄), A 2 A_2 A2(有工作)和 A 4 A_4 A4(信贷情况)中选择新的特征。计算各个特征的信息增益:
g ( D 2 , A 1 ) = H ( D 2 ) − H ( D 2 ∣ A 1 ) = 0.918 − 0.667 = 0.251 g ( D 2 , A 2 ) = H ( D 2 ) − H ( D 2 ∣ A 2 ) = 0.918 g ( D 2 , A 4 ) = H ( D 2 ) − H ( D 2 ∣ A 4 ) = 0.474 g(D_2,A_1)=H(D_2)-H(D_2|A_1)=0.918-0.667=0.251 \\ g(D_2,A_2)=H(D_2)-H(D_2|A_2)=0.918 \\ g(D_2,A_4)=H(D_2)-H(D_2|A_4)=0.474 g(D2,A1)=H(D2)−H(D2∣A1)=0.918−0.667=0.251g(D2,A2)=H(D2)−H(D2∣A2)=0.918g(D2,A4)=H(D2)−H(D2∣A4)=0.474
选择信息增益最大的特征 A 2 A_2 A2(有工作)作为结点的特征。由于 A 2 A_2 A2有两个可能取值,从这一结论引出两个子结点:一个对应“是”(有工作)的子结点,包含3个样本,它们属于同一类,所以这是一个叶结点,类标记为“是”;另一个是对应“否”(无工作)的子结点,包含6个样本,它们也属于同一类,所以这也是一个叶结点,类标记为“否”。
这样生成一个决策树,该决策树只用了两个特征,该决策树只用了两个特征(有两个内部结点)。
ID3算法只有树的生成,所以该算法生成的树容易产生过拟合。
本质:与ID3算法相似,C4.5算法对ID3算法进行了改造,在生成的过程中,用信息增益比来选择特征。
算法:C4.5的生成算法
输入:训练数据集D,特征集A,阈值 ϵ \epsilon ϵ;
输出:决策树T
(1)如果D中所有实例属于同一类 C k C_k Ck,则置T为单结点树,并将 C k C_k Ck作为该结点的类,返回T;
(2)如果 A = ∅ A=\emptyset A=∅,则置T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类,返回T;
(3)否则,按信息增益比计算A中各特征对D的信息增益比,选择信息增益比最大的特征 A g A_g Ag;
(4)如果 A g A_g Ag的信息增益比小于阈值 ϵ \epsilon ϵ,则置T为单结点树,并将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 i D_i Di,将 D i D_i Di中实例最大的类作为标记,构建子结点,由结点及其子结点构成树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):在决策树学习中将已生成的树进行简化。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。设树T的叶结点个数为 ∣ T ∣ |T| ∣T∣,t是树T的叶结点,该叶结点有 N t N_t Nt个样本点,其中k类的样本点有 N t k N_{tk} Ntk个, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K, H t ( T ) H_t(T) Ht(T)为叶结点t上的经验熵, α ≥ 0 \alpha \geq 0 α≥0为参数,则决策树学习的损失函数定义为
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ (1) C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| \tag{1} Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣(1)
其中经验熵为
H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T)=-\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=−k∑NtNtklogNtNtk
在损失函数中,将式(1)右端的第1项记作
C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k − 1 K N t k l o g N t k N t C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k-1}^KN_{tk}log\frac{N_{tk}}{N_t} C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k−1∑KNtklogNtNtk
这时有
C α ( T ) = C ( T ) + α ∣ T ∣ (2) C_\alpha(T)=C(T)+\alpha|T| \tag{2} Cα(T)=C(T)+α∣T∣(2)
其中, C ( T ) C(T) C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| ∣T∣表示模型复杂度,参数 a ≥ 0 a\geq 0 a≥0控制两者之间的影响。较大的 α \alpha α促使选择较简单的模型(树),较小的促使选择较复杂的模型的模型(树)。 a = 0 a=0 a=0意味着值考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
剪枝本质:当 α \alpha α确定时,选择损失函数最小的模型,即损失函数最小的子树,当 α \alpha α值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
可以看出,决策树生成值考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
式(1)或式(2)定义的损失函数的极小化等价于正则化的极大似然估计,所以,利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
算法:树剪枝算法
输入:生成算法产生的整个树T,参数 α \alpha α;
输出:修剪后的子树 T α T_\alpha Tα
(1)计算每个结点的经验熵
(2)递归地从树的叶结点向上回缩。
设一组叶结点回缩到其父结点之前与之后的整体树分别是 T B T_B TB与 T A T_A TA,其对应的损失函数值分别是 C α ( T B ) C_\alpha(T_B) Cα(TB)与 C α ( T A ) C_\alpha(T_A) Cα(TA),如果
C α ( T A ) ≤ C α ( T B ) (3) C_\alpha(T_A)\leq C_\alpha(T_B) \tag{3} Cα(TA)≤Cα(TB)(3)
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树 T α T_\alpha Tα
注意式(3)只需考虑两个树的损失函数的差,其计算可以再局部进行。所以,决策树的剪枝算法可以由一种动态规划的算法实现。