算法目的:
决策树的剪枝是为了简化决策树模型,避免过拟合。
- 同样层数的决策树,叶结点的个数越多就越复杂;同样的叶结点个数的决策树,层数越多越复杂。
- 剪枝前相比于剪枝后,叶结点个数和层数只能更多或者其中一特征一样多,剪枝前必然更复杂。
- 层数越多,叶结点越多,分的越细致,对训练数据分的也越深,越容易过拟合,导致拟合测试数据时反而效果差。
算法基本思路:
剪去决策树模型中的一些子树或者叶结点,并将其上层的根结点作为新的叶结点,从而减少了叶结点甚至减少了层数,降低了决策树复杂度。
模型损失函数
- 变量预定义:∣Tleaf∣表示树T的叶结点个数,t表示树T的叶结点,同时,Nt表示该叶结点含有的样本点个数,其中属于k类的样本点有Ntk个,K表示类别的个数,Ht(T)为叶结点t上的经验熵,α≥0为参数。
显然有Nt=k=1∑KNtk
- 经验熵:Ht(T)=−k∑KNtNtklogNtNtk
- 评价函数即损失函数:C(T)=t=1∑∣Tleaf∣NtHt(T)
- 避免过拟合修正后的评价函数:Ca(T)=t=1∑∣Tleaf∣NtHt(T)+α∣Tleaf∣
损失函数简化形式:Ca(T)=C(T)+α∣Tleaf∣
- 经验熵反映了一个叶结点中的分类结果的混乱程度。经验熵越大,说明该叶结点所对应的分类结果越混乱,也就是说分类结果中包含了较多的类别,表明该分支的分类效果较差。
- 评价函数其实是求叶结点的经验熵期望。用Nt给经验熵加权的依据是叶子节点含有的样本个数越多,其分类效果或混乱程度越占主导,相当于求了期望,可以更好的描述分支前后的关系。例如设一个结点r有n个样本,其组成是第i类有ni个样本,在分了几个孩子结点后各个叶结点的成分仍保持原比例,记新的子树为R,可以计算得出评价函数C(r)=C(R),即在随机分组后不会有任何分类效果的改进。
- 评价函数越小越好。熵的期望和熵一样,越小越好。所以,评价函数越大,说明模型的分类效果越差,因而又称损失函数。
- 修正项α∣Tleaf∣是基于复制度的考虑。如上面提到的情况,r与R其实是一样的,没有进行任何分类的处理,但是我们仍然觉得r更好,原因在于R的复杂度更高。加了此修正项后具有现实的意义:如果α=0表示未剪枝的完全树损失更小(熵更小的占主导地位),如果α−>∞表示剪枝到只剩根结点更好(叶结点个数占主导地位)。
修正项α∣Tleaf∣可以避免过拟合。修正项α∣Tleaf∣考虑到了复杂度,α值设置得好可以避免出现完全树和根结点这类的极端情况,因此可以避免过拟合。
纯结点的经验熵Hp=0最小,即设Ntj=Nt则有Hp=−(1log1+k=1...K且k̸=j∑0)=0
均结点的经验熵Hu=logK最大,即Hp=−k=1∑KK1logK1=logK
剪枝类型:
预剪枝、后剪枝
- 预剪枝是在决策树生成过程中,对树进行剪枝,提前结束树的分支生长。
- 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。
预剪枝依据:
- 作为叶结点或作为根结点需要含的最少样本个数
- 决策树的层数
- 结点的经验熵小于某个阈值才停止
后剪枝思路:
- 如何由Ti剪枝得到Ti−1:
如图
- Cα(r)=C(r)+α
-
Cα(R)=C(R)+NR∗α,其中NR为子树R的叶子结点数
- 一般地有C(r)>=C(R), 我们可以令Cα(r)=Cα(R)求出α=NR−1C(r)−C(R)
- 当我们把所有的非叶结点的α求出来后比较它们的α值,在最小的α所在结点处剪枝。
为什么要在最小的α所在结点处剪枝:设给定一α来求两个结点r1、r2处的损失函数Cα(r1)和Cα(r2)以判定是否适合继续分支,且使得给定的α介于它们自己的阈值参数α1与α2之间,假设α1<α<α2。则
对于r1来说,α1<α,α给大了,参数占主导,剪枝能使得叶结点数(即参数的系数)变小,剪枝能使得Cα(r1)较小,剪枝更好;
对于r2来说,α<α2,α给小了,C(r2)−C(R2)的值占主导,即
Cα(r)−Cα(R)
=C(r)+α−C(R)−NR∗α
=[C(r2)−C(R2)]+[1−NR]∗α
不剪枝能使得叶结点数(即参数的系数)更大,Cα(r)−Cα(R)更接近0,剪枝更好。
我们看出参数阈值较小的r1处剪枝更好,因此要在最小的α所在结点处剪枝。
- 由Ti剪枝得到Ti−1后,可以得出T0−>T1−>T2−>...−>Tn,但不一定每次剪枝都能使得损失函数降低,可以对每一个Ti算出其损失函数进行比较,取损失函数值最小的那棵决策树。
注:10 决策树和随机森林实践
参考:http://blog.****.net/ritchiewang/article/details/50254009