天天看点

CART树剪枝的操作的理解

这里我就简单讲下CART剪枝的核心思想,纯属个人意见,如有不当,请指正。

在《统计学习方法法》中已经提到了决策树的剪枝算法了,理所当然,我们是顺着书中提到的思路来理解下决策树剪枝的关键步骤。我们定义了

CART树剪枝的操作的理解

该定义表示了决策树的损失函数。whaterver它是什么,现在有了损失函数这个衡量标准,并且假设我们已经根据training set生成了一棵复杂的决策树,且参数

CART树剪枝的操作的理解

已知。算法该如何实现决策树的剪枝呢?

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

咱们来看看决策树损失函数的定义。其中第一部分

CART树剪枝的操作的理解

就是事物的不确定性次数。我们都知道存在噪声的情况下,模型将趋于复杂。在决策树中也就是

CART树剪枝的操作的理解

的数值越大。再来看看损失函数中的

CART树剪枝的操作的理解

,假设参数

CART树剪枝的操作的理解

已知的,那么复杂的模型,所带来的结果就是

CART树剪枝的操作的理解

也将增大。且决策树存在过拟合现象,那么为了使得损失函数减小,有两种办法:

  1. 降低第一部分的不确定次数,但我们知道这是不可能的了,因为降低不确定次数的办法是再找寻一个特征,或者找寻特征的最优切分点。这在生成决策时就已经决定了,无法改变。
  2. 进行剪枝操作,这是可以的。剪枝最明显地变化就是叶结点个数变少。假设是一个三叉树,那么一次剪枝它的叶结点数减少2个。变化量为
    CART树剪枝的操作的理解
    ,有了这变化量,我们就可以用来求解最优决策子树了。

因为

CART树剪枝的操作的理解

参数给定,所以一次剪枝,损失函数的减少量也是固定的。所有子结点都是三叉树时,我们可以简单认为损失函数的减少量为2

CART树剪枝的操作的理解

。假设只有一个子结点发生剪枝,那么该子结点上的叶结点都将全部归并到该结点,由此我们计算此结点的不确定次数。倘若不确定次数增大的量超过2

CART树剪枝的操作的理解

,那么剪枝失败,算法将尝试其他子结点。因为新得的子树损失函数反而增大。这从侧面又反映了什么样的事实?该子结点的分类规则是大大降低不确定次数的,并不存在噪声,所以没必要进行剪枝。所以在剪枝过程中,找寻的就是那些噪声点,却被过度规则那些子结点,把这些合并了,万事大吉,自然而然决策树的准确率将上升。

在上述剪枝过程中,还需要注意一个有趣的问题。对应于每一个参数

CART树剪枝的操作的理解

,剪枝后的子树是唯一的嘛?个人觉得这是一个最基本的前提假设,在算法中,它提到了一点,给定参数

CART树剪枝的操作的理解

,找寻损失函数最小的子树

CART树剪枝的操作的理解

,也就是说

CART树剪枝的操作的理解

是一一对应的!并不存在一个

CART树剪枝的操作的理解

对应于多个子树。CART剪枝算法中将用到该基本假设。

那么问题来了,参数

CART树剪枝的操作的理解

给定的?谁来给?领域专家给?这是一种行之有效的办法,但却需要领域知识。理想化的模型都希望参数由data决定,也就是

CART树剪枝的操作的理解

也由数据决定。那么我们能想到的就是拿测试数据去测试在给定

CART树剪枝的操作的理解

下生成的子树。如果给定

CART树剪枝的操作的理解

下,测试数据的准确率达到一定阈值我们就以这个

CART树剪枝的操作的理解

为准。这就存在一个非常大的问题,

CART树剪枝的操作的理解

如何变化,才能让测试数据准确率呈现极大值?这个问题在上述算法中并不好解决!

CART剪枝核心思想

刚才的思路是什么?从最宏观的角度去考虑的话,就是利用

CART树剪枝的操作的理解

生成

CART树剪枝的操作的理解

。抽象一下,从【无限的实数】中找寻【有限个数的

CART树剪枝的操作的理解

】,这问题当然不好解决了!思路其实已经出来了,CART剪枝算法的核心思想就是说,一个复杂的决策树,不管多复杂,都能生成有限个数的子树,我们记作

CART树剪枝的操作的理解

,那么我们只要找寻到对应于每一个子树的

CART树剪枝的操作的理解

不就可以了嘛!没错,抽象一下,从【有限个数的

CART树剪枝的操作的理解

】中找寻对应的【

CART树剪枝的操作的理解

