决策树剪枝算法原理

来源:互联网 发布:java 外贸电商平台 编辑:程序博客网 时间:2024/05/22 13:44

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

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

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

模型损失函数

  1. 变量预定义:|Tleaf|表示树T的叶结点个数,t表示树T的叶结点,同时,Nt表示该叶结点含有的样本点个数,其中属于k类的样本点有Ntk个,K表示类别的个数,Ht(T)为叶结点t上的经验熵,α0为参数。
    显然有Nt=k=1KNtk
  2. 经验熵:Ht(T)=kKNtkNtlogNtkNt
  3. 评价函数即损失函数:C(T)=t=1|Tleaf|NtHt(T)
  4. 避免过拟合修正后的评价函数: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=1kjK0)=0
均结点的经验熵Hu=logK最大,即Hp=k=1K1Klog1K=logK

剪枝类型:预剪枝、后剪枝

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

预剪枝依据:

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

后剪枝思路:

  1. 如何由Ti剪枝得到Ti1
    如图
    R为r结点分支后的子树

    • Cα(r)=C(r)+α
    • Cα(R)=C(R)+NRα,其中NR为子树R的叶子结点数

    • 一般地有C(r)>=C(R), 我们可以令Cα(r)=Cα(R)求出α=C(r)C(R)NR1

    • 当我们把所有的非叶结点的α求出来后比较它们的α值,在最小的α所在结点处剪枝。
      为什么要在最小的α所在结点处剪枝:设给定一α来求两个结点r1r2处的损失函数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)]+[1NR]α
      不剪枝能使得叶结点数(即参数的系数)更大,Cα(r)Cα(R)更接近0,剪枝更好。
      我们看出参数阈值较小的r1处剪枝更好,因此要在最小的α所在结点处剪枝。
  2. Ti剪枝得到Ti1后,可以得出T0>T1>T2>...>Tn,但不一定每次剪枝都能使得损失函数降低,可以对每一个Ti算出其损失函数进行比较,取损失函数值最小的那棵决策树。

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