将复杂的决策树进行简化的过程称为剪枝,它的目的是去掉一些节点,包括叶节点和中间节点。

剪枝常用方法:预剪枝与后剪枝两种。

 

预剪枝:在构建决策树的过程中,提前终止决策树生长,从而避免过多的节点产生。该方法不实用,我们无法判断何时终止树的生长。

 

后剪枝:在决策树构建完成后,再去掉一些节点。

常见的后剪枝方法有四种:

1.悲观错误剪枝(PEP)

2.最小错误剪枝(MEP)

3.代价复杂度剪枝(CCP)

4.基于错误的剪枝(EBP)

 

CCP可以用于CART算法中,它的本质是度量每减少一个叶节点所得到的平均错误。

 

每一个叶节点的减少,平均错误都会下降,CCP的本质就是通过计算度量其平均错误来进行的。

CCP算法会产生一系列树的序列,{T1,T2,T3,......Tm},其中T0是由训练得到的决策树,而Tm只含有一个根节点,序列中的树是嵌套的,也就是序列中的T(i+1)是由Ti通过剪枝得到的,即实现用T(i+1)中一个叶节点来替代Ti中医该节点为跟的子树。(此图可能有问题,后期我再改一下)

剪枝_其他

这种被替代的原则就是使误差的增加率α最小,即:

剪枝_其他_02

式中,R(n)表示Ti中节点n的预测误差,R(nt)表示Ti中以节点n为根节点的子树的所有叶节点的预测误差之和,|nt|为该子树叶节点的数量,|nt|也被称为复杂度,因为叶节点越多,复杂性当然就越强。

因此α的含义就是用一个节点n来替代以n为根节点的所有|nt|个节点的误差增加的规范化程度。

在Ti中,我们选择最小的α值的节点进行替代,最终得到Ti+1。

以此类推,每需要得到一棵决策树,都需要计算其前一棵决策树的α值,根据α值来对前一棵决策树进行剪枝,直到最终剪枝到只剩下含有一个根节点的Tm为止。

 

根据决策树是分类树还是回归树,节点的预测误差的计算也分为两种情况。

分类树:

分类误差公式:可以采用1,2,3三个公式,详情请见:javascript:void(0)

熵:剪枝_决策树_03        

基尼指数(Gini Index):剪枝_其他_04

分类误差:剪枝_样本集_05

 

假如用(3)来表示节点n的预测误差(这里R(n)就是直接等于分类误差的式子),则:

剪枝_样本集_06

 

 

Nj表示节点n下第j个分类的样本数,N为该节点的所有样本数,max{Nj}表示在m个分类中,拥有样本数最多的那个分类的样本数量。

 

 

回归树:

我们用以下式子表示节点n的预测误差:

(熵计算用均方误差代替,把样本的预测值用样本数处置的平均来代替)

剪枝_样本集_07

得到的式子为:

剪枝_其他_08

 

yi表示第i个样本的响应值,N为该节点的样本数量。

我们把分类树与回归树的这两个式子中,分子不分称为节点的风险值。

我们用全部样本得到的决策树序列为{T0,T1,…,Tm},其所对应的α值为α0<α1<…<αm

 

下一步就是如何从这个序列中最优的选择一颗决策树Ti。而与其说找到最优的Ti,不如说找到其所对应的αi

这一步骤通常采用的方法是交叉验证(Cross-Validation,定义请见:https://baike.baidu.com/item/%E4%BA%A4%E5%8F%89%E9%AA%8C%E8%AF%81/8543100)。

 

我们把L个样本随机划分为数量相等的V个子集Lvv=1,…,V

v个训练样本集为:

剪枝_其他_09

Lv被用来做剪枝_其他_10的测试样本集。

对每个训练样本集剪枝_其他_10按照CCP算法得到决策树的序列剪枝_决策树_12

其对应的α值为α0(v)<α1(v)<…<αm(v)。

α值的计算仍然采用剪枝_其他_02

 

分类树来说,第v个子集的节点n的预测误差为:

剪枝_回归树_14

Nj(v)表示训练样本集L(v)中节点n的第j个分类的样本数,N(v)为L(v)中节点n的所有样本数,max{Nj(v)}表示在m个分类中,L(v)中节点n拥有样本数最多的那个分类的样本数量。

对于回归树来说,第v个子集的节点n的预测误差为:

剪枝_其他_15

yj(v)表示训练样本集L(v)中节点n的第i个样本的响应值。