CART剪枝算法详解

CART剪枝算法

CART剪枝算法从“完全生长“的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先从生成算法产生的决策树T0底端开始不断剪枝,直到T0的根节点,形成一个子树序列{T0,T1 ,…, Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。

1. 剪枝,得到子树序列

子树的损失函数:
            C α ( T ) = C ( T ) + α ∣ T ∣ {C_\alpha }(T) = C\left( T \right) + \alpha \left| T \right| Cα(T)=C(T)+αT
  T为任意子树,C(T)为对训练数据的预测误差,可以是基尼指数,|T|为子树T的叶子节点个数,α>= 0为参数,Cα(T)为参数是α时的子树T的整体损失,|T|衡量树的复杂度,α权衡训练数据的拟合程度与树的复杂度。
为了使得损失函数减小,有两种办法:
1> 降低第一部分的不确定次数,但我们知道这是不可能的了,因为降低不确定次数的办法是再找寻一个特征,或者找寻特征的最优切分点。这在生成决策时就已经决定了,无法改变。 (换句话说就是使得子树T的预测误差下降,这可能就要重新选择特征)
2> 进行剪枝操作,这是可以的。剪枝最明显地变化就是叶结点个数变少。假设是一个三叉树,那么一次剪枝它的叶结点数减少2个。变化量为2α,有了这变化量,我们就可以用来求解最优决策子树了。

       在α参数给定时,假设只有一个子结点发生剪枝,那么该子结点上的叶结点都将全部归并到该结点,由此我们计算此结点的不确定次数。倘若不确定次数增大的量超过2α,那么剪枝失败,算法将尝试其他子结点。因为新得的子树损失函数反而增大。  这从侧面又反映了什么样的事实?  该子结点的分类规则大大降低了不确定次数,并不存在噪声,所以没必要进行剪枝。所以在剪枝过程中,找寻的就是那些噪声点,被过度规则的那些子结点,把这些合并了,万事大吉,自然而然决策树的准确率将上升。

       那么问题来了,α是未知的,从函数和以上的分析中我们可以看出α的值对剪枝结果有很大的影响,我们如何找到这个合适的α来使拟合程度与复杂度之间达到最好的平衡呢,最好的办法就是,我们将α从0取到正无穷,对于每一个固定的α,我们都可以找到使得Cα(T)最小的最优子树T(α) 。当α 很小的时候,T0是最优子树,当α很大的时候,单独一个根节点Tn是最优的子树。(Breiman等人证明:可以用递归的方法对树进行剪枝,将a从小增大,a0<a1<…<an<+无穷,产生一系列的区间[ai,ai+1),i =0,1,…,n;剪枝得到的子树序列对应着区间[ai,ai+1),i =0,1,…,n的最优子树序列{T0, T1, … , Tn},序列中的子树是嵌套的。嵌套应该很好理解,向上剪枝的过程,树越变越小嘛)

我们通过无限个α去求有最优的子树序列式很困难的,是一个NP完全问题,那怎么办呢?

       这里有一个前提,对固定的α,一定存在使损失函数Cα(T)最小的子树,将其表示为Tα。Tα在损失函数最小的意义下是最优的,这样的最优的子树是唯一的。其实所要表达的意思就是Tα和α是一一对应的。
我们通过无限个α去求最优的子树序列是很困难的,但是根据剪枝的核心思想我们知道,无论多么复杂的决策树,生成的最优子树序列都是有限的,这里记作{T0,T1 ,…, Tn},那么我们只需要寻找每一个最优子树对应的α不就可以了嘛。

       如上分析,我们现在的思路就是要得出最优子树序列,这子树序列又如何生成呢?(怎么感觉说着说着又说回来了呢,我们的最终结果不就是要得到这些最优子树序列吗?为什么还要记录相应的α值呢?这个本人也不胜理解)我们先说说求子树序列的事情。

       我们先假设我们找到了当前的最优子树,且必然发生剪枝(一定要注意这句话,这是我们接下来所有推导的前提)。具体地,从整体树T0开始剪枝,我们每次剪枝剪的都是某个内部节点的子节点,也就是将某个内部节点的所有子节点回退到这个内部节点里,并将这个内部节点作为叶子节点。因此在计算整体的损失函数时,这个内部节点以外的值都没变,只有这个内部节点的局部损失函数改变了,因此我们本需要计算全局的损失函数,但现在只需要计算内部节点剪枝前和剪枝后的损失函数。

对任意内部节点t,
剪枝前的状态:有|Tt| 个叶子节点,预测误差是C(Tt)
剪枝后的状态:只有本身一个叶子节点,预测误差是C(t)
剪枝前以t结点为根结点的子树的损失函数是:
C α ( T t ) = C ( T t ) + α ∣ T t ∣ {C_\alpha }({T_{\rm{t}}}) = C\left( { {T_t}} \right) + \alpha \left| { {T_t}} \right| Cα(Tt)=C

  • 14
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值