基于ID3、C4.5算法的决策树相关知识

基础概念

离散型变量X的概率分布是P(X)。它的H(X)  or  H(P){H(X) \; or \; H(P)}越大,代表越均匀、越混乱、越不确定。熵的公式如下:
H(P)=xXP(x)logP(x) {H(P)} = {- \sum_{x \in X}P(x) \log P(x)}
定义0log0=00\log0=0,熵是非负的。熵只与XX的分布有关,与XX取值无关。当X服从均匀分布时,熵最大。

假设随机变量X只取两个值,如0和1。此时X的分布为:
H(p)=plog2p(1p)log2(1p) H(p)=-plog_2p-(1-p)log2(1-p)
此时,H§随着概率p的变换曲线如下图所示:

基于ID3、C4.5算法的决策树相关知识

当p=0或者1时,随机变量完全是个确定值。所以熵达到了最小值,即H(p)=0H(p) = 0。但是当p0=p1=0.5p_0=p_1=0.5时,不确定性最大,熵达到了最大值1。

条件熵

条件熵H(Y|X)类似于条件概率,它度量了我们的Y在知道X以后剩下的不确定性,即给定X的条件下,Y的条件概率分布的熵对X的数学期望。表达式如下:
H(YX)=j=1np(xj)H(Yxj)=i=1np(xi,yi)logp(yixi) H(Y|X) = \sum\limits_{j=1}^{n}p(x_j)H(Y|x_j) = -\sum\limits_{i=1}^{n}p(x_i,y_i)logp(y_i|x_i)
当熵和条件熵中的概率p由数据估计(常见的是用极大似然估计)得到的时,对应的熵和条件熵成为经验熵和经验条件熵。

信息增益

特征A对数据集D的信息增益g(D|A)定义为:集合D的经验熵H(D)与特征A给定的条件下DD的经验条件熵H(DA)H(D|A)之差:
g(D,A)=H(D)H(DA) g(D,A)=H(D)-H(D|A)
一般的熵与条件熵的差也称为互信息。表示给定特征A使得数据集D不确定性减少的程度。显然不同的特征有不同的信息增益,使得信息增益最大的特征具有更强的分类能力。

信息增益算法:

输入:训练数据集DD和特征AA

输出:特征AA对训练数据集DD的信息增益g(D,A)g(D,A)

  1. 数据集DD的经验熵H(D)=k=1KCkDlog2CkDH(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|}
  2. 特征AA对数据集DD的经验条件熵H(DA)=i=1nDiDH(Di)=i=1nDiDk=1KDikDilog2DikDiH(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|}
  3. 信息增益g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A)

其中,|D|表示样本个数。假设有K个类,每个类用CkC_k表示,|CkC_k|表示属于第k个类别的样本个数。特征A有n个不同的取值{α1,α2,...,αn\alpha_1, \alpha_2,..., \alpha_n},那么用DiD_i表示特征A取第i个值的样本集合,DikD_{ik}用于表示DiD_i中属于第k个类别的样本集合。

举个例子:

基于ID3、C4.5算法的决策树相关知识

首先计算经验熵H(D):
H(D)=(915log2915+615log2615)=0.971 H(D) = -(\frac{9}{15}log_2\frac{9}{15} + \frac{6}{15}log_2\frac{6}{15}) = 0.971
分别用A1,A2,A3,A4A_1,A_2,A_3,A_4表示年龄、有工作、有房子、贷款情况4个特征,则有:
H(DA1)=515H(D1)+515H(D2)+515H(D3)=515(35log235+25log225)515(25log225+35log235)515(45log245+15log215)=0.888 \begin{aligned} H(D|A_1) &= \frac{5}{15}H(D1) + \frac{5}{15}H(D2) + \frac{5}{15}H(D3) \\ &= -\frac{5}{15}(\frac{3}{5}log_2\frac{3}{5} + \frac{2}{5}log_2\frac{2}{5}) - \frac{5}{15}(\frac{2}{5}log_2\frac{2}{5}\\ & \quad+ \frac{3}{5}log_2\frac{3}{5}) -\frac{5}{15}(\frac{4}{5}log_2\frac{4}{5} + \frac{1}{5}log_2\frac{1}{5})\\ &= 0.888 \end{aligned}
于是得到特征A1A_1的信息增益为:
g(DA1)=H(D)H(DA1)=0.083 g(D|A_1) = H(D)-H(D|A_1) = 0.083
同理可以得到:
g(DA2)=H(D)H(DA2)=0.324g(DA3)=H(D)H(DA3)=0.420g(DA4)=H(D)H(DA4)=0.363 g(D|A_2) = H(D)-H(D|A_2) = 0.324 \\ g(D|A_3) = H(D)-H(D|A_3) = 0.420 \\ g(D|A_4) = H(D)-H(D|A_4) = 0.363
发现A3A_3的信息增益最大,因此A3A_3为最优特征。

