随着决策树深度的增大,模型效果会变化,但增大太多就会导致过拟合的情况,对于过拟合,常见的有两咱优化方式:
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
使用验证集选择最优子树的标准,可以使用原始损失函数来考虑:
剪枝损失函数及剪枝系数
原始损失函数:(就是上面那个公式)
叶节点越多,决策树越复杂,损失越大;修正添加剪枝系数(原始损失函数的基础上,修正一下。不是叶节点越多,不是越复杂吗,损失越大吗,这样引入叶子数leaf,同时乘上一个系数,即α*leaf,作为剪枝系数,以此来进行修正。最终结果越小越好。相当于加正则项的操作),修改后的损失函数为:
考虑根节点为r的子树,剪枝前后的损失函数分别为loss®和loss®,当这两者相等的时候,可以求得剪枝系数:
对上面这个式子进行一下推导(例如有下图这样一棵决策树):
对于根节点为
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}
α=Rleaf−1loss(r)−loss(R)
分析这个式子,我们希望的是剪枝前后变化越小越好,即分子越小越好;同时希望剪去的节点越多越好,即分母越大越好。总的结果就是α越小越好。
这里补充一点:
sklearn已经封装好了决策树的实现,其中用到的是前置剪枝(后枝剪枝比较麻烦,每次都得算一下剪枝系数,而且要进行交叉验证,剪枝的过程中形成的k个模型都得验证。综合考量,性能没想象中的好,还耗时间。比较推荐是随机森林)。