CART树剪枝的操作的理解


这里我就简单讲下CART剪枝的核心思想,纯属个人意见,如有不当,请指正。
在《统计学习方法法》中已经提到了决策树的剪枝算法了,理所当然,我们是顺着书中提到的思路来理解下决策树剪枝的关键步骤。我们定义了
C_{\alpha}(T) = \sum_{t =1}^{\vert T\vert}N_tH_t(T) + \alpha\vert T\vert
该定义表示了决策树的损失函数。whaterver它是什么,现在有了损失函数这个衡量标准,并且假设我们已经根据training set生成了一棵复杂的决策树,且参数\alpha已知。算法该如何实现决策树的剪枝呢?

首先明确一个概念,原本躺在那的一堆数据集,在没有决策规则被挖掘时,我们只能知道数据集中的分类标签的情况。如银行贷款问题中,银行只知道有多少人可以贷款,有多少人不可以贷款,所以躺在那的数据集的不确定度是最高的。关于这部分的理解可以参看博文【决策树之理解ID3算法和C4.5算法 - Demon-初来驾到 - 博客频道 - CSDN.NET】,由此决策树越复杂,整体数据的不确定度越低。(数据被规则所明确,即银行在得知用户有房子的情况下,能根据训练数据统计出所有用户都是可以贷款的,这样的规则被银行挖掘出来了。)那么,显而易见,规则越多,数据分类的不确定性将大大降低。

咱们来看看决策树损失函数的定义。其中第一部分 N_tH_t(T)就是事物的不确定性次数。我们都知道存在噪声的情况下,模型将趋于复杂。在决策树中也就是 \vert T\vert的数值越大。再来看看损失函数中的 \alpha\vert T\vert,假设参数 \alpha已知的,那么复杂的模型,所带来的结果就是 \alpha\vert T\vert也将增大。且决策树存在过拟合现象,那么为了使得损失函数减小,有两种办法:
  1. 降低第一部分的不确定次数,但我们知道这是不可能的了,因为降低不确定次数的办法是再找寻一个特征,或者找寻特征的最优切分点。这在生成决策时就已经决定了,无法改变。
  2. 进行剪枝操作,这是可以的。剪枝最明显地变化就是叶结点个数变少。假设是一个三叉树,那么一次剪枝它的叶结点数减少2个。变化量为2\alpha,有了这变化量,我们就可以用来求解最优决策子树了。

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

在上述剪枝过程中,还需要注意一个有趣的问题。对应于每一个参数\alpha,剪枝后的子树是唯一的嘛?个人觉得这是一个最基本的前提假设,在算法中,它提到了一点,给定参数\alpha,找寻损失函数最小的子树T_{\alpha},也就是说<\alpha,T_{\alpha}>是一一对应的!并不存在一个\alpha对应于多个子树。CART剪枝算法中将用到该基本假设。

那么问题来了,参数\alpha给定的?谁来给?领域专家给?这是一种行之有效的办法,但却需要领域知识。理想化的模型都希望参数由data决定,也就是\alpha也由数据决定。那么我们能想到的就是拿测试数据去测试在给定\alpha下生成的子树。如果给定\alpha下,测试数据的准确率达到一定阈值我们就以这个\alpha为准。这就存在一个非常大的问题,\alpha如何变化,才能让测试数据准确率呈现极大值?这个问题在上述算法中并不好解决!

CART剪枝核心思想
刚才的思路是什么?从最宏观的角度去考虑的话,就是利用\alpha生成T_{\alpha}。抽象一下,从【无限的实数】中找寻【有限个数的T_{\alpha}】,这问题当然不好解决了!思路其实已经出来了,CART剪枝算法的核心思想就是说,一个复杂的决策树,不管多复杂,都能生成有限个数的子树,我们记作\{T_0,T_1,...,T_n\},那么我们只要找寻到对应于每一个子树的\alpha不就可以了嘛!没错,抽象一下,从【有限个数的T_\alpha】中找寻对应的【\alpha】,万事解决。

咱们先来看看决策树损失函数的定义:
C_{\alpha}(T) = \sum_{t =1}^{\vert T\vert}N_tH_t(T) + \alpha\vert T\vert
做一些数学变换得:
C_{\alpha}(T) = \sum_{t =1}^{\vert T\vert}N_tH_t(T) + \alpha\vert T\vert = \sum_{t=1}^{\vert T \vert}(N_tH_t(T)+\alpha)
所以说,衡量损失函数大小的真正贡献在于每个叶结点,叶结点不确定次数的累加并加个常数\alpha就是我们决策树整体的损失函数。