信息增益比

以信息增益来筛选最优特征,会导致取值个数多的特征信息增益很大。例如我们把每条记录的唯一标识ID作为特征的话,那么每个ID的值都能唯一区分一条记录的类别,这样肯定会造成过拟合从而达不到我们预期的效果。

为此,我们引入了信息增益比来校正这一问题,用gR(D,A)g_R(D,A)表示:
gR(D,A)=g(D,A)HA(D)HA(D)=i=1nDiDlog2DiD g_R(D,A)= \frac{g(D,A)}{H_A(D)} \\ H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}
即信息增益比为 特征A的信息增益 与 D关于特征A各个取值的熵 之比。

决策树生成

前面提到的信息增益和信息增益比,可以用来衡量某个特征对样本的划分能力。基于之前讲到的内容,接下来介绍的ID3生成算法和C4.5生成算法。

ID3生成算法

输入:训练数据集DD, 特征集AA,阈值ϵ\epsilon
输出:决策树TT

  1. 如果DD属于同一类CkC_kTT为单节点树,类CkC_k作为该节点的类标记,返回TT
  2. 如果AA是空集,置TT为单节点树,实例数最多的类作为该节点类标记,返回TT
  3. 计算gg, 选择信息增益最大的特征AgA_g
  4. 如果AgA_g的信息增益小于ϵ\epsilonTT为单节点树,DD中实例数最大的类CkC_k作为类标记,返回TT
  5. AgA_g的不同特征取值可以划分出若干非空子集DiD_i
  6. DiD_i训练集,AAgA-A_g为特征集,递归调用前面步骤,得到TiT_i,返回TiT_i

举个例子,由于特征A3A_3的信息增益最大,所以选择对应的特征“有房子”作为决策树的根节点。根据A3A_3取值的不同,导致树形成了“是”(D1D_1)与“否”(D2)两个分支。对于两个分支,还需要继续对分支后的数据D1,D2D_1, D_2分别找新的划分特征。对于D1D_1中的样本而言,他们都是一个类别,所以作为叶节点。

例如对D2D_2而言,需要从年龄、有工作、贷款情况中选择新特征:
g(D2A1)=H(D2)H(D2A1)=0.251g(D2A2)=H(D2)H(D2A2)=0.918g(D2A3)=H(D2)H(D2A3)=0.474 g(D_2|A_1) = H(D_2)-H(D_2|A_1) = 0.251 \\ g(D_2|A_2) = H(D_2)-H(D_2|A_2) = 0.918 \\ g(D_2|A_3) = H(D_2)-H(D_2|A_3) = 0.474
于是,选择A2A_2对应的特征“有工作”来继续划分数据集,由于“是”有工作的子集有3个样本,且这三个样本都属于同一个类别,于是这是一个叶节点。对于标记为“否”的分支的6个样本也都属于一个类别,所以也是一个叶节点。最终得到的决策树为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eweq9C8L-1589329455836)(F:\****\树模型\决策树\assets\1589181996988.png)]

ID3算法不足之处:

  1. 容易过拟合
  2. 没有考虑连续特征的处理
  3. 没有考虑缺失值处理
  4. 偏好于将特征取值个数多的作为重要特征

决策树剪枝

越是复杂的决策树,越是容易过拟合,解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,这个过程称为剪枝。

剪枝往往通过极小化决策树整体的损失函数或者代价函数来实现。

TT的叶结点个数为T|T|tt是树TT的叶结点,该结点有NtN_t个样本点,其中kk类的样本点有NtkN_{tk}个,Ht(T)H_t(T)为叶结点tt上的经验熵, α0\alpha\geqslant 0为参数,决策树学习的损失函数可以定义为
Cα(T)=i=1TNtHt(T)+αT C_\alpha(T)=\sum_{i=1}^{|T|}N_tH_t(T)+\alpha|T|
其中
Ht(T)=kNtkNtlogNtkNt H_t(T)=-\sum_k\frac{N_{tk}}{N_t}\color{black}\log \frac{N_{tk}}{N_t}

C(T)=t=1TNtHt(T)=t=1Tk=1KNtklogNtkNt C(T)=\sum_{t=1}^{|T|}N_tH_t(T)\color{black}=-\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}\color{black}\log\frac{N_{tk}}{N_t}

这时有
Cα(T)=C(T)+αT C_\alpha(T)=C(T)+\alpha|T|
其中C(T)C(T)表示模型对训练数据的误差,T|T|表示模型复杂度,参数α0\alpha \geqslant 0控制两者之间的影响。

树的剪枝算法如下:

输入:生成算法生成的整个树TT,参数α\alpha

