【机器学习】决策树生成与剪枝详解

1. 决策树模型

决策树是一种基于树的结构来进行决策的模型。它从根结点开始,对样本的某一特征进行测试,根据测试结果将样本分配到子结点中;然后不断递归地对样本进行测试再分配,直到达到叶结点;最后将样本分到叶结点的类中。

决策树本质上就是从训练数据集中归纳出一组规则,可以把决策树看成是if-then规则的集合。决策树学习通常包括三个步骤:划分选择、决策树生成、决策树剪枝。决策树生成只考虑局部最优,决策树剪枝则考虑全局最优。

2. 优缺点

优点:

       1. 决策树模型具有可解释性,输出结果易于理解;

       2. 对中间值的缺失值不敏感;

       3. 对数值大小不敏感,不需要提前进行归一化。

缺点:

       1. 非常容易过拟合,导致泛化能力不强;

       2. 样本的一点改变就会导致树结构的剧烈改变;

       3. 寻找最优决策树是NP完全问题,一般采用启发式方法来近似求解,易陷入局部最优。

3. 划分选择

最优划分选择的目的是选取对训练数据具有分类能力的特征,使划分后的分支节点所包含的样本尽可能属于同一类别,提高决策树学习的效率。

通常划分选择准则包括信息增益、信息增益率、和基尼系数。

3.1 信息增益(Information gain)

在解释信息增益之前,我们先给出信息熵和条件熵的定义。

信息熵(Information entropy)是表示随机变量的不确定性的一种指标。那么集合D的信息熵就定义为:

                                             Ent\left( D \right) = - \sum\limits_{k = 1}^{\left| \kappa \right|} {​{p_k}{​{\log }_2}{p_k}}          (1)

其中,{​{p_k}}代表D中第k类样本所占的比例,k = 1,2, \ldots ,\kappa,如果{p_k} = 0,那么{p_k}{\log _2}{p_k} = 0。信息熵越小,说明集合D的不确定性越小,纯度越高。

条件熵(Conditional entropy)表示在已知随机变量X的条件下随机变量Y的不确定性。则在特征a给定的条件下D的条件熵:

                                             Ent\left( {D\left| a \right.} \right) = \sum\limits_{v = 1}^V {\frac{​{\left| {​{D^v}} \right|}}{​{\left| D \right|}}} Ent\left( {​{D^v}} \right)          (2)

信息增益(Information gain)表示得知特征a可以使得数据集D的类别不确定性减少的程度。

假设离散属性aV个可能取值,产生V个分支结点,D^v表示第v个分支结点,包含了D中所有在特征a上取值为a^v的样本。那么,用特征a对样本集D进行划分所得到的信息增益就表示为集合D的信息熵Ent\left( D \right)与特征a给定条件下D的条件熵Ent\left( {D\left| a \right.} \right)之差,即:

                                             \begin{array}{l} Gain\left( {D,a} \right) = Ent\left( D \right) - Ent\left( {D\left| a \right.} \right)\\ = Ent\left( D \right) - \sum\limits_{v = 1}^V {\frac{​{\left| {​{D^v}} \right|}}{​{\left| D \right|}}} Ent\left( {​{D^v}} \right) \end{array}          (3)

信息增益越大,说明使用特征a进行划分所获得的“不确定性减少”越多。

ID3(Iterative Dichotomiser,迭代二分器)算法就是用信息增益作为划分准则,也就是选择能够最大化信息增益的特征{a_*} = \mathop {\arg \max }\limits_{a \in A} Gain\left( {D,a} \right)作为最优划分特征。

3.2 信息增益率(Information gain ratio)

信息增益准则偏向于选择可取值数目较多的特征,信息增益率可以校正这一问题。

信息增益率定义为信息增益Gain\left( {D,a} \right)与训练集D关于特征a的熵En{t_a}\left( D \right)

                                             Gain\_ratio\left( {D,a} \right) = \frac{​{Gain\left( {D,a} \right)}}{​{En{t_a}\left( D \right)}}          (4)

