剪枝导论

本文详细介绍了决策树剪枝的原因、结果以及常见的剪枝方法,包括前剪枝、后剪枝、子树替换和提升、代价复杂性剪枝、最小误差剪枝、悲观误差剪枝以及降低误差剪枝。剪枝的主要目标是降低决策树的规模,提高泛化能力,遵循奥卡姆剃刀原理。

之前介绍了很多种决策树算法,每回都要唠叨点剪枝的问题,今天我们就来系统总结一下。

为什么要剪枝?

随着树的生长,树的低层节点覆盖的实例数迅速减少,尽管基于训练数据的估计误差越来越小,但是这种估计的不可靠性却越来越高。这就是剪枝的动机,剪枝已经成为决策树构造的逻辑延续。

但是并没有直接的理由来说明剪枝就可以提高预测的准确性,因为现实中剪枝对于独立的、大量检验样本而言,会降低预测的准确率。应该说剪枝是出于这样的思想:优先选择简单的模型。这也就是所谓的奥卡姆剃刀(Occam's Razor)原理。在训练数据上虽然简单模型比复杂模型的误差更高一些,但是简单模型具有更好的泛化能力。

剪枝的结果

  1. 降低决策的规模
  2. 提高准确率
一般而言,剪枝可将归纳决策树的准确率提高25%。
剪枝的2种类型
  1. 前剪枝
  2. 后剪枝
后剪枝就是在构造出决策树之后再依据一定的标准把某些子树剪掉,有时候具有数千个节点树会被剪到只剩数百个,所以后剪枝是计算低效的。而前剪枝则在构造树的过程中一旦发现进一步分裂是不可靠或没有必要的,就停止树的生长。(所以我觉得“前剪枝”和“树的停止生长规则”是同一个概念)。然而过早地停止树的生成会面临选择次最优树的风险,所以还是后剪枝用的多一些。
前剪枝的方法有很多,比如:
  1. 节点覆盖的实例数小于阈值时停止树的生长
  2. 节点的误差率与根节点的误差率之比小于阈值时停止树的生长
  3. 最大信息增益小于阈值时停止分裂
  4. 划分条件之于类别的卡方统计量小于阈值时停止分裂
后剪枝也有两种基本操作:
  1. 子树转换
    即用一个叶子节点替换一棵子树。这是一个bottom-up的递归过程。
  2. 子树提升
    如图所示,节点C被提升,替换了节点B,原先4、5中包含的实例被包含进了1、2、3中。这里为什么提升C而不提升4、5呢?因为C中包含的实例比4、5中包含的实例多。


剪枝算法
  1. 代价复杂性剪枝
    该算法也称为CART剪枝算法。

    对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。

    是子树中包含的叶子节点个数;

    是节点t的误差代价,如果该节点被剪枝;

    r(t)是节点t的误差率;

    p(t)是节点t上的数据占所有数据的比例。

    是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。

    比如有个非叶子节点t4如图所示:

    已知所有的数据总共有60条,则节点t4的节点误差代价为:

    子树误差代价为:

    以t4为根节点的子树上叶子节点有3个,最终:

    找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取最大的进行剪枝。

  2. 最小误差剪枝
    设集合中的类数为k,节点t中训练实例的总数为n(t),而节点t中属于类C的训练实例数目为n
    c(t),则期望误差率用下式计算:

    比如对于T6,如果子树被剪掉,则
    如果子树不被剪枝,则

    剪枝的期望误差更大,所以决定不剪枝。
    这种方法的缺点之一是:期望误差依赖于类的个数。
  3. 悲观误差剪枝
    这种方法由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替换这一个叶子节点。

  4. 降低误差剪枝
    这个方法 也是Quinlan提出来的,它需要用独立的测试数据集来检验每棵子树的准确率,与它被剪枝时的准确率比较。
    对于每个非叶子节点,统计保留该子树和通过剪枝变成树叶的误分类个数。在测试数据集上,剪枝后有错误数通常比剪枝前要少,这个差值就是剪枝增益。对于所有节点,选择增益最大的子树剪掉。
    这个方法的优点是每个节点只访问一次,评估它对剪枝的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值