输出:修剪后的子树TαT_\alpha

  1. 计算每个叶结点的经验熵

  2. 递归的从树的叶结点向上回溯
    假设一组叶结点回溯到其父结点之前与之后的整体树分别是TBT_BTAT_A,其对应的损失函数分别是Cα(TA)C_\alpha(T_A)Cα(TB)C_\alpha(T_B),如果Cα(TA)Cα(TB)C_\alpha(T_A)\leqslant C_\alpha(T_B)则进行剪枝,即将父结点变为新的叶结点:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjC6Z4fY-1589329455839)(F:\****\树模型\决策树\assets\1589188171003.png)]

  3. 返回2,直至不能继续为止,得到损失函数最小的子树TαT_\alpha

C4.5生成算法

对于ID3算法的第一个缺陷,C4.5算法可以通过剪枝的方式,增强了模型的泛化能力。

对于第二个缺陷:不能处理连续特征, C4.5的思路是将连续的特征离散化。比如特征A的连续特征值有n个,从小到大排列为a1,a2,...,an{a_1,a_2,...,a_n},则C4.5取相邻两样本值的平均数,一共取得n-1个划分点,其中第i个划分点TiT_i表示为:Ti=ai+ai+12T_i = \frac{a_i+a_{i+1}}{2}。对于这n-1个点,分别计算以该点作为二元分类点时的信息增益:
g(D,a)=H(D)H(Da) g(D,a)=H(D)-H(D|a)
选择n-1个信息增益中最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为ata_t,则小于ata_t的值为类别1,大于ata_t的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

对于第三个缺陷:没有考虑对缺失值的处理。C4.5主要解决两个问题:

(1)如何在属性值缺失的情况下进行划分属性选择?

(2)给定划分属性,若样本在该属性上缺失,如何对样本进行划分?

对于问题(1),给定训练集D和属性A,令D^\hat D 表示D中在属性A上没有缺失值的样本子集。假定A的取值有v个:{a1,a2,,av}\{a_1,a_2,\ldots,a_v\},令D^v\hat D^v 表示在属性A上取值为ava_v 的样本子集(如:是否有工作)。D^k\hat D_k 表示D^\hat D 中第k类样本子集。为每一个样本xx赋予一个权重wxw_x,定义:

对于属性A,无缺失样本所占的比例为:
ρ=xD^wxxDwx \rho = \frac{\sum_{x\in\hat D} w_ \mathbf x}{\sum_{x\in D} w_ \mathbf x}
无缺失样本中第k类所占的比例为:
p^k=xD^kwxxD^wx \hat p_k =\frac{\sum_{x\in\hat D_k} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x}
无缺失样本中在属性A上取值为ava_v 的样本所占的比例为:
r^v=xD^vwxxD^wx \hat r_v =\frac{\sum_{x\in\hat D^v} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x}
样本存在缺失值的情况下,采用以下的信息增益计算方式:
g(D,A)=ρ×g(D^,A)=ρ×(H(D^)H(D^A)) \begin{aligned} g(D,A)&=\rho \times g(\hat D,A) \\ &= \rho \times \left(H(\hat D)-H(\hat D|A)\right) \end{aligned}
其中:
H(D^)=k=1kp^klog2p^kH(D^A)=v=1vr^vH(D^v) H(\hat D)=-\sum_{k=1}^k\hat p_k\log_2\hat p_k\\ H(\hat D|A) = \sum_{v=1}^v \hat r_v H(\hat D^v)
其实就是:第一步先计算无缺失值的样本的各个特征的信息增益,然后乘以该特征的无缺失样本的占比。再选择信息增益最大的特征作为划分特征。这也就回答了第一个问题。

对于问题(2),可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。

对于第四个缺陷:特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。即采用信息增益比来选择特征:
gR(D,A)=g(D,A)HA(D)HA(D)=i=1nDiDlog2DiD g_R(D,A)=\frac{g(D,A)}{H_A(D)}\\ H_A(D)=-\sum_{i=1}^n\frac{D_i}{D}log_2\frac{D_i}{D}
C4.5 算法流程如下:

输入:训练数据集DD,特征集AA,阈值ϵ\epsilon
输出:决策树TT

  1. 如果DD属于同一类CkC_kTT为单节点树,类CkC_k作为该节点的类标记,返回TT
  2. 如果AA是空集, 置TT为单节点树,实例数最多的作为该节点类标记,返回TT
  3. 计算gg, 选择信息增益比最大的特征AgA_g
  4. 如果AgA_g信息增益比小于ϵ\epsilonTT为单节点树,DD中实例数最大的类CkC_k作为类标记,返回TT
  5. AgA_g划分若干非空子集DiD_i
  6. DiD_i训练集,AAgA-A_g为特征集,递归调用前面步骤,得到TiT_i,返回TiT_i

ID3和C4.5在生成上,差异只是准则不同。

C4.5 同样具有局限性,仍然有优化的空间:

  1. C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。

  2. C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。

  3. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

下一篇介绍的使用CART算法生成的决策树一定程度上解决了这些问题。

参考文章:

《统计学习方法 第二版》

决策树算法原理(上)

决策树算法原理(下)