0 简介

CART剪枝算法从"完全生长"的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。

分两步:

  1.从生产算法产生的整体的树 数据挖掘实践(51):决策树cart剪枝实例_结点 的最底端开始不断剪枝,直至剪到整个树 数据挖掘实践(51):决策树cart剪枝实例_结点 的根结点为止,从而形成了一个子树序列 数据挖掘实践(51):决策树cart剪枝实例_决策树_03 ;

  2.通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选出最优子树。

1.剪枝,形成一个子树序列

剪枝剪枝,怎么来剪?

  从前面第4节将的剪枝内容来看,我们需要整一个损失函数来控制剪枝。

  这个损失函数为: 数据挖掘实践(51):决策树cart剪枝实例_子树_04

  其中,T任意子树, 数据挖掘实践(51):决策树cart剪枝实例_损失函数_05 为对训练数据的预测误差(如基尼指数), 数据挖掘实践(51):决策树cart剪枝实例_子树_06 为子树的叶结点个数,表示树的复杂度的。 数据挖掘实践(51):决策树cart剪枝实例_结点_07 为参数, 数据挖掘实践(51):决策树cart剪枝实例_损失函数_08 为参数是 数据挖掘实践(51):决策树cart剪枝实例_子树_09 时的子树T的整体损失。

参数 数据挖掘实践(51):决策树cart剪枝实例_子树_09 权衡训练数据的拟合程度与模型的复杂度。

  上述关于损失函数的定义,在前面的章节中已经介绍的非常多了,看过前面的这部分就不难理解。以后的章节中,如果遇到前面详细介绍过的内容,除非必要,就都不啰嗦了。

  对固定的一个 数据挖掘实践(51):决策树cart剪枝实例_子树_09 值,一定存在使损失函数 数据挖掘实践(51):决策树cart剪枝实例_损失函数_08 最小的子树,将其表示为 数据挖掘实践(51):决策树cart剪枝实例_取值_13 。这个 数据挖掘实践(51):决策树cart剪枝实例_子树_09 取值越大,最优子树就偏向于简单地子树(即叶结点少), 数据挖掘实践(51):决策树cart剪枝实例_子树_09 取值越小,最优子树偏向于与训练数据集更好地拟合。我们可以想象一个极端情况,当 数据挖掘实践(51):决策树cart剪枝实例_结点_16 时,最优子树是根结点构成的单结点树;当 数据挖掘实践(51):决策树cart剪枝实例_子树_17 时,最优子树就是整体树本身。(这个一定要结合上面的损失函数公式来理解)。

  Breiman(CART提出者)等人证明:可以用递归的方法对树进行剪枝。什么意思呢?就是将 数据挖掘实践(51):决策树cart剪枝实例_子树_09 从0开始逐渐增大, 数据挖掘实践(51):决策树cart剪枝实例_结点_19 ,产生一系列的区间 数据挖掘实践(51):决策树cart剪枝实例_取值_20 ;对每一个 数据挖掘实践(51):决策树cart剪枝实例_子树_09 取值,都能得到一个最优子树,最终得到对应的最优子树集 数据挖掘实践(51):决策树cart剪枝实例_决策树_03 ,序列中 数据挖掘实践(51):决策树cart剪枝实例_结点 是整树,一直到 数据挖掘实践(51):决策树cart剪枝实例_决策树_24 (根结点构成的单结点树),是嵌套的。子树序列对应着区间 数据挖掘实践(51):决策树cart剪枝实例_损失函数_25 。

数据挖掘实践(51):决策树cart剪枝实例_决策树_26

 

 数据挖掘实践(51):决策树cart剪枝实例_结点_27

 

 数据挖掘实践(51):决策树cart剪枝实例_结点_28

 

 数据挖掘实践(51):决策树cart剪枝实例_取值_29

 

 整个剪枝过程的示意图如上。接下来我们来看看具体数学过程是怎样的。

从整体树 数据挖掘实践(51):决策树cart剪枝实例_结点 开始剪枝。对于 数据挖掘实践(51):决策树cart剪枝实例_结点 的任意内部结点t(除叶结点外的所有结点,包括根结点),计算以t为单结点树的损失函数:

