决策树的预剪枝与后剪枝

article/2025/9/15 13:24:07

前言:

本次讲解参考的仍是周志华的《机器学习》,采用的是书中的样例,按照我个人的理解对其进行了详细解释,希望大家能看得懂。

1、数据集

其中{1,2,3,6,7,10,14,15,16,17}为测试集,{4,5,8,9,11,12,13}为训练集。

2、预剪枝

预剪枝是要对划分前后泛化性能进行评估。对比决策树某节点生成前与生成后的泛化性能。

(1)在未划分前,根据训练集,类别标记为训练样例数最多的类别,由于训练集中的好瓜与坏瓜是相同多的类别,均为5,因此任选其中一类,书中选择了好瓜作为标记类别。

当所有节点集中在根节点,所有训练集属于标记类别的仅有{4,5,8},因此分类正确的是3/7*100%=42.9%

编号好瓜(正确结果)
4
5
8
9
11
12
13
 3/7

(2)计算训练集的信息增益,得知脐部的信息增益最大,因此按照脐部进行划分。又因为在训练集中,凹陷特征好瓜的占比多,因此凹陷划分为好瓜,稍凹特征好过占比多,因此将其标记为好瓜,因此按照脐部划分的子树结果如下:

划分后,对比结果如下:

编号好瓜(正确结果)按照脐部划分
4(凹陷)
5(凹陷)
8(稍凹)
9(稍凹)是(划分错误)
11(平坦)
12(平坦)
13(凹陷)是(划分错误)
正确率3/75/7(精度提高,划分)

(3)在脐部划分的基础上,进一步计算凹陷、根蒂特征下,其他属性的信息增益,根据计算结果可知,在凹陷的情况下,色泽的信息增益最大,因此对于凹陷的西瓜,进一步确定按照色泽进行划分,划分结果如下:

对于凹陷数据,进一步按照色泽进行划分后,对比划分前后的准确性:

编号好瓜(正确结果)按照脐部划分对凹陷,按照色泽划分
4(凹陷、青绿)
5(凹陷、浅白)
8(稍凹)(不满足条件的,按照上一次划分结果照写)
9(稍凹)是(划分错误)
11(平坦)
12(平坦)
13(凹陷、青绿)是(划分错误)
正确率3/75/7(精度提高,划分)4/7(精度降低,不划分)

对稍凹数据集,进一步计算其他属性的信息增益,确定根蒂的信息增益最大,因此对稍凹,进一步按照根蒂进行划分:

对于稍凹数据,进一步按照根蒂进行划分后,对比划分前后的准确性:

编号好瓜(正确结果)按照脐部划分对稍凹,按照根蒂划分
4(凹陷)(不满足条件的,按照上次换发你结果照写)
5(凹陷)
8(稍凹、蜷缩)
9(稍凹、蜷缩)是(划分错误)
11(平坦)
12(平坦)
13(凹陷)是(划分错误)
正确率3/75/7(精度提高,划分)5/7(精度不变,不划分)

(4)因此按照预剪枝,最终形成的决策树如下图,其泛化性为71.4%。

由图可知,预剪枝使得很多分支没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间。但是,有些分支虽当前不能提升泛化性。甚至可能导致泛化性暂时降低,但在其基础上进行后续划分却有可能导致显著提高,因此预剪枝的这种贪心本质,给决策树带来了欠拟合的风险。

3、后剪枝

后剪枝表示先从训练集中生成一颗完整决策树。

(1)我在此生成的决策树上将测试集的数据在此树上进行了标记,如下图所示:

对比标记节点的划分类与各数据的真实分类,计算准确率,如下表所示:

编号好瓜(正确结果)按照整棵树进行划分
4
5
8
9
11
12
13
正确率 3/7

生成的决策树,在验证集上的准确度为3/7*100%=42.9%

(2)后剪枝将从决策树的底部往上进行剪枝,先看最底部的纹理,将其领衔的分支减掉,即将其换成叶子节点。由于在训练集上,替换后,包含的样本号为{7,15},好瓜坏瓜比例相等,因此选择好瓜进行标记,剪枝后的决策树为:

