决策树——预剪枝和后剪枝

article/2025/9/15 13:23:56

目录

简析

为什么要剪枝?

剪枝的基本策略

预剪枝

后剪枝

剪枝的优缺点

预剪枝的优缺点

后剪枝的优缺点

实现

数据集

剪枝前

预剪枝

分析

代码


简析

为什么要剪枝?

“剪枝”是决策树学习算法对付 “过拟合” 的主要手段
可通过“剪枝”来一定程度避免因决策分支过多,以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合

剪枝的基本策略

预剪枝

通过提前停止树的构建而对树剪枝,主要方法有:
1.当决策树 达到预设的高度 时就停止决策树的生长
2.达到某个节点的实例 具有相同的特征向量 ,即使这些实例不属于同一类,也可以停止决策树的生长。
3.定义一个阈值,当达到某个节点的 实例个数小于阈值 时就可以停止决策树的生长。
4.通过 计算每次扩张对系统性能的增益 ,决定是否停止决策树的生长。

后剪枝

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

1.悲观剪枝(PEP)

2.最小误差剪枝(MEP)

3.错误率降低剪枝(REP)

4.代价复杂度剪枝(CCP)

5.OPP (Optimal Pruning)

6.CVP (Critical Value Pruning)

剪枝的优缺点

预剪枝的优缺点

•优点
降低过拟合风险
显著减少训练时间和测试时间开销。
•缺点
欠拟合风险 :有些分支的当前划分虽然不能提升泛化性能,但在其基础上进行的后续划分却有可能显著提高性能。预剪枝基于“ 贪心 ”本质禁止这些分支展开,带来了欠拟合风险。

后剪枝的优缺点

•优点
后剪枝比预剪枝保留了更多的分支, 欠拟合风险小 泛化性能往往优于预剪枝决策树
缺点
训练时间开销大 :后剪枝过程是在生成完全决策树之后进行的,需要自底向上对所有非叶结点逐一计算

实现

创建决策树部分在上篇博客中已经实现,这边不再复述。https://blog.csdn.net/qq_51994140/article/details/127850274?spm=1001.2014.3001.5501

数据集

根据学生获奖情况(0表示没有,1表示省级,2表示国家级),刷笔试题和面试题情况,和实习经历,来判断是否能找到工作(N表示不能,Y表示能)。

之前的数据集存在问题,已经修改,如下。

训练集

获奖情况刷题情况实习经历工作

2

11Y
210N
201Y
200N
11Y
110N
101Y
100N
011Y
010N
001N
000N

验证集

获奖情况刷题情况实习经历工作
211Y
210N
100N
000N

剪枝前

预剪枝

分析

基于信息增益原则,选取属性实习经历划分训练集,分别计算划分前和划分后的验证集精度,判断是否需要划分

1.结点1不划分,将其标记为叶结点,类别标记为N,验证集中仅有一条数据分类正确,验证集精度为(3/4)*100%=75%.

 结点1划分,则情况如下图

此时验证集中全部样例划分正确,验证集精度为100%,因此选择划分

2.结点2为叶子结点,禁止划分

3.结点3:选取‘获奖情况’进行划分,情况如下图:

测试集中仅有两条数据符号,验证集精度为(2/4)*100%=50%,精度没有提高,因此选择不继续划分。

4.结果:

  

代码