如下图

数据挖掘实践(51):决策树cart剪枝实例_损失函数_32

 

 然后计算以t为根结点的子树 数据挖掘实践(51):决策树cart剪枝实例_子树_33 的损失函数:

数据挖掘实践(51):决策树cart剪枝实例_损失函数_34

 

 如下图

数据挖掘实践(51):决策树cart剪枝实例_结点_35

 

 

接下来进行 数据挖掘实践(51):决策树cart剪枝实例_子树_36 的比较:

1) 当 数据挖掘实践(51):决策树cart剪枝实例_取值_37 ,有不等式

数据挖掘实践(51):决策树cart剪枝实例_决策树_38

意思是,此时如果保留这个子树,得到的总的损失函数是会比剪掉它更小的,所以我们选择保留子树不剪。

2) 当 数据挖掘实践(51):决策树cart剪枝实例_子树_09 增大时,在某一 数据挖掘实践(51):决策树cart剪枝实例_子树_09 值时有

数据挖掘实践(51):决策树cart剪枝实例_结点_41

此时,由公式可以推出: 数据挖掘实践(51):决策树cart剪枝实例_决策树_42 。 数据挖掘实践(51):决策树cart剪枝实例_损失函数_43 在这时取相同的损失函数值。但由于t的结点少,因此t比 数据挖掘实践(51):决策树cart剪枝实例_子树_33 更可取,故应对子树 数据挖掘实践(51):决策树cart剪枝实例_子树_33 进行剪枝。

3) 当 数据挖掘实践(51):决策树cart剪枝实例_子树_09 再增大时,1)中的不等式反向,即

数据挖掘实践(51):决策树cart剪枝实例_子树_47

此时就应该再取下一个内部结点,进行下一步剪枝判断了。

对 数据挖掘实践(51):决策树cart剪枝实例_结点 中每一内部结点t,计算:

数据挖掘实践(51):决策树cart剪枝实例_损失函数_49 (即对应着不同的 数据挖掘实践(51):决策树cart剪枝实例_子树_09 取值)

  这个g(t)表示剪枝后整体损失函数减少的程度。在 数据挖掘实践(51):决策树cart剪枝实例_结点 中减去g(t)值最小的子树 数据挖掘实践(51):决策树cart剪枝实例_子树_33 ,将得到的剩下的子树作为 数据挖掘实践(51):决策树cart剪枝实例_取值_53 ,同时将最小的g(t)设为 数据挖掘实践(51):决策树cart剪枝实例_子树_54 。 数据挖掘实践(51):决策树cart剪枝实例_取值_53 为区间 数据挖掘实践(51):决策树cart剪枝实例_结点_56 的最优子树。

  如此剪枝下去,直至得到根结点。在这一过程中,不断地增加 数据挖掘实践(51):决策树cart剪枝实例_子树_09 的值,得到更小的子树,产生新的区间。就得到了最优子树序列, 数据挖掘实践(51):决策树cart剪枝实例_决策树_03 ,剪枝后对新的叶结点t以多数表决法决定其类。

 

2.在剪枝得到的子树序列 数据挖掘实践(51):决策树cart剪枝实例_决策树_59 中通过交叉验证选取最优子树 数据挖掘实践(51):决策树cart剪枝实例_决策树_60

  利用独立的验证数据集,测试子树序列 数据挖掘实践(51):决策树cart剪枝实例_决策树_59 中各棵子树的平方误差或基尼指数。选择平方误差或基尼指数最小的决策树作为最优的决策树。在子树序列中,每棵子树 数据挖掘实践(51):决策树cart剪枝实例_决策树_59 都对应于一个参数 数据挖掘实践(51):决策树cart剪枝实例_损失函数_63 。所以,当最优子树 数据挖掘实践(51):决策树cart剪枝实例_结点_64 确定时,对应的 数据挖掘实践(51):决策树cart剪枝实例_取值_65 也确定了,即得到最优决策树 数据挖掘实践(51):决策树cart剪枝实例_决策树_60 。