决策树的进阶--剪枝处理

1.为什么需要对决策树做出剪枝操作?

“剪枝”是决策树学习算法对付”过拟合“的主要手段。

为什么会出现过拟合?

为了尽可能正确分类训练样本,结点的划分过程会不断重复直到不能再分,这样就可能会把训练样本的一些特点当做所有数据都具有的一般性质,从而导致过拟合。

解决策略

可以通过”剪枝“一定程度上避免因为决策分支过多,以至于把自身的一些特点当作所有数据集都具有的一般性质而导致的过拟合。

2.剪枝的基本策略

策略一    预剪枝

基本思想:在决策树的生成过程中,对每个结点划分前先做评估,如果划分不能提升决策树的泛化性能,就停止划分并将此节点记为叶节点;

策略二    后剪枝

基本思想:在决策树构造完成后,自底向上对非叶节点进行评估,如果将其换成叶节点能提升泛化性能,则将该子树换成叶节点。

3. 西瓜案例完成剪枝

 3.1 数据集

3.2 预剪枝

(1)针对上述数据集,基于信息增益准则,选取属性“脐部”划分训练集。分别计算划分前(即直接将该结点作为叶结点)及划分后的验证集精度,判断是否需要划分。

 (2)再看“脐部”为凹陷这个分支,如果对其进行划分,选择“色泽”作为划分属性。

 色泽继续划分,验证集中 编号为{4,8,11,12} 的样例被划 分正确,验证集精度为4/7*100% = 57.1%

(3)再看“脐部“为稍凹这个分支,如果对其进行划分,选择“根蒂”作为划分属性。

 根蒂继续划分,验证集中 编号为{4,5,9,11,13} 的样例被划 分正确,验证集精度为5/7*100% = 71.4%

(4)最终的决策树

(5)预剪枝的优缺点

优点:降低过拟合的风险,显著减少训练时间和测试开销时间

缺点:有欠拟合的风险,当前的划分虽然不能提升泛化性能,但在其基础上进行的后续划分却有可能显著提高性能

3.3 后剪枝

(1)先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行 分析计算,若将该结对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

 首先生成一棵完整 的决策树,验证的编号{4,11,12}划分正确,该决策 树的验证集精度为3/7= 42.9%

(2)首先考虑结点6,若将其替换为叶结点,根据落在其上的训练样本{7,15}将其标记为“好瓜”。

 验证的编号{4,8,11,12}划分正确,得到验证集精度提高为4/7=57.1%,则决定剪枝。

(3)然后考虑结点5,若将其替换为叶结点,根据落在其上的训练样本{6,7,15}将其标记为“好瓜”

 验证的编号{4,8,11,12}划分正确,得到验证集精度为4/7=57.1%,精度未提高,则决定不剪枝。

(4)对结点2,若将其替换为叶结点,根据落在其上的训练样本{1,2,3,14},将其标记为“好瓜”

验证集中 编号为{4,5,9,11,13} 的样例被划 分正确,验证集精度为5/7*100% = 71.4%,则决定剪枝。

(5)最终的决策树

(6)后剪枝的优缺点

优点:后剪枝比预剪枝保留了更多的分支,欠拟合风险小 ,泛化性能往往优于预剪枝决策树

缺点:训练时间开销大

4.决策树剪枝算法实现

4.1 数据集

这里的数据集取的是毕业生薪资等级的数据集。

professional:专业编号;gender:性别(1:男;0:女);age:年龄;socialSkill:社交能力;professionalSkill:专业能力;

isJob:薪资等级标签

这里只抽取了前16个训练样本。

03-12
### 剪枝算法概述 剪枝是一种优化技术,在多个领域得到应用,尤其是在机器学习和深度学习中用于减少模型复杂度并提高效率。对于神经网络而言,剪枝指的是移除那些被认为对预测贡献较小的连接或整个神经元的过程[^2]。 #### 深度学习中的剪枝方法 在深度学习框架下,存在多种类型的剪枝策略- **分层剪枝(Layer-wise Pruning)**:依据各层内部参数的重要性评估标准——比如绝对值大小或者梯度变化情况来决定哪些部分应该被裁减掉;这种方法能够保持原有架构不变的同时降低计算成本。 - 对于特定的目标检测模型如YOLOv8来说,探索不同形式的剪枝方案有助于理解其如何影响最终效果,并可通过实验验证最佳配置选项[^3]。 #### 决策树上的剪枝过程 而在传统机器学习里,例如决策树结构,则采用另一种思路来进行简化处理- 当遍历至某个非叶节点时,会考虑将其转换成终端节点(即不再细分),并通过简单分类规则重新定义此位置的数据归属; - 接着对比调整前后的误差率差异,以此确定是否执行这样的改动措施以防止过拟合现象的发生[^4]。 ### 应用实例 除了上述提到的技术细节外,剪枝还广泛应用于其他场合,像图形学里的凸包构建同样依赖类似的原理去除不必要的几何元素从而加快运算速度[^1]。 ```python def prune_decision_tree(node, dataset): # 将当前节点变为叶子节点 node.children = None # 使用多数表决法分配类别标签给新形成的叶子节点 majority_class = max(set([data[-1] for data in dataset]), key=list(dataset).count) # 更新节点属性 node.label = majority_class return calculate_error_rate(node, dataset) def calculate_error_rate(pruned_node, original_dataset): errors = sum(1 for item in original_dataset if predict(item[:-1], pruned_node) != item[-1]) total_samples = len(original_dataset) error_rate = float(errors)/total_samples return error_rate ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值