在决策树的学习过程中,为了尽可能正确分类训练样本,节点划分过程将不断重复,有时会造成决策树分支过多,这是可能因为训练样本学的“太好了”,以至于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合,而剪枝是决策树学习算法应对“过拟合”的主要手段,所以我们可以通过主动去掉一些分支来降低过拟合的风险,这就是决策树剪枝。决策树剪枝的基本策略有“预剪枝”和“后剪枝”,预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化能力的提升,则停止划分并将当前节点标记为叶节点,后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。
我们采用下表所示的数据集,编号为{1,2,3,6,7,10,14,15,16,17}的样例为训练集,编号为{4,5,8,9,11,12,13}的样例组成验证集。
表一:基于西瓜数据集的训练集和验证集
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
我们采用信息增益准则来进行划分属性选择,基于表一中的训练集则可生成如下图所示的一棵未剪枝决策树,为了便于讨论,我们对图中的部分节点做了编号。
图一:未剪枝决策树
预剪枝
基于信息增益准则,我们会选取属性“脐部”来对训练集进行划分,并产生三个分支,如下图所示,然而是否应该进行这个划分,预剪枝需要对划分前后的泛化能力进行评估,在划分之前,所有样例集中在根节点,若不进行划分,该节点被标记为叶节点,其类别标记为训练样例数最多的类别,假设我们将这个叶节点标记为好瓜,用验证集对这个单节点决策树进行评估,则{4,5,8}的样例被分类正确,另外4个样例分类错误,于是,验证集精度为3/7*100%=42.9%
图二:预剪枝决策树
在用属性“脐部”划分之后,上图中节点2,3,4分别包含编号为{1,2,3,14},{6,7,15,17},{10,16}的训练样例,因此这三个节点分别被标记为叶节点“好瓜”,“好瓜”,“坏瓜”,此时,验证集编号为{4,5,8,11,12}的样例被分类正确,验证集精度为5/7*100%=71.4%>42.9%,于是,用“脐部”进行划分得以确定,然后,决策树算法应该对节点2进行划分,基于信息增益准则将挑选出划分属性“色泽”,然而在使用“色泽”划分后,编号为{5}的验证集样本分类结果会由正确转为错误,使得验证集精度下降为57.1%,于是预剪枝策略将禁止节点2被划分,对节点3,最优划分属性为“根蒂”,划分后验证集精度仍为71.4%,这个划分不能提升验证集精度,于是预剪枝策略禁止节点3被划分,对于节点4,其所含训练样例已属于同一类,不再进行划分,于是,基于预剪枝策略所生成的决策树如图二所示,其验证集精度为71.4%,这是一颗仅有一层划分的决策树,亦称“决策树桩”。
由对比可知,预剪枝使得决策树的很多分支都没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销,但另一方便,有些分支的当前划分虽不能提升泛化性能,甚至可能导致泛化性能暂时下降,但是在其基础上进行的后续划分却有可能导致性能显著提高,预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
后剪枝
后剪枝先从训练集生成一棵完整决策树,如图一所示的未剪枝决策树,该决策树的验证集精度为42.9%,后剪枝首先考察图一中的节点6,若将其领衔的分支剪除,则相当于把6替换为叶节点,替换后的叶节点包含编号为{7,15}的训练样本,于是该叶节点的类别标记为“好瓜”,次数决策树的验证集精度提升到57.1%,于是后剪枝策略决定剪枝,然后考察节点5,若将其替换为叶节点,则替换后的叶节点包含编号为{6,7,15}的训练样例,叶节点类别标记为“好瓜”,此时决策树验证集精度仍为57.1%,于是,可以不进行剪枝,对节点2,若将其替换为叶节点,则替换后的叶节点包含编号为{1,2,3,14}的训练样例,叶节点标记为“好瓜”,此时决策树的验证集精度提升到71.4%,于是后剪枝策略决定剪枝,对节点3和节点1,若将其替换,精度分别提升为71.4%和42.9%,均未得到提高,于是都被保留,最终,基于后剪枝策略我们最终得到了如下图所示的后剪枝决策树,其验证集精度为71.4%。
图三:后剪枝决策树
由对比可知,后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶节点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。