决策树(二)——树的剪枝

       对于一棵生长完成的决策树而言,剪枝的重要性不言而喻,对决策树进行剪枝,可以避免对训练集过拟合、削弱噪声数据的影响,提高决策树的泛化能力。剪枝的策略一般分为预剪枝和后剪枝,下面分别对二者进行介绍

    1. 预剪枝

       预剪枝是指在树的生长过程中进行剪枝的行为。在“决策树(一)——树的生长”一文中提到过,决策树最初始的生长停止条件有两种,一个是结点上所有的样本均属于同一类,另外一个就是用于结点划分的属性已经用完,实际上简单点说,预剪枝的过程就是新增一个条件来约束数的生长。

       采用一种比较普遍的做法,预剪枝过程可以简述为:以某性能指标设定一个阈值,当结点生成子树后所得的性能指标超过(或者低于)阈值时,则不继续划分该结点,并将该结点归于叶子结点。性能指标的设置,可以有多种,常见的有信息增益、增益率、基尼指数、误分类率等。

       预剪枝过程算法比较简单,且由于采用从上而下的方式,在计算上比较简单,但是它有一个缺点,即视野效果问题。对于某一个结点而言,其生成子女结点可能会产生过拟合想象、造成性能指标的下降,但是对其子女结点进一步划分后也许反而能提升数据分类的准确性,也能提升性能指标,在这种情况下决策树就过早的停止了生长,反而出现的“欠拟合”现象。所以一般来说,对于存在过拟合问题的决策树,后剪枝比预剪枝的精度更高。

    1. 后剪枝

        后剪枝是在决策树生长停止之后进行的剪枝行为,按照剪枝的方向,分为从上至下(top-bottom)和从下至上(bottom-top)。后剪枝方法有多种,除了剪枝方向的区别外,主要的区别在于剪枝的条件,现依据剪枝条件的不同,介绍一下常用的几种后剪枝方法。

     1.1 REP(Reduced Error Pruning)方法

        REP方法是Quinlan教授提出的,采用从下至上(bottom-top)的剪枝方式。使用该方法时,需要一个训练数据集和一个验证数据集,训练数据集用来生成决策树,验证数据集用来剪枝。该方法的基本思路是,从树底到树顶,对每个非叶子结点所生成的子树,将该子树用该结点代替,该过程就是剪枝,然后用验证数据集来判断剪枝前后的误差,若剪枝后误差增大,则不进行剪枝,反之则剪枝,对于给定的验证数据集,这里误差用该结点上验证数据样本的误分类数来表示。在实际应用时,也可以设定一个阈值,当误差超过该阈值时才进行剪枝。

       从剪枝的过程来看,REP方法是比较简单的,并且每个子树只需要访问一次,所以它的计算过程时线性的。该方法也存在不足之处。首先它需要一个验证数据集,这在样本数据量较少时是个问题。当样本数据量少时,验证数据集样本数量更少(一般2/3~4/5的样本用于训练,其余数据用于验证),在训练数据集中包含的信息可能验证数据集中没有出现,导致剪枝时剔除了这些信息,因此该方法不太适用于样本数据量比较少的情况。至于多大的样本数据量才能称之为“少”,这个问题应该没有明确的定义,一切都在实践中检验,如果在实际应用该方法剪枝时发现效果不太好,那么此时的样本数据量也许可以称之为“少”,当然效果不好也可能是其它原因导致,比如样本信息不全或者错误等,这个得分析明白了。

     1.2 PEP(Pessimistic Error Pruning)方法

        PEP方法是Quinlan教授为了弥补REP方法需要单独的验证数据集的缺点而提出的剪枝方法,该方法采用从上至下(top-bottom)的剪枝方式。由于剪枝时采用的仍是训练数据集,因此更趋向于不剪枝,毕竟子树能进一步做更准确的分类,为此PEP方法中对误差估计引入了连续性校正。未进行连续性校正前,子树上的叶子结点t_{i}的误分类率r(t_{i})定义为

                                                                                 r(t_{i})=e(t_{i})/n(t_{i})                                              (1)

        e(t_{i})为该叶子结点上的误分类数,n(t_{i})为该叶子结点所包含的样本数。对估计误差进行连续性校正之后,其误差率定义为

                                                                                r(t_{i})=(e(t_{i})+1/2)/n(t_{i})                                (2)

        这里连续性校正实际上是将每一个叶子结点上的误分类数增加了1/2,但是为什么是“1/2”这个值?我目前查阅的文献有限(主要是没有权限下载英文文献,工作之后就是这点不好。。。还是学校方便),还没弄明白这个,这里暂且先放下。引入连续性校正之后,假设子树的叶子结点数为k,则该子树的误分类数e(T)与误分类率r(T)分别为

                                                                                 e(T_{i})=\sum_{i=1}^{k}e(t_{i})+k/2                                    (3)

                                                                                r(T_{i})= \frac{\sum_{i=1}^{k}e(t_{i})+k/2}{\sum_{i=1}^{k}n(t_{i})}                                 (4)

        将子树剪掉、用叶子结点代替后,其误分类数e'(T)

                                                                               e'(T)=e(T)+1/2                                            (5)

        e(T)为未校正前的误分类数。对于指定的子树,树上的样本数是确定的,因此可以用误分类数代替误分类率,按照REP方法中的剪枝策略,当满足

                                                                                   e'(T)\leqslant e(T_{i})                                                  (6)

时即将子树剪掉,即使是进行了连续性校正,这个剪枝条件还是比较严格的。为此Quinlan教授引入了子树误分类数的标准误差参数SE[e(t_{i})}]来放宽剪枝条件,SE[e(t_{i})}]的定义为

                                                                        SE[e(T_{i})]=\sqrt{\frac{e(T_{i})[n(T)-e(T_{i})]}{n(T)}}                       (7)

       式(7)中n(T)为子树替换后得到叶子结点包含的样本数。此时剪枝的条件变为了

                                                                               e'(T)\leqslant e(T_{i})+SE[e(T_{i})]                                (8)  

      PEP方法是后剪枝方法中唯一采用从上至下(top-bottom)剪枝的方法,因而其有着与预剪枝方法一样的优点,就是效率高,但同时也存在与预剪枝一样的欠拟合问题,但是总体来说,PEP方法的剪枝精度是后剪枝方法中精度较高的方法之一,并且其不需要验证数据集,适用于样本较少的情况。

      我看到有的地方引入了统计学的知识来解释SE[e(t_{i})}]的引入以及其定义,但是有没有完整的说明为什么要这样做,我也确实没有弄明白原理,故这里没有介绍这方面的内容,只是介绍了计算部分,原理及思想部分实在是没有很明白。

 1.3 CCP(cost-complexity Pruning)方法

      CCP方法是Breiman等人提出的,剪枝时采用从下至上(bottom-top)的方式,该方法也是CART算法的剪枝方法。

      首先,定义子树的损失函数

                                                                              C_{\alpha }(T)=C(T)+\alpha |T|                                      (9)

       式(9)中,T表示任意的子树,C(T)表示子树对训练数据的预测误差(如基尼指数、误分类数等,由于CART算法使用基尼指数来选择优先划分属性,因此在CCP方法中此处一般使用基尼指数),|T|表示子树的叶子结点数,\alpha为子树的参数(\alpha \geqslant 0),权衡训练数据的拟合程度与模型的复杂度,C_{\alpha }(T)为指定参数\alpha下子树T的整体损失。

       在CCP方法中,使用性能指标C_{\alpha }(T)来衡量子树的优劣的,而不是前面介绍的几种方法中用误差、信息增益或者增益率来衡量。接下来重要的是,理解参数\alpha的含义,这对剪枝策略的理解很关键。对于一棵子树而言,其对训练数据的拟合程度可以以C(T)来理解,而模型的复杂度则可以理解为子树的高度以及内部结点、叶子结点的数目,树越高(层数越多)、总的结点数目越大,数越复杂,而子树模型复杂时,其拟合程度自然就高,反之亦然。

       我们所追求的的当然是拟合程度高、模型复杂度低的子树,但却很难让这两项指标都达到完美,理想的方案是找到一个折中点,让这两项指标都能被我们接受,但是对一棵已经生长完成的决策树,我们能做的只能是在诸多剪枝方案中选择一个最优的方案,该方案得到一棵子树,该子树所对应的\alpha值就是一个折中的\alpha值,是我们能接受的。

       现在我们来考虑怎么找到最优剪枝方案。当固定\alpha为某个值后,一定存在一棵子树,其C_{\alpha }(T)在所有子树中是最小的,这棵子树称为最优子树,也是唯一的(子树间|T|可能相同,但是C(T)一定不同,这是由于树生长过程中按最优属性划分原则导致)记为T_{\alpha }。参考公式(9),当\alpha较小时,|T|允许大一点,即T_{\alpha }的模型复杂度会高一些,这样也能得到不错的C_{\alpha }(T)值,而当\alpha较大时,|T|则必须得小一点了,即T_{\alpha }的模型复杂度降低,这样才能保证C_{\alpha }(T)值不会太大,这样看来,参数\alpha直接控制着T_{\alpha }的模型复杂度与拟合程度。

       对于整体树T_{0 }内部任意结点t,以t为单结点的树的损失函数为

                                                                                         C_{\alpha }(t)=C(t)+\alpha                                     (10)

       以t为根节点的子树的损失函数为

                                                                                      C_{\alpha }(T_{t})=C(T_{t})+\alpha |T_{t}|                              (11)

        令C_{\alpha }(t)=C_{\alpha }(T_{t}),得

                                                                                      \alpha =\frac{C(t)-C(T_{t})}{|T_{t}|-1}                                      (12)

        这样做的目的是在剪去以t为根节点的子树后,余下的子树T_{1 }的整体损失与整体树T_{0 }相等。由于T_{0 }内部有诸多结点,因此对每个内部结点都可以求得这样一个满足C_{\alpha }(t)=C_{\alpha }(T_{t})要求的\alpha值,选择其中对应最小\alpha值的子树T_{1 }作为最优子树,记为T^{1}_{\alpha }。为什么选择最小的\alpha呢?我们再看公式(9),由于整体树T_{0 }剪掉子树后整体损失不变,因此当\alpha最小时,由公式(1)得到的整体损失才最小,这样的树才是满足定义的最优子树。此时再看公式(12),这也符合上文提到的\alpha权衡训练数据的拟合程度与模型的复杂度的观点。T^{1}_{\alpha }对应的\alpha_{1}是树的拟合程度与模型复杂度的一个折中点,但是我们并不知道这个折中方案是不是最好的,因此还需要对T^{1}_{\alpha }进一步剪枝,得到最优子树T^{2}_{\alpha }以及其对应的\alpha_{2},按照这种方式剪枝下去,直至得到根节点,在这个过程中,我们得到一系列的最优子树\left \{ T^{1}_{\alpha },,,T^{k}_{\alpha } \right \},同时得到\left \{ \alpha _{1},,, \alpha _{k}\right \},这个过程中得到的\alpha值是不断增加。

       现在该评价\left \{ T^{1}_{\alpha },,,T^{k}_{\alpha } \right \}中哪个子树是最佳的了。这里有两种方案,一种是使用独立的验证数据集,另外一种是采用交叉验证的方法,选定一个评价指标(CART算法中使用基尼指数),\left \{ T^{1}_{\alpha },,,T^{k}_{\alpha } \right \}中指标最好即是我们最终剪枝完成后需要的决策树。

      

                                                                

               

                                                                                

       

        

      

 

        

       

猜你喜欢

转载自blog.csdn.net/huguozhiengr/article/details/81979217