】,万事解决。

咱们先来看看决策树损失函数的定义:

CART树剪枝的操作的理解

做一些数学变换得:

CART树剪枝的操作的理解

所以说,衡量损失函数大小的真正贡献在于每个叶结点,叶结点不确定次数的累加并加个常数

CART树剪枝的操作的理解

就是我们决策树整体的损失函数。

为了得到树T的所有子序列

CART树剪枝的操作的理解

,我们需要从底自上,每次只进行一次剪枝操作,那么进行剪枝操作后,该子序列应该是当前参数的最优子树。且应该是根据所剪的那个结点来计算参数

CART树剪枝的操作的理解

为什么要这么做?接下来的思路是什么?因为我们刚才说了,是通过最优子树来求解参数

CART树剪枝的操作的理解

,因此,我们先【假设】我们找到了当前的最优子树,且必然发生剪枝。【注意加黑的这句话!】具体地,需要归并的子结点为t,以t为单结点损失函数就可以表示为:(该子结点t已经成为我们的叶结点咯!在接下来给出的公式中,请思考哪些是已知参数,哪些是未知参数。)

CART树剪枝的操作的理解

这公式是最初的决策树损失函数变化而来的!它是其中一个子结点【吞并】它的子树,所得到【叶结点后】的损失函数。还需要强调下,因为在最初理解这个C(t)含义时,自己也被搞混了。该公式已经是剪枝完毕后的表达式了,也就是说原先的子结点已经变成了当前的叶结点。接下来会给剪枝前的表达式!

CART树剪枝的操作的理解

表示在该叶结点中的不确定次数。

那么【剪枝前】是什么情况呢?剪枝前是以t为根结点的子树

CART树剪枝的操作的理解

的损失函数是:

CART树剪枝的操作的理解

也就是说,剪枝前该子结点的损失函数如上。具体的含义之前都有解释过,就不再叙述了。接下来我们要明确哪些是已知参数,因为决策树已经生成了,所以每个结点的不确定次数都是知道的,即

CART树剪枝的操作的理解

,

CART树剪枝的操作的理解

CART树剪枝的操作的理解

是已知的。未知参数是

CART树剪枝的操作的理解

如何求解?还记得加粗的假设嘛?

假设1:必然发生剪枝!

从中我们便能求得

CART树剪枝的操作的理解

,为什么?我们来观察下,上述两个式子。

CART树剪枝的操作的理解

或者充分小,明显地,不确定次数:

CART树剪枝的操作的理解

决策树叶结点越多,不确定性越低,不解释。

当增大

CART树剪枝的操作的理解

时,总有那么一个点,能够使得:

CART树剪枝的操作的理解

当继续增大

CART树剪枝的操作的理解

时,

CART树剪枝的操作的理解

不等式反向,所以我们只要取

CART树剪枝的操作的理解

时,当且仅当

CART树剪枝的操作的理解

时,剪枝必然发生。

CART树剪枝的操作的理解

必须满足上述条件,否则前提假设将失去意义。所以说,我们通过假设剪枝必然发生就能找到对应的

CART树剪枝的操作的理解

。可对于任何一个子结点t都可以嘛?别忘了第二个假设。

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

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

CART树剪枝的操作的理解

剪枝已经发生,此时,对应于每一个子结点t会生成不同的

CART树剪枝的操作的理解

我们记作

CART树剪枝的操作的理解

,由此得:

CART树剪枝的操作的理解

剪枝的决策树什么时候最优?对于当前参数

CART树剪枝的操作的理解

而言,能够找到这样的t,使得

CART树剪枝的操作的理解

然而在这里为了能够求得

CART树剪枝的操作的理解

的一个序列,貌似直接最小化了

CART树剪枝的操作的理解

找的

CART树剪枝的操作的理解

即找到了子结点t,即完成了剪枝,即找到了最优子树

CART树剪枝的操作的理解

。有了上述的步骤,为了得到决策树

CART树剪枝的操作的理解

的所有子序列,直接递归下去,直到根节点即可。在这一过程中,不断地增加

CART树剪枝的操作的理解

的值,产生新的区间。

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

总的来说,CART剪枝算法的核心在于用【有限个子树

CART树剪枝的操作的理解

】计算【无限个

CART树剪枝的操作的理解

】,你会发现,计算过程中

CART树剪枝的操作的理解

变成了一个个分段区间。在利用公式推导时,注意【必剪枝】和【当前最优子树】的两个假设,且时刻问自己【已知参数】和【未知参数】是哪些。

继续阅读