def createTreePrePruning(dataTrain, labelTrain, dataTest, labelTest, names, method='id3'):trainData = np.asarray(dataTrain)labelTrain = np.asarray(labelTrain)labelTest = np.asarray(labelTest)names = np.asarray(names)# 如果结果为单一结果if len(set(labelTrain)) == 1:return labelTrain[0]# 如果没有待分类特征elif trainData.size == 0:return voteLabel(labelTrain)# 其他情况则选取特征bestFeat, bestEnt = bestFeature(dataTrain, labelTrain, method=method)# 取特征名称bestFeatName = names[bestFeat]# 从特征名称列表删除已取得特征名称names = np.delete(names, [bestFeat])# 根据最优特征进行分割dataTrainSet, labelTrainSet = splitFeatureData(dataTrain, labelTrain, bestFeat)# 预剪枝评估# 划分前的分类标签labelTrainLabelPre = voteLabel(labelTrain)labelTrainRatioPre = equalNums(labelTrain, labelTrainLabelPre) / labelTrain.size# 划分后的精度计算if dataTest is not None:dataTestSet, labelTestSet = splitFeatureData(dataTest, labelTest, bestFeat)# 划分前的测试标签正确比例labelTestRatioPre = equalNums(labelTest, labelTrainLabelPre) / labelTest.size# 划分后 每个特征值的分类标签正确的数量labelTrainEqNumPost = 0for val in labelTrainSet.keys():labelTrainEqNumPost += equalNums(labelTestSet.get(val), voteLabel(labelTrainSet.get(val))) + 0.0# 划分后 正确的比例labelTestRatioPost = labelTrainEqNumPost / labelTest.size# 如果没有评估数据 但划分前的精度等于最小值0.5 则继续划分if dataTest is None and labelTrainRatioPre == 0.5:decisionTree = {bestFeatName: {}}for featValue in dataTrainSet.keys():decisionTree[bestFeatName][featValue] = createTreePrePruning(dataTrainSet.get(featValue),labelTrainSet.get(featValue), None, None, names, method)elif dataTest is None:return labelTrainLabelPre# 如果划分后的精度相比划分前的精度下降, 则直接作为叶子节点返回elif labelTestRatioPost < labelTestRatioPre:return labelTrainLabelPreelse:# 根据选取的特征名称创建树节点decisionTree = {bestFeatName: {}}# 对最优特征的每个特征值所分的数据子集进行计算for featValue in dataTrainSet.keys():decisionTree[bestFeatName][featValue] = createTreePrePruning(dataTrainSet.get(featValue),labelTrainSet.get(featValue),dataTestSet.get(featValue),labelTestSet.get(featValue),names,method)return decisionTree

http://chatgpt.dhexx.cn/article/KIYkEQ56.shtml

相关文章

网络剪枝通俗解释

论文链接&#xff1a;Learning Efficient Convolutional Networks through Network Slimming 视频链接&#xff1a;唐宇迪 基本思想 我们在模型生成通道数为[64,128,256,512]的特征图&#xff0c;但是这些特征图不一定都重要&#xff0c;我们希望能够体现特征图的主次之分&…

α、β剪枝法

在讲α、β剪枝法之前&#xff0c;我们先了解一下极大极小值算法&#xff1b;因为α、β剪枝法是为了简化极大极小值的计算而提出的。 极大极小值法 Minimax算法 又名极小化极大算法&#xff0c;是一种找出失败的最大可能性中的最小值的算法&#xff08;即最小化对手的最大得益…

决策树的剪枝

目录 一、为什么要剪枝 二、剪枝的策略 1、预剪枝&#xff08;pre-pruning&#xff09; 2、后剪枝&#xff08;post-pruning&#xff09; 三、代码实现 1、收集、准备数据&#xff1a; 2、分析数据&#xff1a; 3、预剪枝及测试&#xff1a; 4、后剪枝及测试&#xff1…

决策树算法和剪枝原理

决策树算法和剪枝原理 本节我们对决策算法原理做简单的解析&#xff0c;帮助您理清算法思路&#xff0c;温故而知新。 我们知道&#xff0c;决策树算法是一种树形分类结构&#xff0c;要通过这棵树实现样本分类&#xff0c;就要根据 if -else 原理设置判别条件。因此您可以这…

决策树(decision tree)(二)——剪枝

决策树&#xff08;decision tree&#xff09;(二)——剪枝 **注&#xff1a;本博客为周志华《机器学习》读书笔记&#xff0c;虽然有一些自己的理解&#xff0c;但是其中仍然有大量文字摘自周老师的《机器学习》书。 决策树系列博客&#xff1a; 决策树&#xff08;一&#x…

