剪枝(pruning)是决策树学习算法应对过拟合的主要手段。因为决策树模型太强大了,很可能把训练集学得太好以致于把训练集本身的特性也给学习了(特别是属性数多于样本数的情况),所以去除掉一些分支是有必要的。

怎么判断剪枝有没有用呢?具体来说就是判断剪枝后模型的泛化性能有没有提升?这就涉及到第二章模型评估与选择的内容了。不过这里不用做比较检验,我们需要做的首先是选定一种评估方法划分训练集和测试集,然后选定一种性能度量用来衡量剪枝前后的模型在测试集上的效果。

预剪枝

预剪枝(prepruning)是在决策树生成的过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升(比方说,划分后在测试集上错得更多了 / 划分前后在测试集上效果相同),就停止划分并将当前节点标记为叶节点。

后剪枝

后剪枝(postpruning)是先从训练集生成一颗完整的决策树,然后自底向上地逐个考察非叶节点,若将该节点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。实际任务中,即使没有提升,只要不是性能下降,一般也会剪枝,因为根据奥卡姆剃刀准则,简单的模型更好。

特别地,只有一层划分(即只有根节点一个非叶节点)的决策树称为决策树桩(decision stump)

优缺点

预剪枝是一种贪心策略,因为它在决策树生成时就杜绝了很多分支展开的机会,所以不但降低了过拟合的风险,同时也显著减少了模型的训练时间开销和测试时间开销。但是!这种贪心策略有可能导致欠拟合,因为有可能当前划分不能提升模型的泛化性能,但其展开的后续划分却会显著提升泛化性能。在预剪枝中这种可能被杜绝了。

后剪枝是种比较保守的策略,欠拟合的风险很小,泛化性能往往优于预剪枝的决策树。但是由于后剪枝是在生成了完整决策树后,自底向上对所有非叶节点进行考察,所以训练时间开销要比未剪枝决策树和预剪枝决策树都大得多