编号好瓜(正确结果)按照整棵树进行划分减掉底部纹理划分
4(其他不变,照写)
5
8(改变)
9
11
12
13
正确率 3/74/7(准确率提高)

当减掉底部纹理划分后,准确率提高,因此按照纹理划分需裁剪掉。

(3)接着往上裁剪,此时应该是色泽部分,由于在训练集上,替换后,包含的样本号为{6,7,15},好瓜(2个)多于坏瓜(1个),因此选择好瓜进行标记,剪枝后的决策树为:

编号好瓜(正确结果)按照整棵树进行划分减掉底部纹理划分减掉底部色泽划分
4(其他不变,照写)是(其他不变,照写)
5
8(改变)
9
11
12
13
正确率 3/74/7(准确率提高)4/7(准确率不变)

此时决策树验证集精度仍为57.1%,因此可不进行剪枝,即对于脐部稍凹,根蒂稍蜷部分,可保留按照色泽进一步划分。

(4)接下来,我们看脐部凹陷分支。由于在训练集上,将色泽替换为叶节点后,包含的样本号为{1,2,3,14},好瓜(3个)多于坏瓜(1个),因此选择好瓜进行标记,剪枝后的决策树为:

编号好瓜(正确结果)按照整棵树进行划分减掉底部纹理划分减掉底部色泽划分减调色泽划分(最左侧色泽)
4(其他不变,照写)(其他不变,照写)
5(新划分,发生改变)
8(改变)(其他不变,照写)
9
11
12
13
正确率 3/74/7(准确率提高)4/7(准确率不变)5/7(准确率提高)

当减掉最左侧色泽划分后,准确率提高,因此按照色泽划分需裁剪掉。

(5)整棵树遍历基本完成,因此该决策树最终后剪枝的结果如下图所示,其验证精度为71.4%。

4、总结

对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。


http://chatgpt.dhexx.cn/article/09ZE3Vae.shtml

相关文章

YOLOv5剪枝✂️ | 模型剪枝理论篇

文章目录 1. 前言2. 摘要精读3. 背景4. 本文提出的解决方式5. 通道层次稀疏性的优势6. 挑战7. 缩放因素和稀疏性惩罚8. 利用BN图层中的缩放因子9. 通道剪枝和微调10. 多通道方案11. 处理跨层连接和预激活结构12. 实验结果12.1 CIFAR-10数据集剪枝效果12.2 CIFAR-100数据集剪枝效…

决策树及决策树生成与剪枝

文章目录 1. 决策树学习2. 最优划分属性的选择2.1 信息增益 - ID32.1.1 什么是信息增益2.1.2 ID3 树中最优划分属性计算举例 2.2 信息增益率 - C4.52.3 基尼指数 - CART 3. 决策树剪枝3.1 决策树的损失函数3.2 如何进行决策树剪枝3.2.1 预剪枝3.2.2 后剪枝3.3.3 两种剪枝策略对…

剪枝

将复杂的决策树进行简化的过程称为剪枝,它的目的是去掉一些节点,包括叶节点和中间节点。 剪枝常用方法:预剪枝与后剪枝两种。 预剪枝:在构建决策树的过程中,提前终止决策树生长,从而避免过多的节点产生。该…

(剪枝)剪枝的理论

剪枝参考视频 本文将介绍深度学习模型压缩方法中的剪枝,内容从剪枝简介、剪枝步骤、结构化剪枝与非结构化剪枝、静态剪枝与动态剪枝、硬剪枝与软剪枝等五个部分展开。 剪枝简介 在介绍剪枝之前,首先来过参数化这个概念,过参数化主要是指在训…

剪枝总结

一、引子 剪枝,就是减小搜索树规模、尽早排除搜索树中不必要的分支的一种手段。 形象地看,就好像剪掉了搜索树的枝条,故被称为剪枝。 二、常见剪枝方法 1.优化搜索顺序 在一些问题中,搜索树的各个分支之间的顺序是不固定的 …

搜索剪枝

目录 什么是剪枝 几种常见的剪枝 1.可行性剪枝 2.排除等效冗余 3.最优性剪枝 4.顺序剪枝 5.记忆化 运用实例 1.选数 2.吃奶酪 3.小木棍 什么是剪枝 剪枝:通过某种判断,避免一些不必要的遍历过程。搜索的时间复杂度通常很大,通过剪…