其中,En{t_a}\left( D \right) = - \sum\limits_{v = 1}^V {​{p_v}{​{\log }_2}{p_v}}{​{p_v}}代表Da特征上取值为v的样本所占的比例。

与信息增益相反的是,增益率准则偏向于选择可取值数目较少的特征。

C4.5就是采用增益率作为划分准则,但它并不是直接选择增益率最大的候选划分特征,而是采用了一个启发式选择:先从候选划分特征中找出信息增益高于平均水平的特征,再从中选择增益率最高的。

3.3 基尼系数(Gini index)

数据集D的不确定性可以用基尼系数来度量,给定数据集D的基尼系数定义为:

                                             Gini\left( D \right) = \sum\limits_{k = 1}^{\left| \kappa \right|} {\sum\limits_{k' \ne k} {​{p_k}{p_{k'}}} } = 1 - \sum\limits_{k = 1}^{\left| \kappa \right|} {p_k^2}          (5)

Gini\left( D \right)反映了从D中随机抽取两个样本,类别标记不一致的概率。

在特征a的条件下,D的基尼系数定义为:

                                             Gini\left( {D,a} \right) = \sum\limits_{v = 1}^V {\frac{​{\left| {​{D^v}} \right|}}{​{\left| D \right|}}} Gini\left( {​{D^v}} \right)          (6)

Gini\left( {D,a} \right)表示经特征a划分后集合D的不确定性,基尼系数值越大,样本集合的不确定性也越大。

CART(Classification and regression tree,分类回归树)以基尼系数作为划分准则,即选择能最小化基尼系数的特征{a_*} = \mathop {\arg \min }\limits_{a \in A} Gini \left( {D,a} \right)作为最优划分特征。

4. 决策树生成

下面介绍ID3和C4.5的生成算法,CART有一些变化,之后再介绍。

输入:训练集D,特征集A,阈值\varepsilon

过程:函数TreeGenerate\left( {D,a} \right)

       1. 生成结点node

       2. 如果D中样本全属于同一类 C,则置nodeC类叶结点; 返回 node

       3. 如果A = \emptyset或者D中所有样本在A上取值都相同,则将node置为叶结点,其类别标记为D中样本数最多的类,返回node

       4. 否则,对A中所有a 都计算信息增益或增益率,从中选择最优划分特征{a_*}

       5. 如果特征{a_*}的不确定性提升(如信息增益,信息增益比)小于阈值\varepsilon,则将node置为叶结点,其类别标记为D中样本数最多的类,返回node

       6. 否则,按照{a_*}的每一个可能值{a_*^v},将D分割成若干个非空子集D^v,每个子集对应构建一个子结点,其类别标记为D^v中样本数最多的类,返回节点node及其子结点构成的树;

       7. 最后,对所有分支结点v,以D^v为训练集,A - \left\{ {​{a_*}} \right\}为特征集,递归调用TreeGenerate\left( {​{D^v},A - \left\{ {​{a_*}} \right\}} \right),得到子树T_v,并将其结合到T上。

输出:一棵以node为根结点的决策树T

5. 决策树剪枝

由于决策树生成算法递归地生成决策树,直到不能继续下去为止,容易造成分支过多,导致过拟合。剪枝(pruning)通过从已生成的树上减掉一些子树或者叶结点来简化决策树模型,缓解过拟合。

决策树剪枝可分为“预剪枝”(prepruning)和“后剪枝”(postpruning)。

(1)预剪枝

预剪枝是自上而下的剪枝,指在决策树生成过程中,对每个结点进行事先估计,如果当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶结点。

优点:

       1. 预剪枝使很多分支都没有展开,降低了过拟合的风险。

       2. 显著减少决策树的时间开销。

缺点:预剪枝的贪心本质禁止这些分支展开,带来了欠拟合风险。

(2)后剪枝

后剪枝是自下而上的剪枝,指对一棵已经生成的完整决策树自下而上地对非叶节点进行估计,如果将该结点对应的子树替换成叶结点能够带来决策树泛化性能的提升,则将该子树替换成叶结点。

相比于预剪枝,后剪枝是一种更常用的方法,因为在预剪枝中精确估计何时停止树增长很困难。