机器学习--决策树二(预剪枝和后剪枝)

一、什么是决策树的剪枝 对比日常生活中&#xff0c;环卫工人在大街上给生长茂密的树进行枝叶的修剪。在机器学习的决策树算法中&#xff0c;有对应的剪枝算法。将比较复杂的决策树&#xff0c;化简为较为简单的版本&#xff0c;并且不损失算法的性能。 二、为什么要剪枝 剪枝…

关于剪枝对象的分类(weights剪枝、神经元剪枝、filters剪枝、layers剪枝、channel剪枝、对channel分组剪枝、Stripe剪枝)

文章目录 剪枝对象分析&#xff1a;1.weights剪枝&#xff1a;2.神经元剪枝&#xff1a;3.Filters剪枝&#xff1a;4.通道剪枝5.Group-wise剪枝6.Stripe剪枝 剪枝对象分析&#xff1a; 剪枝分为结构化剪枝和非结构化剪枝&#xff0c;细化可分为weights剪枝、神经元剪枝、filte…

决策树——剪枝处理

剪枝处理 1&#xff1a;剪枝处理的原因 “剪枝”是决策树学习算法对付“过拟合”的主要手段&#xff0c;因此&#xff0c;可通过“剪枝”来一定程度避免因决策分支过多&#xff0c;以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合 2&#xff1a;剪…

【ML】决策树--剪枝处理(预剪枝、后剪枝)

1. 剪枝&#xff08;pruning&#xff09;处理 首先&#xff0c;我们先说一下剪枝的目的——防止“过拟合”。 在决策树的学习过程中&#xff0c;为了保证正确性&#xff0c;会不断的进行划分&#xff0c;这样可能会导致对于训练样本能够达到一个很好的准确性&#xff0c;但是…

深度学习剪枝

一般来说&#xff0c;神经网络层数越深、参数越多&#xff0c;所得出的结果就越精细。但与此同时&#xff0c;问题也来了&#xff1a;越精细&#xff0c;意味着所消耗的计算资源也就越多。这个问题怎么破&#xff1f;这就要靠剪枝技术了。言下之意&#xff0c;把那些对输出结果…

决策树后剪枝算法(一)代价复杂度剪枝CPP

​  ​​ ​决策树后剪枝算法&#xff08;一&#xff09;代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法&#xff08;二&#xff09;错误率降低剪枝REP  ​​ ​决策树后剪枝算法&#xff08;三&#xff09;悲观错误剪枝PEP  ​​ ​决策树后剪枝算法&#xff08;四&…

机器学习-预剪枝和后剪枝

一棵完全生长的决策树会面临一个很严重的问题&#xff0c;即过拟合。当模型过拟合进行预测时&#xff0c;在测试集上的效果将会很差。因此我们需要对决策树进行剪枝&#xff0c; 剪掉一些枝叶&#xff0c;提升模型的泛化能力。 决策树的剪枝通常有两种方法&#xff0c;预剪枝&a…

【机器学习】Python实现决策树的预剪枝与后剪枝

决策树是一种用于分类和回归任务的非参数监督学习算法。它是一种分层树形结构&#xff0c;由根节点、分支、内部节点和叶节点组成。 从上图中可以看出&#xff0c;决策树从根节点开始&#xff0c;根节点没有任何传入分支。然后&#xff0c;根节点的传出分支为内部节点&#xff…

决策树的预剪枝与后剪枝

前言&#xff1a; 本次讲解参考的仍是周志华的《机器学习》&#xff0c;采用的是书中的样例&#xff0c;按照我个人的理解对其进行了详细解释&#xff0c;希望大家能看得懂。 1、数据集 其中{1,2,3,6,7,10,14,15,16,17}为测试集&#xff0c;{4,5,8,9,11,12,13}为训练集。 2、…

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 两种剪枝策略对…

剪枝

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

(剪枝)剪枝的理论

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

剪枝总结

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

搜索剪枝

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