决策树的剪枝处理
为什么要进行决策树的剪枝处理呢?
决策树的过拟合的风险很大,因为理论上来说可以将数据完全分的开,如果树足够大,每个叶子节点就剩下了一个数据。那么,这就会造成模型在训练集上的拟合效果很好,但是泛化能力很差,对新样本的适应能力不足。所以,对决策树进行剪枝,可以降低过拟合的风险。
决策树的剪枝策略
决策树的剪枝策略分为预剪枝和后剪枝
- 预剪枝
预剪枝就是边建立决策时边进行剪枝的操作。在决策树生成的过程中,对每个节点在划分前向首先进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶子节点。
预剪枝可以:限制树的深度,叶子节点个数,叶子节点的样本数,信息增益量等。
- 后剪枝
当建立完决策树后再进行剪枝操作。后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶子节点进行考察,若将该节点对应的子树替换为叶子节点能够带来决策树泛化性能的提升,将该子树替换为叶子节点。
通过一定的衡量标准。这里讲的是CART算法的后剪枝方法——代价复杂度算法,即CCP算法。
CART算法请参考博文
T T T表示树
C ( T ) C(T) C(T)表示当前损失
T l e a f T_{leaf} Tleaf表示分裂后的叶子节点数
α ≥ 0 \alpha\ge0 α≥0为参数
C α ( T ) C_\alpha(T) Cα(T)表示损失函数的正则化
α ∣ T l e a f ∣ \alpha|T_{leaf}| α∣Tleaf∣实际上是损失函数的正则项
下面是代价复杂度算法的基本思想:
C α ( T ) = C ( T ) + α ∣ T l e a f ∣ C_\alpha(T) = C(T)+\alpha|T_{leaf}| Cα(T)=C(T)+α∣Tleaf∣
C ( T ) C(T) C(T)表示当前损失,实际上就是求分类后叶子节点的经验熵期望,计算方式为当前叶节点的样本数与当前叶结点的熵值的乘积。也就是说,叶子节点含有的样本数越多,那么这个分类效果就越混乱,损失值越大。
熵的计算参考我的博文
C ( T ) = ∑ t = 1 ∣ T l e a f ∣ N t H t ( T ) \begin{aligned}C(T) =\sum_{t=1}^{|T_{leaf}|} N_tH_t(T)\end{aligned} C(T)=t=1∑∣Tleaf∣NtHt(T)
N t N_t Nt表示该叶结点含有的样本点个数
那么, C α ( T ) = ∑ t = 1 ∣ T l e a f ∣ N t H t ( T ) + α ∣ T l e a f ∣ \begin{aligned}C_\alpha(T) = \sum_{t=1}^{|T_{leaf}|} N_tH_t(T)+\alpha|T_{leaf}|\end{aligned} Cα(T)=t=1∑∣Tleaf∣NtHt(T)+α∣Tleaf∣
α ∣ T l e a f ∣ \alpha|T_{leaf}| α∣Tleaf∣是修正项,它是基于复杂度的考虑。当叶节点分裂后与不分裂的熵值相等,实际上没有进行任何分类,但是我们认为不分类的情况更好,因为,分类后树的复杂度会更高。加了修正项后,如果 α = 0 \alpha=0 α=0表示未剪枝的树损失更小,也就是熵更小,如果 α → ∞ \alpha \to \infty α→∞表示剪枝到根节点更好,因为叶结点的个数占了主导地位。修正项 α ∣ T l e a f ∣ \alpha|T_{leaf}| α∣Tleaf∣可以避免过拟合。 α \alpha α值的设置可以更好的避免出现完全树和根节点这种极短情况,所以可以避免过拟合。
- 剪枝系数 α \alpha α的计算
假设当前对以 t t t为根节点的子树 T t T_t Tt剪枝,剪枝后只保留 t t t本身,而删除掉所有的子节点
剪枝后的损失函数为 C α ( t ) = C ( t ) + α C_\alpha(t)=C(t)+\alpha Cα(t)=C(t)+α
剪枝前的损失函数为 C α ( T t ) = C ( T t ) + α ∣ T l e a f ∣ C_\alpha(T_t) = C(T_t)+\alpha|T_{leaf}| Cα(Tt)=C(Tt)+α∣Tleaf∣
令二者相等可得到 α = C ( t ) − C ( T ) ∣ T l e a f ∣ − 1 \begin{aligned}\alpha = \frac{C(t)-C(T)}{|T_{leaf}|-1}\end{aligned} α=∣Tleaf∣−1C(t)−C(T),因为损失相同,那么就取复杂度小的,所以就可以剪枝。 α \alpha α就是节点 t t t的剪枝系数。