后剪枝技术之代价复杂性剪枝

本文介绍了分类回归树中的一种后剪枝方法——代价复杂性剪枝法,并通过实例详细解释了如何计算非叶子节点的误差率增益值α,以此来决定是否对该节点进行剪枝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博文http://blog.youkuaiyun.com/tianguokaka/article/details/9018933


在分类回归树中可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。这里我们只介绍代价复杂性剪枝法。

对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。

是子树中包含的叶子节点个数;

是节点t的误差代价,如果该节点被剪枝;

r(t)是节点t的误差率;

p(t)是节点t上的数据占所有数据的比例。

是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。

比如有个非叶子节点t4如图所示:

已知所有的数据总共有60条,则节点t4的节点误差代价为:

子树误差代价为:

以t4为根节点的子树上叶子节点有3个,最终:

找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取最大的进行剪枝。


各人理解:其实并不需要这么复杂,只需要使用当前节点,比如T4中,[错误的样本数/总样本数-SUM(叶子节点错误的样本数/总样本数)]/(叶子数-1)

即[ 7/60-(2+0+3)/60 ] / (3-1)=1 / 60

关于为什么选最小的alpha值,可以将alpha理解成从当前节点到划分结束,即到叶节点,误差的一个减少值,alpha越小,说明误差期间减少的越少,既然花这么大功夫,误差才减少了那么一丢丢,所以就宁愿不要,即减去剩下的部分,将当前节点作为叶节点。

### 决策树中预剪枝后剪枝的概念及区别 #### 预剪枝概念 预剪枝是指在构建决策树的过程中,在每次分裂之前,先评估当前节点的划分是否能够提高模型的泛化能力。如果预计不会带来性能提升,则提前终止该分支的增长,并将其标记为叶节点[^3]。 #### 后剪枝概念 后剪枝则是指首先生成一颗完整的决策树,随后通过自底向上的方式逐一对非叶子节点进行检验。对于每一个非叶子节点,判断其对应的子树是否可以用单一的叶节点替代来获得更好的泛化效果。如果是,则将此子树替换为单个叶节点。 #### 主要区别 1. **结构复杂度** - 预剪枝倾向于较早地停止生长,因此产生的决策树通常较为简单,分支较少。 - 而后剪枝允许初始阶段充分扩展整棵树后再做裁减,所以最终得到的树可能更加复杂并保留更多细节[^2]。 2. **过拟合/欠拟合风险** - 由于预剪枝可能会因为过于保守而错过某些潜在有用的特征分割点,存在较高的欠拟合可能性。 - 反之,后剪枝因前期不加限制地发展整个树形结构,再依据验证数据调整局部区域,故其欠拟合的风险相对较低[^1]。 3. **计算成本** - 实施预剪枝时只需考虑每一步操作的影响即可决定下一步行动方向,整体流程简洁明快,所需资源消耗也较小。 - 对于后剪枝而言,除了正常建立全量版决策树外还需额外执行一轮逆序扫描优化动作,这无疑增加了算法运行时间和内存占用情况。 4. **实际表现差异** - 尽管如此,实验表明大多数情形下采用后剪枝方法所获模型具备更强适应未知样本的能力即更高的准确性得分;然而这一切是以牺牲效率换取质量的结果作为代价呈现出来的。 ```python # 示例代码展示如何实现简单的预剪枝逻辑 (伪代码形式) def pre_prune(node, dataset): if not can_improve_generalization(dataset): node.set_as_leaf() return split_dataset_into_subsets() # 进行常规的数据拆分处理... for subset in subsets: new_node = create_new_child_node(subset) # 创建新的孩子节点对象实例.. pre_prune(new_node, subset) # 继续递归调用本函数直至满足条件为止. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值