优点:欠拟合风险小,泛化性能往往优于预剪枝。

缺点:要对树中所有非叶结点进行逐一考察,时间开销很大。

后剪枝主要包括:Reduced-Error Pruning(REP,错误率降低剪枝),Pesimistic-Error Pruning(PEP,悲观错误剪枝),Cost-Complexity Pruning(CCP,代价复杂度剪枝),Error-Based Pruning(EBP,基于错误的剪枝)。

6. 代价复杂度剪枝算法

CCP剪枝最为常用,下面我们主要讨论CCP剪枝算法。

CCP剪枝算法由两步组成:

1. 剪枝,形成一个子树序列。

决策树学习的损失函数可以定义为:

                                                     {C_\alpha }\left( T \right) = C\left( T \right) + \alpha \left| T \right|          (7)

其中,T为任意子树,\left| T \right|是子树的叶结点个数,C\left( T \right)表示模型对训练数据的预测误差,是T树中所有叶结点的预测误差之和(ID3是信息增益,C4.5是增益率,CART的回归树是均方差,决策树是基尼系数)。\alpha \ge 0是正则化参数,用来权衡对训练数据的拟合程度和模型复杂度。{C_\alpha }\left( T \right)表示子树T的整体损失。

对于一个固定的\alpha,一定存在使损失函数{C_\alpha }\left( T \right)最小的子树{T_\alpha },这样的最优子树是唯一的。\alpha较大时,最优子树{T_\alpha }偏小;\alpha较小时,最优子树{T_\alpha }偏大。极端情况下,\alpha = 0时整体树是最优的,\alpha \to \infty时,根结点组成的单节点树最优。

Breiman等人证明:可以用递归的方法对树进行剪枝。将\alpha从小增大,0 = {\alpha _0} < {\alpha _1} < \cdots < {\alpha _n} < + \infty,产生一系列区间\left[ {​{\alpha _i},\left. {​{\alpha _{i + 1}}} \right)} \right.,i = 0,1, \cdots ,n;剪枝得到的子树序列对应着区间\alpha \in \left[ {​{\alpha _i},\left. {​{\alpha _{i + 1}}} \right)} \right.,i = 0,1, \cdots ,n的最优子树序列\left\{ {​{T_0},{T_1}, \cdots ,{T_n}} \right\},序列的子树是嵌套的。

具体来说,剪枝前,以t为根结点的子树T_t的损失函数为:{C_\alpha }\left( {​{T_t}} \right) = C\left( {​{T_t}} \right) + \alpha \left| {​{T_t}} \right|

剪枝后,以t为单结点树的损失函数为:{C_\alpha }\left( {​{T_t}} \right) = C\left( t ) + \alpha

那么一定存在一个\alpha,使得{C_\alpha }\left( {​{T_t}} \right) = {C_\alpha }\left( t \right)。也就是说,只要\alpha = \frac{​{C\left( t \right)-C\left( {​{T_t}} \right) }}{​{\left| {​{T_t}} \right| - 1}},则剪枝前和剪枝后的损失函数值相等。但显然剪枝后的t单结点树结点更少,更可取,因此有必要将子树T_t进行剪枝形成t

对树T_k每一个内部结点t,都计算其g(t) = \frac{​{C\left( t \right)-C\left( {​{T_t}} \right) }}{​{\left| {​{T_t}} \right| - 1}}值,并选出最小的g(t)值作为\alpha_{k+1},从T_k中减去使\alpha_{k+1}最小的T_t,得到T_{k+1}T_{k+1}是区间\left[ {​{\alpha _{k+1}},\left. {​{\alpha _{k+2}}} \right)} \right.的最优子树。如此剪枝下去,直到得到根结点。在这一过程中,不断增加\alpha的值,产生新的区间。

2. 在剪枝得到的子树序列{T_0},{T_1}, \cdots ,{T_n}中通过交叉验证选取最优子树{T_\alpha }

利用独立的验证数据集,测试子树序列{T_0},{T_1}, \cdots ,{T_n}中各子树的预测误差,预测误差最小的决策树被当做最优决策树{T_\alpha },且对应的\alpha_k也确定了。


