决策树剪枝算法原理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bird_fly_i/article/details/72824639

算法目的:

决策树的剪枝是为了简化决策树模型,避免过拟合。

  • 同样层数的决策树,叶结点的个数越多就越复杂;同样的叶结点个数的决策树,层数越多越复杂。
  • 剪枝前相比于剪枝后,叶结点个数和层数只能更多或者其中一特征一样多,剪枝前必然更复杂。
  • 层数越多,叶结点越多,分的越细致,对训练数据分的也越深,越容易过拟合,导致对测试数据预测时反而效果差。

算法基本思路:

剪去决策树模型中的一些子树或者叶结点,并将其上层的根结点作为新的叶结点,从而减少了叶结点甚至减少了层数,降低了决策树复杂度。

模型损失函数

  1. 变量预定义:Tleaf|T_{leaf}|表示树T的叶结点个数,t表示树T的叶结点,同时,NtN_t表示该叶结点含有的样本点个数,其中属于k类的样本点有NtkN_{tk}个,K表示类别的个数,Ht(T)H_t(T)为叶结点t上的经验熵,α0\alpha≥0为参数。
    显然有Nt=k=1KNtkN_t=\displaystyle \sum^{K}_{k=1} {N_{tk}}
  2. 经验熵:Ht(T)=kKNtkNtlogNtkNtH_t(T) = -\displaystyle \sum_k^K \frac {N_{tk}} {N_t} \log \frac {N_{tk}}{N_t}
  3. 评价函数即损失函数:C(T)=t=1TleafNtHt(T)C(T)=\displaystyle \sum^{|T_{leaf}|}_{t=1} {N_tH_t(T)}
  4. 避免过拟合修正后的评价函数:Ca(T)=t=1TleafNtHt(T)+αTleafC_a(T)=\displaystyle \sum^{|T_{leaf}|}_{t=1} {N_tH_t(T)+\alpha|T_{leaf}|}
    损失函数简化形式:Ca(T)=C(T)+αTleafC_a(T)=C(T)+\alpha|T_{leaf}|
  • 经验熵反映了一个叶结点中的分类结果的混乱程度。经验熵越大,说明该叶结点所对应的分类结果越混乱,也就是说分类结果中包含了较多的类别,表明该分支的分类效果较差。
  • 评价函数其实是求叶结点的经验熵期望。用NtN_t给经验熵加权的依据是叶子节点含有的样本个数越多,其分类效果或混乱程度越占主导,相当于求了期望,可以更好的描述分支前后的关系。例如设一个结点r有n个样本,其组成是第i类有nin_i个样本,在分了几个孩子结点后各个叶结点的成分仍保持原比例,记新的子树为R,可以计算得出评价函数C(r)=C(R)C(r)=C(R),即在随机分组后不会有任何分类效果的改进。
  • 评价函数越小越好。熵的期望和熵一样,越小越好。所以,评价函数越大,说明模型的分类效果越差,因而又称损失函数。
  • 修正项αTleaf\alpha|T_{leaf}|是基于复制度的考虑。如上面提到的情况,r与R其实是一样的,没有进行任何分类的处理,但是我们仍然觉得r更好,原因在于R的复杂度更高。加了此修正项后具有现实的意义:如果α=0\alpha=0表示未剪枝的完全树损失更小(熵更小的占主导地位),如果α>\alpha->∞表示剪枝到只剩根结点更好(叶结点个数占主导地位)。
    修正项αTleaf\alpha|T_{leaf}|可以避免过拟合。修正项αTleaf\alpha|T_{leaf}|考虑到了复杂度,α\alpha值设置得好可以避免出现完全树和根结点这类的极端情况,因此可以避免过拟合。
    纯结点的经验熵Hp=0H_p=0最小,即设Ntj=NtN_{tj}=N_t则有Hp=(1log1+k=1...Kkj0)=0H_p=-(1\log 1+\displaystyle \sum_{k=1...K且k≠j} {0})=0
    均结点的经验熵Hu=logKH_u=\log K最大,即Hp=k=1K1Klog1K=logKH_p=-\displaystyle \sum^{K}_{k=1} {\frac{1}{K}\log\frac{1}{K}}=\log K

剪枝类型:

预剪枝、后剪枝

  • 预剪枝是在决策树生成过程中,对树进行剪枝,提前结束树的分支生长。
  • 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。

预剪枝依据:

  • 作为叶结点或作为根结点需要含的最少样本个数
  • 决策树的层数
  • 结点的经验熵小于某个阈值才停止

后剪枝思路:

  1. 如何由TiT_i剪枝得到Ti1T_{i-1}
    如图
    R为r结点分支后的子树
  • Cα(r)=C(r)+αC_\alpha(r)=C(r)+\alpha
  • Cα(R)=C(R)+NRαC_\alpha(R)=C(R)+N_R*\alpha,其中NRN_R为子树R的叶子结点数
  • 一般地有C(r)>=C(R)C(r)>=C(R), 我们可以令Cα(r)=Cα(R)C_\alpha(r)=C_\alpha(R)求出α=C(r)C(R)NR1\alpha=\frac{C(r)-C(R)}{N_R-1}
  • 当我们把所有的非叶结点的α\alpha求出来后比较它们的α\alpha值,在最小的α\alpha所在结点处剪枝。
    为什么要在最小的α\alpha所在结点处剪枝:设给定一α\alpha来求两个结点r1r_1r2r_2处的损失函数Cα(r1)C_\alpha(r_1)Cα(r2)C_\alpha(r_2)以判定是否适合继续分支,且使得给定的α\alpha介于它们自己的阈值参数α1\alpha_1α2\alpha_2之间,假设α1\alpha_1<α\alpha<α2\alpha_2。则
    对于r1r_1来说,α1\alpha_1<α\alphaα\alpha给大了,参数占主导,剪枝能使得叶结点数(即参数的系数)变小,剪枝能使得Cα(r1)C_\alpha(r_1)较小,剪枝更好;
    对于r2r_2来说,α\alpha<α2\alpha_2α\alpha给小了,C(r2)C(R2)C(r_2)-C(R_2)的值占主导,即
    Cα(r)Cα(R)C_\alpha(r)- C_\alpha(R)
    =C(r)+αC(R)NRα=C(r)+\alpha-C(R)-N_R*\alpha
    =[C(r2)C(R2)]+[1NR]α= [C(r_2)-C(R_2)]+[1-N_R]*\alpha
    不剪枝能使得叶结点数(即参数的系数)更大,Cα(r)Cα(R)C_\alpha(r)- C_\alpha(R)更接近0,剪枝更好。
    我们看出参数阈值较小的r1r_1处剪枝更好,因此要在最小的α\alpha所在结点处剪枝。
  1. TiT_i剪枝得到Ti1T_{i-1}后,可以得出T0&gt;T1&gt;T2&gt;...&gt;TnT_0-&gt;T_1-&gt;T_2-&gt;...-&gt;T_n,但不一定每次剪枝都能使得损失函数降低,可以对每一个TiT_i算出其损失函数进行比较,取损失函数值最小的那棵决策树。

注:10 决策树和随机森林实践
参考:http://blog.csdn.net/ritchiewang/article/details/50254009

展开阅读全文

没有更多推荐了,返回首页