一颗完全生长的决策树会面临一个严重的问题——过拟合,因此我们需要剪掉一些枝叶来提高决策树的泛化能力。即使不存在过拟合,如果样本数量和分类数量是一个海量的级别,也需要预剪枝,因为计算资源不足以支撑生成完整的决策树,这也是强化学习中蒙特·卡罗尔树必须剪枝的原因。
决策树算法生成的一颗完整的决策树会非常的庞大,每个变量都被详细地考虑过。在每一个叶节点上,只要继续分支就会有信息增益的情况,不管信息增益有多大,都会进行分支操作。最终所达到的目的是决策树的叶节点所覆盖的训练样本都属于同一类。
如果我们用这个决策树来对训练集进行分类的话,那么这颗树的表现非常好。但是在测试集上的表现就远没有在训练集上的表现好,这就是过拟合问题。
顾名思义,树的剪枝就是剪掉树的一些枝叶,考虑一颗完整决策树的非叶结点枝(枝)代表着逻辑判断,也代表着分类后的子集。决策树的剪枝就是删掉一些不必要的逻辑判断,并且将子集合并。这样确实会造成在训练集上子集不纯的现象,但是因为我们最终目标是模型在测试集上的效果,所以牺牲在训练集上的效果换取解决测试集的过拟合问题这样的做法也是值得的。决策树剪枝根据先后顺序可以分为两类,一类是预剪枝(在计算资源不够的时候哪怕没有过拟合也必须预剪枝),一类是后剪枝。
预剪枝
预剪枝的核心思想是在树中结点进行扩展之前,先计算当前的划分能否带来模型泛化能力的提升,如果不能,则不再继续生长子树。此时可能存在不同类别的样本同时存于同一结点中,按照多数投票原则判断该结点所属类别。预剪枝对于何时停止决策树生长有以下几种方法。
- 当树达到一定深度时,停止树的生长。
- 当达到当前结点的样本数量小于某个阈值的时候,停止树的生长。
- 设置信息增益的一个阈值,只能信息增益大于这个阈值时才进行进一步的划分。
- 计算每次分裂对测试集的准确度提升,当小于某个阈值时,不再扩展(这个最有效,但计算复杂度也最高)。
预剪枝具有思想直接、算法简单、效率高的特点,适合解决大规模问题。但如何准确地估计何时停止树地生长(即上述方法中的深度或者阈值),针对不同情况下的问题会有很大差别,需要一定的经验进行判断。且预剪枝存在一定局限性,有欠拟合风险,虽然当前划分可能导致测试集准确度降低,但之后的划分可能会有显著上升(类似于局部极值点)。
后剪枝
后剪枝的核心思想是让算法生成一颗完全生长的决策树,然后经过计算决定是否剪枝(自底向上:REP、CCP,自顶向下:PEP)。剪枝过程中将子树删除,用一个叶子结点来替代,该结点的类别同样也可以通过测试集上的准确率来判断,如果剪枝过后准确率有提升,则进行剪枝。相比于预剪枝,后剪枝方法通常可以得到泛化能力更强的决策树,但时间开销会更大。
常见的后剪枝算法包括错误率降低剪枝(REP,Reduced Error Pruning),代价复杂度剪枝(Cost Complexity Pruning),最小误差剪枝(Minimum Error Pruning)、悲观剪枝(Pessimistic Error Purning)、CVP(Critical Value Purning)、OPP(Optimial Purning)等方法,这些方法各有利弊,在合适的场景下选择合适的方法即可。
本文介绍ERP/PEP/CCP方法。
错误率降低剪枝法 (Reduced Error Pruning)
比较trial的方法,剪一颗结点在验证集上试一试,有提升就真剪。
错误率降低剪枝法简称REP,它是通过剪枝,然后在一个新的验证集上对剪枝的有效性进行纠正来解决树的过拟合问题。对于决策树中的每一个非叶子节点的子树,我们将它替换成一个叶子节点,该叶子节点的类别用大多数原则来确定,这样就产生了一个新的相对简化决策树,然后比较这两个决策树在验证集中的表现。
如果新的决策树在验证集中的正确率较高,那么该子树就可以替换成叶子节点,从而达到决策树剪枝的目的。
该算法是自底向上依次遍历所有的子树,直至没有任何子树可以替换使得在验证集上的表现得以改进时,算法就可以终止。
悲观剪枝法 (Pessimistic Error Pruning)
悲观剪枝法(PEP)不需要一个新的验证集来做有效性检验,它按照自顶向下的顺通过计算错误率来决定要不要剪枝。
对于一个叶子结点,假设它覆盖了
个样本,其中有
个分类错误,那么该叶子节点的错误率为
其中
就是惩罚因子,那么一颗子树,它有
个叶子节点,那么该子树的误判率估计为:
我们假设在子树中每一个样本的误判服从一个二项分布
,其中
表示子树所包含的所有样本个数。
所以,在剪枝前,其误判数的期望为:
误判的标准差为:
在剪枝之后,把子树替换成叶节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率为
,因此叶节点的误判次数均值为:
当子树的误判个数大于对应叶节点的误判个数一个标准差之后,就决定剪枝。即剪枝条件为:
代价复杂度剪枝法(Cost Complexity Pruning)
代价复杂度算法(简称CCP)为子树
定义了代价和复杂度,以及一个衡量代价与复杂度之间关系的参数
.
- 代价指的是剪枝过程中因子树
被结点代替而增加的错分成本
- 复杂度表示剪枝后子树
减少的叶子结点树
表示剪枝后树的复杂度降低程度与代价之间的关系,定义为:
其中,
表示结点的错误代价,
表示结点
的错分样本率;
表示结点
中样本占全部样本的比例;
表示子树
中的叶子结点数。
CCP算法可以分为两个步骤:
- 按照上述公式自底向上计算每一个非叶结点的
值,然后每一次都剪掉具有最小
值的子树。从而得到一个集合
,其中,
表示完整的决策树,
表示根节点
- 根据真实的错误率在集合
中选出一个最好的决策树
参考文献
百面机器学习-hulu 决策树的剪枝:REP/PEP/CCP算法 决策树-剪枝算法(二)