剪枝作为决策树后期处理的重要步骤,是必不可少的。没有剪枝,就是一个完全生长的决策树,是过拟合的,需要去掉一些不必要的节点以使得决策树模型更具有泛化能力。
决策树
决策树就是对一棵形似于树的判决模型,树的节点是某个属性,及分裂点,树的叶是类型。
在生长过程中,可以有很多种不同的生成准则,具体就不在详述了。不清楚的同学参考之前的博客:http://blog.csdn.net/yujianmin1990/article/details/47406037
今天主要讲的是决策树的剪枝策略。
决策树剪枝
为什么剪枝?
我们生成的好好的决策树,为什么要对其进行剪枝呢?因为我们在生成树的过程中,如果没有剪枝的操作的话,就会长成每一个叶都是单独的一类的样子。这样对我们的训练集是完全拟合的,但是对测试集则是非常不友好的,泛化能力不行。因此,我们要减掉一些枝叶,使得模型泛化能力更强。
根据剪枝所出现的时间点不同,分为预剪枝和后剪枝。预剪枝是在决策树的生成过程中进行的;后剪枝是在决策树生成之后进行的。
剪枝策略
剪枝之后,对该节点的类别判别是用“大多数原则“,选择当前数据集下的最多的类标签为该节点的类别。
1)Reduced Error Pruning:误差降低剪枝
最简单粗暴的一种后剪枝方法,其目的减少误差样本数量。
f(T)=−∑t∈Te(t)
其中
e(t)
表示在节点
t
下的样本的误判个数;
f(T′)=−∑t∈T′e(t)
其中
T′
表示去掉某个节点
N
之后的树的节点;
剪枝的条件:
f(T)⩽f(T′)
,即
e(tK′)⩽e(tK)
剪枝之后使得误差降低。
1)Pessimistic Error Pruning:悲观错误剪枝
该方法基于训练数据的误差评估,因此不用单独找剪枝数据集。但训练数据也带来错分误差偏向于训练集,因此需要加入修正1/2。是自上而下的修剪。
具有
T
个节点的树的误差率衡量为:
去掉节点
K
之后
E(T′)=∑t∈T,excepKe(t)+1/2N(t)
e(t)
表示节点
t
之下的训练集的误判的个数。
设
可以证明
E(T′)−E(T)=n(t′K)−n(tK)=e(tK′)−e(tK)N(t)
即:带着某个点的该支的误判个数-去掉某点之后该支的误判个数 再除以该支的总个数。
剪枝的条件是:
SE(n(tK′))=n(tK′)∗(N(t)−n(tK′))N(t)−−−−−−−−−−−−−−√⩽E(T′)−E(T)=e(tK′)−e(tK)N(t)
————————————————————
PEPAlgorithm
Input:
Tree
Output:
PruningTree
Process:
For all the Node
自顶向下逐层遍历
if SE(n(tK′))⩽e(tK′)−e(tK)N(t)
删除该节点所在分支
end For
————————————————————
2)Minimum Error Pruning:最小误差剪枝[1]
该方法由Niblett&Bratko1987年发明。与悲观错误剪枝方法相近,但是对类的计数处理是不同的。自底向上剪枝。
初始版本是:
Epruning=n−nc+k−1n+k
Epruning
表示在某节点剪枝之后的一个期望误差率,
n
表示该节点的样本数量,
其中
|Ssplit||S|
表示分裂为某一支的样本比例
剪枝的条件:
Epruning⩽Enotpruning
则剪掉该节点。
改进版本是: [1][2]
一个观测样本到达节点
t
,其隶属于类别
pi(t)=ni(t)+paimN(t)+m
其中,
ni(t)
表示该节点下的训练样本中,被判断为
i
类的样本数量。
对m-probability-estimates, the static error :
Es=1−nc+pαcmN+m=N−nc+(1−pαc)mN+m
其中,
N
是节点所在支的样本数量;
若是不剪枝,则期望误差:
Esplit−s=∑Msplit=1|Ssplit||S|∗Esplit−s
剪枝的条件:
Es⩽Esplit−s
则去掉该节点。
3)Cost-Complexity Pruning:代价复杂剪枝[3][4][5]
该方法在Breiman1984年的经典CART中首次提到并使用。
一棵树的好坏用如下式子衡量:
Rα(T)=R(T)+αC(T)
其中
R(T)
表示该树误差(代价)的衡量;
C(T)
表示对树的大小的衡量(可以用树的终端节点个数代表)。
α
表示两者的平衡系数,其值越大,树越小,反之树越大。
怎么用这个准则剪枝呢?
1.找到完整树的一些子树{
Ti,i=1,2,3,...,m
}。
2.分别计算他们的
Rα(Ti)
,选择最小的
Rα(Ti)
所代表的树。
误差(代价)用训练样本,但最好十折计算。
4)Error-Based Pruning:基于错误的剪枝[6]
该方法由Quinlan在1992年的C4.5算法中首次提出并使用。使用测试集来剪枝。
对每个节点,计算剪枝前和剪枝后的误判个数,若是剪枝有利于减少误判(包括相等的情况),则减掉该节点所在分支。
5)Critical Value Pruning:
该方法由Mingers1987年发明。
树的生成过程中,会得到选择属性及分裂值的评估值,设定一个阈值,所有小于此阈值的节点都剪掉。
文献参考
[1]【Bojan & Bratko. On Estimating Probabilities in Tree Pruning】
[2]【The Effects of Pruning Methods on the Predictive Accuracy of Induced Decision Trees】
[3]【Cost Complexity-Based Pruning of Ensemble Classifiers】
[4]【Stopping Rules, Pruning, Tree Sequences, and Tree Selection】
[5]【Simplifying Decision Trees】
[6]【An Empirical Comparison of Pruning Methods for DecisionTree 】