决策树在构建时一般会出现过拟合的情况,所以我们要在决策树构建完成后进行“剪枝操作”。所谓的剪枝就是对决策树的叶节点进行修剪,把多个叶节点进行合并,把小类合成一个大类然后以其中所占个数最多的类作为该大类的类。其实几乎决策树的构建都要进行剪枝操作,剪枝操作比树的构造还要重要
剪枝分为两种
- 前剪枝(在构造决策树时设定条件对树的构建进行终止从而达到剪枝的效果)
- 后剪枝(在树构建完成后对树进行修剪)
本文主要讲解后剪枝操作
后剪枝常有的方法
Reduced-Error Pruning(REP,错误率降低剪枝)
该剪枝方法把每个树的节点作为剪枝对象(包括叶节点和非叶节点)然后进行以下操作(自底向上,利用验证集进行剪枝)
1. 将改节点的子树删除(改节点一下的所有节点都删除)
2. 将改节点改为叶节点,并且将原子树中的数据最常见分类赋予该节点
3. 判断按上述方法修剪过后决策树的对验证集的性能不比原来差,则真正安上述方法修剪该节 点。
判定第三条一般就用最简单粗暴的错分率即可(或者错分的个数)
f(T)=−∑e(t) (t 属于T)
其中e(t)表示在节点t下的样本的误判个数;T表示当前树的节点。
f(T’)=−∑e(t) (t属于T’)
其中T′表示去掉某个节点N之后的树的节点;e(t)表示某个节点下的训练样本点误判数量。
剪枝的条件:f(T)⩽f(T′)。
自底向上重复该过程。
由于发方法利用的是验证集,不是训练集,所以该方法对未知的事物具有较高的准确度。但是该方法可能会出现过度修剪,对于验证集里没有出现的在训练集里很稀少的训练实例都会被删除。当验证集比较小时该问题更为突出。。。
Pessimistic Error Pruning(PEP,悲观剪枝)
(自定向下的修剪策略)
悲观剪枝不采用新的验证集进行剪枝,而是还是使用训练集进行剪枝。剪枝的判断条件是修剪后和修建前的精度不变。这里的精度可以用错误率(错误个数表示),其不变是与错误率的置信区间上届进行比较(参考http://www.cnblogs.com/junyuhuang/p/4572408.html)。假设训练集生成的原树为T,某一叶子节点的实例树为n(t),其中错分类的个数为e(t),其误分率为r(t) = e(t)/n(t)。需对其进行连续性修正r’ (t) = [e(t) + 1/2]/n(t)(1/2不是一成不变的,某些情况下应该进行修改要是感兴趣理解连续性修正。可查找二项分布逼近正态分布及二项分布连续性修正方面的知识)。设S为树T的子树Tt,其叶子节点个数位L(S)。Tt的分类误差率
对于中间节点t被叶子节点替换的条件是,替换后子树Tt的误差概率要小于节点t的。
即满足
则子树Tt应该被修剪掉。
同时由于该方法采取的是一种自顶向下的策略会出现树的某个节点会在其子树根据同样的准则不需要修剪时被完全删除掉。但是在实际应用中PEP表现出了比较高的精度并且其算法效率也是线性的。
Cost Complexity Pruning(CCP,代价复杂剪枝)
- 自底向上,通过对原始决策树进行修剪得到一系列树{T0, T1,T2…Tk},其中Ti+1 是由Ti中的一个或多个子树被替换掉产生的。这一系列子树的产生同时依赖参数a。即T1是在[a1,a2),T2是在[a2,a3)T0表示原始树,Tk表示只有一个节点的树。
- 评价这些子树0 ~ k,根据真实的误差率来选择最优秀的树作为最终的树
这个方法的关键在于理解如何产生0~k这一系列的子树。
产生过程讲解:
定义树的损失函数
Ca (Tt) = C(Tt) + a*|Tt|。
Tt表示以t为根结点的子树,表示这里C(Tt)表示对训练集的预测误差(可以用基尼指数或者误分率表示),|Tt|表示T树的叶节点个数,参数a会权衡模型的拟合程度和模型的复杂度(叶节点的个数)。
当一个节点一下的子树要被删除时(即子树由单节点代替)。对于一个节点t来说,其损失函数
Ca (t) = C(t) + a。 (1)
此时当a较小时,有
Ca(Tt) < Ca(t), (2)
当a在增大的过程中,一定有a使得
Ca(t) = Ca(Tt) —> 联立(1)(2)有
a = [C(t) -C(Tt)]/[|Tt| - 1]
也就是损失函数相等,但是由于此时t表示只有一个节点,整个树的复杂度降低了。也就是说此时的t比Tt更可取,所以对Tt进行剪枝。
根据上述剪枝步骤得到整体的操作方法
对自上而下对T0中每个内部节点t,计算
g(t) = [C(t) -C(Tt)]/[|Tt| - 1]。
使a1 = g(t),
然后在T0中剪去使g(t)最小的子树Tt,将得到的子树设为T1,同时将g(t)设为a1,得到T1为[a1,a2)区间的最优子树。
然后在T1中剪去使g(t)最小的子树Tt,将得到的子树设为T2,同时将g(t)设为a2,得到T1为[a2,a3)区间的最优子树。
如此重复,直到只剩一个节点(即达到跟节点)。
对最终子树的选择,使用交叉验证选择最优子树。