从零开始学Python【36】--决策树剪枝的来龙去脉

还没关注?

640?wx_fmt=png

快动动手指!

往期回顾

从零开始学Python【34】--CART决策树(理论部分)

从零开始学Python【35】--CART决策树(实战部分)


前言

决策树的剪枝通常有两类方法,一类是预剪枝,另一类是后剪枝。预剪枝很好理解,就是在树的生长过程中就对其进行必要的剪枝,例如限制树生长的最大深度,即决策树的层数、限制决策树中间节点或叶节点中所包含的最小样本量以及限制决策树生成的最多叶节点数量等;后剪枝相对来说要复杂很多,它是指决策树在得到充分生长的前提下再对其返工修剪。常用的剪枝方法有误差降低剪枝法、悲观剪枝法和代价复杂度剪枝法等,下面将详细介绍这三种后剪枝方法的理论知识。


误差降低剪枝法

该方法属于一种自底向上的后剪枝方法,剪枝过程中需要结合测试数据集对决策树进行验证,如果某个节点的子孙节点都被剪去后,新的决策树在测试数据集上的误差反而降低了,则表明这个剪枝过程是正确的,否则就不能对其剪枝。为了使读者明白该方法的剪枝过程,以下图中的决策树为例,介绍该剪枝法的具体操作步骤。


640?wx_fmt=png


1)将决策树的某个非叶子节点作为剪枝的候选对象(如图中的640?wx_fmt=png处节点),如果将其子孙节点删除(对应的两个叶节点),则640?wx_fmt=png处的节点就变成了叶节点。

2)利用投票原则,将此处叶节点中频数最高的类别用作分类标准(如图中剪枝后该叶节点属于类A)。

3)利用剪枝后的新树在测试数据集上进行预测,然后对比新树与老树在测试集上的误判样本量,如果新树的误判样本量低于老树的误判样本量,则将640?wx_fmt=png处的中间节点替换为叶节点,否则不进行剪枝。

4)重复前面的三步,直到新的决策树能够最大限度地提高测试数据集上的预测准确率。


虽然该方法是最简单的后剪枝方法之一,但由于它需要结合测试数据集才能够实现剪枝,因此就可能导致剪枝过度的情况。为了避免剪枝过程中使用测试数据集便产生了悲观剪枝法,下面介绍该方法的实现原理和过程。


悲观剪枝法

该方法的剪枝过程恰好与误差降低剪枝法相反,它是自顶向下的剪枝过程。虽然不再使用独立的测试数据集,但是简单地将中间节点换成叶节点肯定会导致误判率的提升,为了能够对比剪枝前后的叶节点误判率,必须给叶节点的误判个数加上经验性的惩罚系数0.5。所以,剪枝前后叶节点的误判率可以表示成:

640?wx_fmt=png


其中,640?wx_fmt=png表示剪枝后中间节点被换成叶节点的误判率;640?wx_fmt=png表示中间节点剪枝前其对应的所有叶节点的误判率;640?wx_fmt=png为中间节点处的误判个数;·640?wx_fmt=png为节点下的所有叶节点误判个数;L表示中间T节点对应的所有叶节点个数;N表示中间节点的样本个数;640?wx_fmt=png表示各叶节点中的样本个数,其实640?wx_fmt=png


对比剪枝前后叶节点误判率的标准就是,如果剪枝后叶节点的误判率期望在剪枝前叶节点误判率期望的一个标准差内,则认为剪枝是合理的,否则不能剪枝。可能读者在理解这种剪枝方法时比较困惑,这里举一个例子加以说明,一个剪枝示意图如下图所示。


640?wx_fmt=png

假设以640?wx_fmt=png节点为例,剪枝前对应了3个叶节点,误判个数分别为3,2,0;如果将其所有叶节点都剪掉,640?wx_fmt=png便成为了640?wx_fmt=png的叶节点,误判样本数为7。按照上方的计算公式,可以得到:

640?wx_fmt=png


现在的问题是,误判率640?wx_fmt=png的标准差该如何计算。由于误判率属于0-1分布,即每个节点中只有正确分类和错误分类两种情况,因此根据0-1分布的期望(640?wx_fmt=png)和方差(640?wx_fmt=png)公式,可以得到640?wx_fmt=png的与640?wx_fmt=png的期望及640?wx_fmt=png的方差:

640?wx_fmt=png

最后,根据剪枝的判断标准640?wx_fmt=png,可以判断640?wx_fmt=png节点是否可以被剪枝:

640?wx_fmt=png

很明显,上面所计算的不等式是满足条件的,所以可以认定640?wx_fmt=png节点是需要进行剪枝、将其转换成叶节点的。通过上面的举例,相信读者应该理解悲观剪枝法的思路,接下来介绍一种基于目标函数的剪枝方法,即代价复杂度剪枝法。


代价复杂度剪枝法

从字面理解,该剪枝方法涉及两则信息,一则是代价,是指将中间节点替换为叶节点后误判率会上升;另一则是复杂度,是指剪枝后叶节点的个数减少,进而使模型的复杂度下降。为了平衡上升的误判率与下降的复杂度,需要加入一个系数a,故可以将代价复杂度剪枝法的目标函数写成:

640?wx_fmt=png


其中,640?wx_fmt=png640?wx_fmt=png表示640?wx_fmt=png节点下第640?wx_fmt=png个叶节点;640?wx_fmt=png为第640?wx_fmt=png个叶节点的样本量;640?wx_fmt=png为第640?wx_fmt=png个叶节点的信息熵;640?wx_fmt=png为节点640?wx_fmt=png对应的所有叶节点个数;a就是调节参数。问题是参数a该如何计算呢?可以通过下式推导所得:

节点640?wx_fmt=png剪枝前的目标函数值为:

640?wx_fmt=png

节点640?wx_fmt=png剪枝后的目标函数值为:

640?wx_fmt=png

640?wx_fmt=png,得到:

640?wx_fmt=png

通过上面的公式,可以计算出所有非叶子节点的a值,然后循环剪去最小a值所对应的节点树。下面结合图来说明代价复杂度剪枝的详细过程。


640?wx_fmt=png

(1)对于一棵充分生长的树,不妨含有4个非叶子节点和5个叶子节点,根据计算a值的公式,可以得到所有非叶子节点对应的a值。

(2)挑选出最小的a值,不妨为640?wx_fmt=png,然后对640?wx_fmt=png进行剪枝,使其成为叶子节点,便得到一棵新树。

(3)接下来重新计算剩余非叶子节点所对应的a值。

(4)不断重复(2)和(3),直到决策树被剪枝成根节点,最终得到640?wx_fmt=png棵新树。

(5)将测试数据集运用到640?wx_fmt=png棵新树中,再从中挑选出误判率最低的树作为最佳的决策树。


如上介绍的三种决策树后剪枝方法都是比较常见的,其思路也比较通俗易懂,可惜的是sklearn模块并没有提供后剪枝的运算函数或“方法”。这并不意味着sklearn模块中的决策树算法没有实际的落地意义,因为它提供了决策树的预剪枝技术,如果预剪枝不够理想,读者还可以使用集成的随机森林算法,该算法综合了多棵决策树,可以很好地避免单棵决策树过拟合的可能。关于随机森林的思想和实战可以查看《》一文。


结语

OK,关于决策树剪枝的理论知识我们就分享到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。


每天进步一点点:数据分析1480

640?wx_fmt=png

长按扫码关注我

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sim1480

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值