机器学习(决策树四)——简述 剪枝

随着决策树深度的增大,模型效果会变化,但增大太多就会导致过拟合的情况,对于过拟合,常见的有两咱优化方式:

1 . 剪枝优化
决策树过度拟合一般情况是由于节点太多导致的(也就是树太深,这样可不可以把某些节点给合并一下,合并之后,节点数目不就降下去了吗,降下去之后模型就应该不会存在太过拟合的问题),剪枝优化对决策树的正确率影响是比较大的,也是最常用的一种优化方式。

2 . Random Forest(随机森林,其实是另外一种算法,后续会介绍)
利用训练数据随机产生多个决策树,形成一个森林。然后使用这个森林对数据进行预测,选取最多结果作为预测结果。

剪枝分类

决策树的剪枝是决策树算法中最基本、最有用的一种优化方案,主要分为两大类:

1 . 前置剪枝

在构建决策树的过程中,提前停止(到底什么时候结束,其实这是一个超参,超参不好得到)。结果是决策树一般比较小,实践证明这种策略无法得到比较好的结果。

2 . 后置剪枝

在决策树构建好后,然后再开始裁剪,一般使用两种方式:

  • 用单一叶子节点代替整个子树,叶节点的分类采用子树中最主要的分类;
  • 将一个子树完全替代另外一棵子树。

后置剪枝的主要问题是计算效率问题,存在一定的浪费情况。

剪枝过程

1. 先来看一下后剪枝总体思路(和交叉验证思路类似):

  • 由完全树 T 0 T_0 T0 开始,剪枝部分节点得到 T 1 T_1 T1 ,再次剪枝得到 T 2 T_2 T2 …直到仅剩树根的树 T k T_k Tk
  • 在验证数据集上对这 k+1 个树进行评价,选择最优树 T a T_a Ta (也就是损失函数最小的树)

2. 接下来看一下决策树剪枝的详细过程:

对于给定的决策树 T 0 T_0 T0

  • 计算所有内部非叶子节点的剪枝系数
  • 查找最小剪枝系数(其实就是影响最小)的节点,将其子节点进行删除操作,进行剪枝得到决策树 T k T_k Tk ; 如果存在多个最小剪枝系数节点,选择包含数据项最多的节点进行剪枝操作
  • 重复上述操作,直到产生的剪枝决策树 T k T_k Tk 只有1个节点
  • 得到决策树 T 0 T 1 T 2 . . . . T k T_0 T_1 T_2 ....T_k T0T1T2....Tk
  • 使用验证样本集选择最优子树 T a T_a Ta

使用验证集选择最优子树的标准,可以使用原始损失函数来考虑:
机器学习(决策树四)——简述 剪枝_第1张图片

剪枝损失函数及剪枝系数

原始损失函数:(就是上面那个公式)
机器学习(决策树四)——简述 剪枝_第2张图片
叶节点越多,决策树越复杂,损失越大;修正添加剪枝系数(原始损失函数的基础上,修正一下。不是叶节点越多,不是越复杂吗,损失越大吗,这样引入叶子数leaf,同时乘上一个系数,即α*leaf,作为剪枝系数,以此来进行修正。最终结果越小越好。相当于加正则项的操作),修改后的损失函数为:
在这里插入图片描述
考虑根节点为r的子树,剪枝前后的损失函数分别为loss®和loss®,当这两者相等的时候,可以求得剪枝系数:

机器学习(决策树四)——简述 剪枝_第3张图片
对上面这个式子进行一下推导(例如有下图这样一棵决策树):
机器学习(决策树四)——简述 剪枝_第4张图片
对于根节点为 r r r 的子树,其他部分的损失函数是一样的过程,就不考虑。剪之前:
l o s s r ( R ) = l o s s ( R ) + α R l e a f loss_r(R) =loss(R)+αR_{leaf} lossr(R)=loss(R)+αRleaf
其中 R l e a f R_{leaf} Rleaf r r r 子树的子节点,剪之后, r r r 这棵子树就变成了一个叶子节点
l o s s α ( r ) = l o s s ( r ) + α ∗ 1 = l o s s ( r ) + α loss_α(r)=loss(r)+α*1=loss(r)+α lossα(r)=loss(r)+α1=loss(r)+α
最理想的情况就是剪之后,没什么变化,也就是 l o s s r ( R ) = l o s s α ( r ) loss_r(R)=loss_α(r) lossr(R)=lossα(r),即:
l o s s ( R ) + α R l e a f = l o s s ( r ) + α loss(R)+αR_{leaf} = loss(r)+α loss(R)+αRleaf=loss(r)+α
即得到最终的 α α α
α = l o s s ( r ) − l o s s ( R ) R l e a f − 1 α=\frac{loss(r)−loss(R)}{R_{leaf} −1} α=Rleaf1loss(r)loss(R)
分析这个式子,我们希望的是剪枝前后变化越小越好,即分子越小越好;同时希望剪去的节点越多越好,即分母越大越好。总的结果就是α越小越好。

这里补充一点:
sklearn已经封装好了决策树的实现,其中用到的是前置剪枝(后枝剪枝比较麻烦,每次都得算一下剪枝系数,而且要进行交叉验证,剪枝的过程中形成的k个模型都得验证。综合考量,性能没想象中的好,还耗时间。比较推荐是随机森林)。

你可能感兴趣的:(机器学习)