之前介绍了很多种决策树算法,每回都要唠叨点剪枝的问题,今天我们就来系统总结一下。
为什么要剪枝?
随着树的生长,树的低层节点覆盖的实例数迅速减少,尽管基于训练数据的估计误差越来越小,但是这种估计的不可靠性却越来越高。这就是剪枝的动机,剪枝已经成为决策树构造的逻辑延续。
但是并没有直接的理由来说明剪枝就可以提高预测的准确性,因为现实中剪枝对于独立的、大量检验样本而言,会降低预测的准确率。应该说剪枝是出于这样的思想:优先选择简单的模型。这也就是所谓的奥卡姆剃刀(Occam's Razor)原理。在训练数据上虽然简单模型比复杂模型的误差更高一些,但是简单模型具有更好的泛化能力。
剪枝的结果
- 降低决策的规模
- 提高准确率
- 前剪枝
- 后剪枝
- 节点覆盖的实例数小于阈值时停止树的生长
- 节点的误差率与根节点的误差率之比小于阈值时停止树的生长
- 最大信息增益小于阈值时停止分裂
- 划分条件之于类别的卡方统计量小于阈值时停止分裂
- 子树转换
即用一个叶子节点替换一棵子树。这是一个bottom-up的递归过程。 - 子树提升
如图所示,节点C被提升,替换了节点B,原先4、5中包含的实例被包含进了1、2、3中。这里为什么提升C而不提升4、5呢?因为C中包含的实例比4、5中包含的实例多。


- 代价复杂性剪枝
该算法也称为CART剪枝算法。
对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。
是子树中包含的叶子节点个数;
是节点t的误差代价,如果该节点被剪枝;
r(t)是节点t的误差率;
p(t)是节点t上的数据占所有数据的比例。
是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。
比如有个非叶子节点t4如图所示:

已知所有的数据总共有60条,则节点t4的节点误差代价为:
子树误差代价为:
以t4为根节点的子树上叶子节点有3个,最终:
找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取
最大的进行剪枝。
- 最小误差剪枝
设集合中的类数为k,节点t中训练实例的总数为n(t),而节点t中属于类C的训练实例数目为nc(t),则期望误差率用下式计算:
比如对于T6,如果子树被剪掉,则如果子树不被剪枝,则
剪枝的期望误差更大,所以决定不剪枝。
这种方法的缺点之一是:期望误差依赖于类的个数。 - 悲观误差剪枝
这种方法由Quinlan提出,并且用于当前的C4.5中,目的是避免使用单独的检验数据集。
把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代的话,在训练集上的误判率肯定是上升的,但是在新数据上不一定。于是我们需要把子树的误判计算加上一个经验性的惩罚因子。对于一颗叶子节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为
。这样的话,我们可以看到一颗子树虽然具有多个子节点,但由于加上了惩罚因子,所以子树的误判率计算未必占到便宜。剪枝后内部节点变成了叶子节点,其误判个数J也需要加上一个惩罚因子,变成J+0.5。那么子树是否可以被剪枝就取决于剪枝后的错误J+0.5在
的标准误差内。对于样本的误差率e,我们可以根据经验把它估计成各种各样的分布模型,比如是二项式分布,比如是正态分布。
那么一棵树错误分类一个样本值为1,正确分类一个样本值为0,该树错误分类的概率(误判率)为e(e为分布的固有属性,可以通过
统计出来),那么树的误判次数就是伯努利分布,我们可以估计出该树的误判次数均值和标准差:
把子树替换成叶子节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶子节点的误判次数均值为
使用训练数据,子树总是比替换为一个叶节点后产生的误差小,但是使用校正后有误差计算方法却并非如此,当子树的误判个数大过对应叶节点的误判个数一个标准差之后,就决定剪枝:
这个条件就是剪枝的标准。
当并不一定非要大一个标准差,可以给定任意的置信区间,我们设定一定的显著性因子,就可以估算出误判次数的上下界。
比如T4这棵子树的误差率:
子树误差率的标准误差:
子树替换为一个叶节点后,其误差率为:
因为
,所以决定将子树T4替换这一个叶子节点。
- 降低误差剪枝
这个方法 也是Quinlan提出来的,它需要用独立的测试数据集来检验每棵子树的准确率,与它被剪枝时的准确率比较。
对于每个非叶子节点,统计保留该子树和通过剪枝变成树叶的误分类个数。在测试数据集上,剪枝后有错误数通常比剪枝前要少,这个差值就是剪枝增益。对于所有节点,选择增益最大的子树剪掉。
这个方法的优点是每个节点只访问一次,评估它对剪枝的机会。
本文详细介绍了决策树剪枝的原因、结果以及常见的剪枝方法,包括前剪枝、后剪枝、子树替换和提升、代价复杂性剪枝、最小误差剪枝、悲观误差剪枝以及降低误差剪枝。剪枝的主要目标是降低决策树的规模,提高泛化能力,遵循奥卡姆剃刀原理。
2681

被折叠的 条评论
为什么被折叠?



