决策树是一种基本的分类与回归方法。决策树的学习包含三个步骤:特征选择、决策树的生成、决策树的修剪。决策树根据不同的特征选择原则分为ID3算法、C4.5算法、CART算法。

基本概念

在介绍决策树之前先来了解一些基本相关概念。

1、熵

熵是随机变量不确定性的度量。设X是一个有限取值的离散随机变量,其概率分布为:
P(X=xi)=pi,i=1,2,n P(X=x_i) = p_i,\quad i=1,2,\ldots n
随机变量X的熵定义:
H(p)=H(X)=i=1npilogpi H(p)=H(X)=-\sum_{i=1}^{n}p_i\log p_i
熵只与XX的分布有关,与XX取值无关

当随机变量只有两个取值时,例如1,0,即X的分布:
P(X=1)=p,P(X=0)=1p P(X=1) = p,\quad P(X=0)=1-p
熵为:
H(p)=plogp(1p)log(1p) H(p)=-p\log p -(1-p)\log(1-p)
这时,熵H(p)H(p) 随概率pp变化的曲线如图所示:

决策树详解(上)
p=0p=0p=1p=1H(p)=0H(p)=0 随机变量完全没有不确定性。当p=0.5p=0.5 时,H(p)=1H(p)=1,熵取值最大,随机变量不确定性最大。

2、条件熵

定义为XX给定条件下YY的条件概率分布的熵对XX 的数学期望:
H(YX)=i=1npiH(YX=xi) H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)
其中pi=P(X=xi),i=1,2,,np_i=P(X=x_i),i=1,2,\dots ,n

3、信息增益

表示得知特征XX 的信息而使得类YY 的信息的不确定性减少的程度。

特征AA对训练数据集DD的信息增益g(DA)g(D|A),定义为集合DD的经验熵H(D)H(D)与特征AA给定的条件下DD的经验条件熵H(DA)H(D|A)之差
g(D,A)=H(D)H(DA) g(D,A)=H(D)-H(D|A)
熵与条件熵的差称为互信息。

给定训练数据集D和特征A,熵H(D)H(D) 表示对数据集D进行分类的不确定性。条件熵H(DA)H(D|A) 表示在特征A给定条件下对数据集D进行分类的不确定性。二者的差,即信息增益,表示由于特征A而使得对数据集D的分类的不确定性减少的程度,不同的特征有不同的信息增益,信息增益大的特征有更强的分类能力。

4、信息增益比

特征AA对训练数据集DD的信息增益gR(DA)g_R(D|A),定义为其信息增益g(D,A)g(D,A) 与训练数据集DD 关于特征AA 的值的熵HA(D)H_A(D)之比:
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}
nn 是特征AA 的取值个数。

ID3 算法

ID3算法的通过信息增益来进行特征选择生成决策树。

信息增益算法

输入:训练数据集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)

计算所有的特征的信息增益,根据信息增益的大小确定最优特征。

通过下面这个例子来说明ID3算法生成决策树的过程。

下表是由15个样本组成的贷款申请训练数据。

决策树详解(上)

希望通过所给的训练数据学习一个贷款申请决策树,用以对未来的贷款申请进行分类。

首先计算熵
H(D)=915log2915615log2615=0.971 H(D)=-\frac{9}{15}\log_2\frac{9}{15}-\frac{6}{15}\log_2\frac{6}{15}=0.971
然后计算各个特征对数据集D的信息增益,分别以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(D_1) + \frac{5}{15}H(D_2) + \frac{5}{15}H(D_3) \\&= -\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} + \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}
D1,D2,D3D_1,D_2,D_3 分别表示A1A_1(年龄) 取值为青年、老年、中年的样本子集。

年龄对应的信息增益为 g(D,A1)=H(D)H(DA1)=0.083 g(D,A_1) = H(D) - H(D|A_1) = 0.083 

同理计算是否有工作的信息增益为:
H(DA2)=H(D)[515H(D1)+1015H(D2)]=0.971[515×0+1015(410log2410610log2610)]=0.324 \begin{aligned} H(D|A_2) &= H(D) -\left[\frac{5}{15}H(D_1) + \frac{10}{15}H(D_2) \right] \\&= 0.971-\left[\frac{5}{15}\times 0+ \frac{10}{15}(-\frac{4}{10}log_2\frac{4}{10} - \frac{6}{10}log_2\frac{6}{10}) \right] \\&= 0.324 \end{aligned}
是否有房子的信息增益为:
H(DA3)=H(D)[615H(D1)+915H(D2)]=0.971[615×0+915(39log23969log269)]=0.420 \begin{aligned} H(D|A_3) &= H(D) -\left[\frac{6}{15}H(D_1) + \frac{9}{15}H(D_2) \right] \\&= 0.971-\left[\frac{6}{15}\times 0+ \frac{9}{15}(-\frac{3}{9}log_2\frac{3}{9} - \frac{6}{9}log_2\frac{6}{9}) \right] \\&= 0.420 \end{aligned}
信贷情况的信息增益:
H(DA4)=0.9710.608=0420 \begin{aligned} H(D|A_4) = 0.971 - 0.608=0420 \end{aligned}
比较后,发现特征A3A_3 (有自己的房子)的信息增益最大,所以选择特征A3A_3 作为最优特征。所以A3A_3 作为根结点的特征。然后将数据集分为两个子集D1D_1(拥有自己的房子)和D2D_2(没有自己的房子)。D1D_1 只有同一类样本点,所以他成为一个叶子结点。对于D2D_2 需要从特征A1A_1(年龄)、A2A_2(有工作)、A4A_4(信贷情况)中选择新的特征。计算各个特征的信息增益:
g(D2,A1)=H(D2)H(D2A1)=0.251g(D2,A2)=H(D2)H(D2A1)=0.918g(D2,A3)=H(D2)H(D2A1)=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_1) = 0.918\\ g(D_2,A_3) = H(D_2)-H(D_2|A_1) = 0.474\\
选择信息增益最大的特征A2A_2 作为结点特征。A2A_2 有两个可能的取值,从这一结点引出两个子结点:一个对应有工作的子结点,包含三个样本,均属于同一类,所以这是一个叶子节点。另一个是无工作的子结点,包含6个 样本,也属于同一类,所以这是一个叶子节点。所以就生成了如下的决策树:

决策树详解(上)
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

ID3 算法缺陷:

(1)容易过拟合

(2)没有考虑连续特征的处理

(3)没有考虑对缺失值的处理

(4)采用信息增益的特征选择方法,在相同的情况下,取值较多的特征比取值少的特征信息增益大。

为了改进这些不足,C4.5算法对ID3生成决策树算法进行了改进。

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)给定划分属性,若样本在该属性上缺失,如何对样本进行划分。

给定训练集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

C4.5缺陷:只能用于分类,不能用于解决回归问题。

决策树的剪枝

​ 决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考忠如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。

在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning) 。具体地,剪枝从已生成的树上裁掉一-些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。

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

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\color{red}\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|}\color{red}N_tH_t(T)\color{black}=-\sum_{t=1}^{|T|}\sum_{k=1}^K\color{red}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控制两者之间的影响。

(1) 当α\alpha 较大时,T|T| 较小,树的模型相对简单。

(2) 当α\alpha 较小时,T|T| 较大,树的模型相对复杂。

(3)当α=0\alpha=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)则进行剪枝,即将父结点变为新的叶结点:

决策树详解(上)

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

相关文章: