对于一棵生长完成的决策树而言,剪枝的重要性不言而喻,对决策树进行剪枝,可以避免对训练集过拟合、削弱噪声数据的影响,提高决策树的泛化能力。剪枝的策略一般分为预剪枝和后剪枝,下面分别对二者进行介绍
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方法中对误差估计引入了连续性校正。未进行连续性校正前,子树上的叶子结点的误分类率定义为
(1)
为该叶子结点上的误分类数,为该叶子结点所包含的样本数。对估计误差进行连续性校正之后,其误差率定义为
(2)
这里连续性校正实际上是将每一个叶子结点上的误分类数增加了1/2,但是为什么是“1/2”这个值?我目前查阅的文献有限(主要是没有权限下载英文文献,工作之后就是这点不好。。。还是学校方便),还没弄明白这个,这里暂且先放下。引入连续性校正之后,假设子树的叶子结点数为k,则该子树的误分类数与误分类率分别为
(3)
(4)
将子树剪掉、用叶子结点代替后,其误分类数为
(5)
为未校正前的误分类数。对于指定的子树,树上的样本数是确定的,因此可以用误分类数代替误分类率,按照REP方法中的剪枝策略,当满足
(6)
时即将子树剪掉,即使是进行了连续性校正,这个剪枝条件还是比较严格的。为此Quinlan教授引入了子树误分类数的标准误差参数来放宽剪枝条件,的定义为
(7)
式(7)中为子树替换后得到叶子结点包含的样本数。此时剪枝的条件变为了
(8)
PEP方法是后剪枝方法中唯一采用从上至下(top-bottom)剪枝的方法,因而其有着与预剪枝方法一样的优点,就是效率高,但同时也存在与预剪枝一样的欠拟合问题,但是总体来说,PEP方法的剪枝精度是后剪枝方法中精度较高的方法之一,并且其不需要验证数据集,适用于样本较少的情况。
我看到有的地方引入了统计学的知识来解释的引入以及其定义,但是有没有完整的说明为什么要这样做,我也确实没有弄明白原理,故这里没有介绍这方面的内容,只是介绍了计算部分,原理及思想部分实在是没有很明白。
1.3 CCP(cost-complexity Pruning)方法
CCP方法是Breiman等人提出的,剪枝时采用从下至上(bottom-top)的方式,该方法也是CART算法的剪枝方法。
首先,定义子树的损失函数
(9)
式(9)中,表示任意的子树,表示子树对训练数据的预测误差(如基尼指数、误分类数等,由于CART算法使用基尼指数来选择优先划分属性,因此在CCP方法中此处一般使用基尼指数),表示子树的叶子结点数,为子树的参数(),权衡训练数据的拟合程度与模型的复杂度,为指定参数下子树的整体损失。
在CCP方法中,使用性能指标来衡量子树的优劣的,而不是前面介绍的几种方法中用误差、信息增益或者增益率来衡量。接下来重要的是,理解参数的含义,这对剪枝策略的理解很关键。对于一棵子树而言,其对训练数据的拟合程度可以以来理解,而模型的复杂度则可以理解为子树的高度以及内部结点、叶子结点的数目,树越高(层数越多)、总的结点数目越大,数越复杂,而子树模型复杂时,其拟合程度自然就高,反之亦然。
我们所追求的的当然是拟合程度高、模型复杂度低的子树,但却很难让这两项指标都达到完美,理想的方案是找到一个折中点,让这两项指标都能被我们接受,但是对一棵已经生长完成的决策树,我们能做的只能是在诸多剪枝方案中选择一个最优的方案,该方案得到一棵子树,该子树所对应的值就是一个折中的值,是我们能接受的。
现在我们来考虑怎么找到最优剪枝方案。当固定为某个值后,一定存在一棵子树,其在所有子树中是最小的,这棵子树称为最优子树,也是唯一的(子树间可能相同,但是一定不同,这是由于树生长过程中按最优属性划分原则导致)记为。参考公式(9),当较小时,允许大一点,即的模型复杂度会高一些,这样也能得到不错的值,而当较大时,则必须得小一点了,即的模型复杂度降低,这样才能保证值不会太大,这样看来,参数直接控制着的模型复杂度与拟合程度。
对于整体树内部任意结点,以为单结点的树的损失函数为
(10)
以为根节点的子树的损失函数为
(11)
令,得
(12)
这样做的目的是在剪去以为根节点的子树后,余下的子树的整体损失与整体树相等。由于内部有诸多结点,因此对每个内部结点都可以求得这样一个满足要求的值,选择其中对应最小值的子树作为最优子树,记为。为什么选择最小的呢?我们再看公式(9),由于整体树剪掉子树后整体损失不变,因此当最小时,由公式(1)得到的整体损失才最小,这样的树才是满足定义的最优子树。此时再看公式(12),这也符合上文提到的权衡训练数据的拟合程度与模型的复杂度的观点。对应的是树的拟合程度与模型复杂度的一个折中点,但是我们并不知道这个折中方案是不是最好的,因此还需要对进一步剪枝,得到最优子树以及其对应的,按照这种方式剪枝下去,直至得到根节点,在这个过程中,我们得到一系列的最优子树,同时得到,这个过程中得到的值是不断增加。
现在该评价中哪个子树是最佳的了。这里有两种方案,一种是使用独立的验证数据集,另外一种是采用交叉验证的方法,选定一个评价指标(CART算法中使用基尼指数),中指标最好即是我们最终剪枝完成后需要的决策树。