为了得到树T的所有子序列\{T_0,T_1,...,T_n\},我们需要从底自上,每次只进行一次剪枝操作,那么进行剪枝操作后,该子序列应该是当前参数的最优子树。且应该是根据所剪的那个结点来计算参数\alpha

为什么要这么做?接下来的思路是什么?因为我们刚才说了,是通过最优子树来求解参数\alpha因此,我们先【假设】我们找到了当前的最优子树,且必然发生剪枝。【注意加黑的这句话!】具体地,需要归并的子结点为t,以t为单结点损失函数就可以表示为:(该子结点t已经成为我们的叶结点咯!在接下来给出的公式中,请思考哪些是已知参数,哪些是未知参数。)
C_{\alpha}(t) = C(t)+\alpha
这公式是最初的决策树损失函数变化而来的!它是其中一个子结点【吞并】它的子树,所得到【叶结点后】的损失函数。还需要强调下,因为在最初理解这个C(t)含义时,自己也被搞混了。该公式已经是剪枝完毕后的表达式了,也就是说原先的子结点已经变成了当前的叶结点。接下来会给剪枝前的表达式!C(t)表示在该叶结点中的不确定次数。

那么【剪枝前】是什么情况呢?剪枝前是以t为根结点的子树T_t的损失函数是: C_{\alpha}(T_t) = C(T_t)+\alpha\vert T_t\vert
也就是说,剪枝前该子结点的损失函数如上。具体的含义之前都有解释过,就不再叙述了。接下来我们要明确哪些是已知参数,因为决策树已经生成了,所以每个结点的不确定次数都是知道的,即C_(T),C_(T_t)\vert T_t \vert是已知的。未知参数是\alpha如何求解?还记得加粗的假设嘛?

假设1:必然发生剪枝!

从中我们便能求得\alpha,为什么?我们来观察下,上述两个式子。

\alpha =0或者充分小,明显地,不确定次数:
C_{\alpha}(T_t) < C_{\alpha}(t)
决策树叶结点越多,不确定性越低,不解释。

当增大\alpha时,总有那么一个点,能够使得:
C_{\alpha}(T_t) = C_{\alpha}(t)

当继续增大\alpha时,
C_{\alpha}(T_t) > C_{\alpha}(t)
不等式反向,所以我们只要取\alpha_1 = \frac{C(t)-C(T_t)}{\vert T_t\vert-1}时,当且仅当\alpha \ge \alpha_1时,剪枝必然发生。\alpha必须满足上述条件,否则前提假设将失去意义。所以说,我们通过假设剪枝必然发生就能找到对应的\alpha。可对于任何一个子结点t都可以嘛?别忘了第二个假设。

假设2:剪枝发生后,当前决策树是我们的最优子树

最优子树?现在t变成了一个变量,因为我们并不知道到底剪枝哪个子结点后决策树是最优的。不急,再来看看,公式:

C_{\alpha}(t) = C(t)+\alpha
剪枝已经发生,此时,对应于每一个子结点t会生成不同的\alpha我们记作\alpha(t),由此得:C_{\alpha}(t) = C(t)+\alpha(t)
剪枝的决策树什么时候最优?对于当前参数\alpha(t)而言,能够找到这样的t,使得\min_{t}\{C(t)+\alpha(t)\}
然而在这里为了能够求得\alpha的一个序列,貌似直接最小化了
\min_{t}(\frac{C(t)-C(T_t)}{\vert T_t\vert-1})
找的\alpha即找到了子结点t,即完成了剪枝,即找到了最优子树T_1。有了上述的步骤,为了得到决策树T_0的所有子序列,直接递归下去,直到根节点即可。在这一过程中,不断地增加\alpha的值,产生新的区间。

后面的思路就很简单了,根据生成的子树序列,用测试集去测试这些子树,谁的测试准确率最高,谁就获胜。具体算法可以参看《统计学习方法》,讲的很详细。

总的来说,CART剪枝算法的核心在于用【有限个子树 T_{\alpha}】计算【无限个 \alpha】,你会发现,计算过程中 \alpha变成了一个个分段区间。在利用公式推导时,注意【必剪枝】和【当前最优子树】的两个假设,且时刻问自己【已知参数】和【未知参数】是哪些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值