当我们输入的原始数据有较多的变量时,通过决策树算法生成的决策树可能会非常的庞大。这样的一颗决策树在训练集上有很好的表现,但是在测试集上的表现往往不甚理想,这样的问题也被叫做过拟合问题。面对这样的问题,我们一般所采用的方法是对决策树进行剪枝操作。
本文详细介绍了三种剪枝算法,并配以计算实例。
决策树的过拟合问题
决策树算法生成的决策树非常庞大,每个变量都被详细地考虑过。在每一个叶节点上,只要继续分支会有信息增益的情况,不管信息增益有多大,都会进行分支操作。最终所达到的目的是决策树的叶节点所覆盖的训练样本都属于同一类。
如果我们用这个决策树来对训练集进行分类的话,那么这颗树的表现非常好。但是在测试集上的表现就远没有在训练集上的表现好,这就是过拟合问题。
决策树的剪枝
顾名思义,树的剪枝就是剪掉树的一些枝叶,考虑大决策树的枝代表着逻辑判断,也代表着分类后的子集。决策树的剪枝就是删掉一些不必要的逻辑判断,并且将子集合并。这样确实会造成在训练集上子集不纯的现象,但是因为我们最终目标是模型在测试集上的效果,所以牺牲在训练集上的效果换取解决测试集的过拟合问题这样的做法也是值得的。决策树剪枝可以分为两类,一类是预剪枝,一类是后剪枝。
预剪枝
预剪枝就是在生成决策树的同时进行剪枝。正常决策树的生成是只要有信息增益就要进行分支。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。预剪枝的思想比较简单,但在实际应用中,预剪枝的表现并不是很好。所以,目前我们基本都是使用后剪枝方法。
后剪枝
后剪枝就是在决策树构造完成后进行剪枝。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。后剪枝就是删除一些子树,然后用其叶节点代替。这个叶节点代表的子集不一定都是“纯”的。那么,这个叶子节点所标识的类别通过大多数原则确定。大多数原则就是指这个叶节点所代表的子集中大多数的类别来表示这个叶节点。
常见的后剪枝算法
错误率降低剪枝法
错误率降低剪枝法(Reduced-Error Pruning)简称REP方法。
REP方法是通过一个新的验证集来纠正树的过拟合问题。对于决策树中的每一个非叶子节点的子树,我们将它替换成一个叶子节点,该叶子节点的类别用大多数原则来确定,这样就产生了一个新的相对简化决策树,然后比较这两个决策树在验证集中的表现。
如果新的决策树在验证集中的正确率较高,那么该子树就可以替换成叶子节点,从而达到决策树剪枝的目的。
该算法是从下往上依次遍历所有的子树,直至没有任何子树可以替换使得在验证集上的表现得以改进时,算法就可以终止。
实例:
假设上图是我们生成的决策树,我们要对其进行剪枝,使用REP算法。
Step 1: 将节点4删掉替换成8和9,测试在验证集上的表现,若表现更好,则将节点4删掉并替换成8和9的并集,若表现不好则保留原树的形状。
Step 2: 将节点2删掉替换成8、9和5,测试在验证集上的表现
Step 3: 将节点3删掉替换成6和7,测试在验证集上的表现
悲观剪枝法
悲观剪枝法(Pessimistic Error Pruning)简称PEP方法。
上文的REP方法思想简单且易于使用,不过最大的问题在于它需要一个新的验证集来修正我们的决策树。在PEP方法中,我们不需要新的验证集。
PEP方法也是根据剪枝前后的错误率来决定是否剪枝。和REP不同之处在于:PEP不需要新的验证集,并且PEP是自上而下剪枝的。由于我们还是用生成决策树时相同的训练样本,那么对于每个节点剪枝后的错分率一定是会上升的,因此在计算错分率时需要加一个惩罚因子0.5。
对于一叶节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为:
p = ∑ i = 1 L E i + 0.5 L ∑ i = 1 L N i p =\dfrac{\sum_{i=1}^{L}E_i+0.5L}{\sum_{i=1}^{L}N_i} p=∑i=1LNi∑i=1LEi+0.5L
我们假设在子树中每一个样本的误判服从一个二项分布 B ( N , p ) B(N,p) B(N,p),其中N表示子树所包含的所有样本个数。
所以,在剪枝前,其期望的误判数为:
E ( 剪 枝 前 误 判 数 ) = N ∗ p E(剪枝前误判数) = N*p E(剪枝前误判数)=N∗p
其误判的标准差为:
s t d ( 剪 枝 前 误 判 数 ) = N ∗ p ∗ ( 1 − p ) std(剪枝前误判数) = \sqrt{N*p*(1-p)} std(剪枝前误判数)=N∗p∗(1−p)
在剪枝之后,把子树替换成叶节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶节点的误判次数均值为:
E ( 剪 枝 后 误 判 数 ) = N ∗ e E(剪枝后误判数) = N*e E(剪枝后误判数)=N∗