【模型压缩】(二)—— 剪枝

一、概述 剪枝(Pruning)的一些概念: 当提及神经网络的"参数"时,大多数情况指的是网络的学习型参数,也就是权重矩阵weights和偏置bias;现代网络的参数量大概在百万至数十亿之间,因此…

环形队列的基本运算算法-数据结构教程

环形队列的基本概念 如图,其实它就是一个队列,就是有点难理解而已,它避免了普通队列的缺点,一样有队列头,队列尾,一样是先进先出的原则。我们采用顺时针的方式来对队列进行排序。 队列头(front) :允许进行删…

一道亚马逊算法面试题的情景分析

阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该题,复盘它的解题情景,我们可以初步体会到算法面试的应对步骤,并从中窥…

LeetCode刷题笔记 标准模板库巧解算法题 优先队列

优先队列简介 ​ 优先队列(priority queue)可以在 O(1) 时间内获得最大值,并且可以在 O(log n) 时间内取出最大值或插入任意值。 ​ 优先队列常常用堆(heap)来实现。堆是一个完全二叉树,其每个节点的值总…

Python数据结构与算法(3.4)——队列相关应用与习题

Python数据结构与算法(3.4)——队列相关应用与习题 0. 学习目标1. 使用两个栈实现一个队列2. 使用两个队列实现一个栈3. 栈中元素连续性判断4. 重新排列队列中元素顺序5. 反转队列中前 m 个元素的顺序相关链接0. 学习目标 我们已经学习了队列的相关概念以及其实现,同时也了…

第十七章 优先队列优化Dijkstra算法

第十七章 优先队列优化Dijkstra算法 一、普通dijkstra算法的缺陷1、选出最小距离的过程:2、松弛所有点的过程: 二、如何优化1、代码模板(1)问题:(2)模板: 2、详细解读 三、优化分析1…

【自顶向下模块化编程】C语言实现多级反馈队列调度算法

自顶向下-多级反馈队列 多级反馈队列算法算法原理算法描述题目摘要 自顶向下模块化设计整体框架具体实现GeneratorSchedulerExecutor 整体代码实现 总结及心得总结心得 多级反馈队列算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调…

[算法] 栈和队列

欢迎来到老胡的算法解题思路,本文章主要使用的语言为java,使用的题型为力扣算法题,基于这一篇文章,我将为你介绍栈和队列的基础知识和栈和队列的题型,喜欢的朋友可以关注一下,下次更新不迷路! 目…

十道经典面试算法真题详解

前言 分享一下 腾讯常考的十道算法题(真题)。在金三银四,希望对大家有帮助呀。 重排链表 最长递增子序列 环形链表 反转链表 最长回文子串 全排列 LRU 缓存 合并K个升序链表 无重复字符的最长子串 删除链表的倒数第 N 个结点 1. …

队列相关习题

1.已知循环队列存储在一维数组A0…n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是( )。 A.0,0 B. 0,n-1 C. n-…

java算法面试题_Java算法面试题汇总

原标题:Java算法面试题汇总 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。 toCharArray() // 获得字符串对应的char数组 Arrays.sort() // 数组排序 Arrays.toString(char[] a) // 数组转成字符串 charAt(int x) // 获得某个索…

详解单调队列算法

前言 嘿!彩蛋!感觉有帮助就三连呗! 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另…

栈和队列相关经典算法题总结(数据结构+C语言)

我们这里针对栈和队列的一些经典算法题做详细讲解: 1.括号匹配问题. 2.用队列实现栈. 3.用栈实现队列. 4.设计循环队列. 一.详细讲解如下: 1.括号匹配问题.(如下图) 给定一个只包括 (,),{,},[,] 的字符串 s &am…

qt使用消息队列服务器,qt代码实现消息队列通信

qt代码实现消息队列通信 内容精选 换一换 HBase 1.X版本在RPC流程中,多个数据通信线程会争抢同一个缓存Buffer队列,代码以lock重入锁实现线程安全,锁抢占严重,导致HBase不能充分发挥CPU多核的能力。HBase 1.X版本的RPC通信机制中B…