算法流程如下:

输入:已经生成的决策树T_0

过程:函数TreePruning\left( {T_0})

       1. 令k=0T=T_0

       2. 令\alpha = + \infty

       3. 自下而上地对树T所有内部结点计算g(t) = \frac{​{C\left( t \right)-C\left( {​{T_t}} \right) }}{​{\left| {​{T_t}} \right| - 1}},并将\alpha置为\alpha = \min \left( {\alpha ,g\left( t \right)} \right)

       4. 对g\left( t \right) = \alpha的内部结点t进行剪枝,并将叶结点t的类别标记为t中样本数最多的类,得到新的树T

       5. 令k = k + 1{\alpha _k} = \alpha{T_k} = T

       6. 如果T_k是由根节点及其子结点构成的二层树(迭代结束条件),则令{T_k} = {T_n};否则回到步骤3;

       7. 采用交叉验证法在子树序列{T_0},{T_1}, \cdots ,{T_n}中选择最优子树T_\alpha

7. 连续值处理

上面仅讨论了利用离散特征来生成决策树,当遇到连续特征时,由于可取值数目不再有限。因此,需要对连续特征进行离散化。最简单的策略是采用二分法进行连续特征离散化。

给定样本集D和连续属性a,将a的取值从小到大排序记为\left\{ {​{a^1},{a^2}, \cdots ,{a^n}} \right\},基于划分点sD划分为{R_1}\left( {a,s} \right) = \left\{ {x\left| {​{x^a} \le s} \right.} \right\}{R_2}\left( {a,s} \right) = \left\{ {x\left| {​{x^a} > s} \right.} \right\}

对于相邻的特征取值a^{i}a^{i+1}来说,划分点s\left[ {​{a^i},{a^{i + 1}}} \right)中的任意值所产生的划分结果都相同,所以对连续属性a,候选划分点共n-1个,划分集合为:

                                                     {T_j} = \left\{ {\frac{​{​{a^i} + {a^{i + 1}}}}{2}\left| {1 \le i \le n - 1} \right.} \right\}          (8)

即把\left[ {​{a^i},{a^{i + 1}}} \right)的平均数{\frac{​{​{a^i} + {a^{i + 1}}}}{2}}作为候选划分点。

与离散特征不同的是,如果当前节点划分特征是连续特征,该特征之后还可作为其后代结点的划分特征。 

8. 缺失值处理

对于缺失值的处理,主要包含两个问题:

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

假定特征aV个可能取值,\widetilde {​{D}}^v表示\widetilde D中在特征a上取值为a^v的样本子集。\widetilde {​{D}}_k表示\widetilde D中属于第k类的样本子集。假定给每个样本x赋予一个权重w_x,初始权重都为1。

需要明确的是,我们仅可以根据在特征a上没有缺失值的样本子集\widetilde D来进行划分选择。

我们只利用有特征值a的样本子集\widetilde D计算信息增益/增益率/基尼系数,并在结果上乘上无缺失值样本所占的比例\rho = \frac{​{\sum\nolimits_{x \in \widetilde D} {​{w_x}} }}{​{\sum\nolimits_{x \in D} {​{w_x}} }}

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

如果样本x在划分特征a上取值已知,则将x划入与其对应的子节点,且样本权值在子结点中保持为{​{w_x}}

如果样本x在划分特征a上取值未知,则将x同时划入所有子节点,且样本权值调整为{\widetilde r_v} \cdot {w_x},其中{\widetilde r_v} = \frac{​{\sum\nolimits_{x \in {​{\widetilde D}^v}} {​{w_x}} }}{​{\sum\nolimits_{x \in \widetilde D} {​{w_x}} }}\left( {1 \le v \le V} \right)表示无缺失值样本中在属性a上取值为a^v的样本所占的比例。

下篇将讲到在决策树生成和剪枝的基本算法上,CART的不同之处。

参考文献:

1. 《机器学习》第四章决策树3——周志华

2. 《统计学习方法》第五章决策树——李航

3.   决策树算法原理(上)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值