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

article/2025/9/16 0:59:13


 ​​ ​决策树后剪枝算法(一)代价复杂度剪枝CPP
 ​​ ​决策树后剪枝算法(二)错误率降低剪枝REP
 ​​ ​决策树后剪枝算法(三)悲观错误剪枝PEP
 ​​ ​决策树后剪枝算法(四)最小错误剪枝MEP

  剪枝,是一个“用准确性换取简单性”的思想。它允许决策树对训练集过拟合,再通过删除对泛化精度无贡献的子分支,从而修剪出一颗较小的树。以下列出几种较常见的后剪枝算法,及其机制对比:

CCPREPPEPMEP
剪枝方式自底向上自底向上自顶向下自底向上
计算复杂度 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n ) O(n) O(n) O ( n ) O(n) O(n)
误差估计标准误差剪枝集上误差连续性矫正概率估计
是否需要额外剪枝集

(1)代价复杂度剪枝(CCP)

  CCP算法为子树 T t T_t Tt定义了代价和复杂度,以及一个衡量代价与复杂度之间关系的参数 α \alpha α。大致流程为,从决策树 T 0 T_0 T0开始不断剪枝直到 T 0 T_0 T0的根节点,形成一个子树序列{ T 0 , T 1 , . . . , T n T_0, T_1,...,T_n T0,T1,...,Tn}; 然后经过交叉验证法在独立验证集上逐个测试评估, 从而选出最优子树。

(1.1)数学推导

评价标准:
R α ( T ) = R ( T ) + α ∣ f ( T ) ∣ R ( T ) = ∑ t ∈ f ( T ) r ( t ) . p ( t ) = ∑ t ∈ f ( T ) R ( t ) R_\alpha(T) = R(T) + \alpha|f(T)|\\ R(T)=\sum_{t\in f(T)}r(t).p(t)=\sum_{t\in f(T)}R(t) Rα(T)=R(T)+αf(T)R(T)=tf(T)r(t).p(t)=tf(T)R(t)
解读:

  • R α ( T ) R_{\alpha}(T) Rα(T)即为一棵树好坏的评价标准。
  • R ( T ) R(T) R(T)是决策树训练集误差(代价), ∣ f ( T ) ∣ |f(T)| f(T)表示决策树的叶子节点数量(复杂度)。
  • α \alpha α是正则化参数,用以权衡训练数据的拟合程度与模型复杂度。
  • ∑ t ∈ f ( T ) R ( t ) \sum_{t\in f(T)}R(t) tf(T)R(t)表示每个叶子节点所产生的错误分类的误差和。
  • p ( t ) p(t) p(t)为叶子节点权重( = n ( t ) n =\frac{n(t)}{n} =nn(t)), r ( t ) r(t) r(t)为叶子结点误分类率( = e r r o r ( t ) n ( t ) =\frac{error(t)}{n(t)} =n(t)error(t))。
img

  进一步推导,对于一个固定的 α \alpha α值, 一定存在一颗使得 C α ( T ) C_{\alpha}(T) Cα(T)最小的子树 T α T_{\alpha} Tα, 即在固定 α \alpha α下的最优剪枝策略。现在考虑 α \alpha α变化,考虑极端情况: 当 α = 0 \alpha=0 α=0时, 有 R α ( T ) = R ( T ) R_\alpha(T) = R(T) Rα(T)=R(T), 即不考虑复杂度, 易知完整树即为最优;当 α → ∞ \alpha\rightarrow\infty α,复杂度权重无穷大,易知单节点树为最优。及 α \alpha α 0 → ∞ 0\rightarrow\infty 0 α \alpha α对应的最优树 T α T_{\alpha} Tα从繁变简。

  再结合 B r e i m a n Breiman Breiman等人的证明: 将 α \alpha α从小增大, 0 = α 0 < α 1 < . . . < α n < ∞ 0=\alpha_0<\alpha_1<...<\alpha_n<\infty 0=α0<α1<...<αn<, 产生一系列的区间 [ a i , a i + 1 ) [a_i, a_{i+1}) [ai,ai+1) i = 0 , 1 , 2 , . . . , n i=0,1,2,...,n i=0,1,2,...,n; 剪枝得到的子树序列对应着区间 α ∈ [ a i , a i + 1 ) , i = 0 , 1 , 2... n \alpha\in{[a_i, a_{i+1})},~i=0,1,2...n α[ai,ai+1), i=0,1,2...n的最优子树序列{ T 0 , T 1 , . . . , T n T_0, T_1, ...,T_n T0,T1,...,Tn},序列中的子树是嵌套的, 即 T 0 T_0 T0爷爷/ T 1 T_1 T1父亲/ T 2 T_2 T2儿子/ T 3 T_3 T3孙子…以此类推。

  那么如何选取每一阶段的 α \alpha α, 这里引入剪枝整体损失函数减少程度指标 g ( t ) = R ( t ) − R ( T t ) ∣ T t ∣ − 1 g(t)=\frac{R(t)-R(T_t)}{|T_t|-1} g(t)=Tt1R(t)R(Tt),其具体含义如下:
当 R α ( T t ) = R α ( t ) 时 , 即剪枝后误差增长率为 0 R α ( T t ) = R α ( T t ) + ∣ f ( T t ) ∣ R α ( t ) = R α ( t ) + 1 解得 α ’ = R ( t ) − R ( T t ) ∣ T t ∣ − 1 , 即剪枝临界点 ( 必定剪枝 ) 当R_\alpha(T_t)=R_\alpha(t)时,即剪枝后误差增长率为0\\ R_\alpha(T_t)=R_\alpha(T_t)+|f(T_t)|\\ R_\alpha(t)=R_\alpha(t)+1\\ 解得\alpha’=\frac{R(t)-R(T_t)}{|T_t|-1},即剪枝临界点(必定剪枝) Rα(Tt)=Rα(t),即剪枝后误差增长率为0Rα(Tt)=Rα(Tt)+f(Tt)Rα(t)=Rα(t)+1解得α=Tt1R(t)R(Tt),即剪枝临界点(必定剪枝)
  且可证得 g ( t ) g(t) g(t)与误差增长率成正比:
KaTeX parse error: Expected 'EOF', got '&' at position 75: …T-T_t)|-|f(T)|)&̲\\ =[R(else)+R(…
  根据以上推导结论, 对于特定 α \alpha α区间,要求最优 T α T_\alpha Tα需寻求误差增长率最小, 即 g ( t ) g(t) g(t)最小。故我们所需要做的, 就是每轮迭代中遍历所有非叶子节点, T i − 1 T_{i-1} Ti1剪枝 g ( t ) g(t) g(t)最小的节点生成下一颗最优子树 T i T_i Ti,从而生成子树序列。

  最后基于独立验证集, 对子树序列 T 0 , T 1 , . . . , T n T_0, T_1, ...,T_n T0,T1,...,Tn中的平方误差或基尼系数逐个计算, 再作评估选择即可。

(1.2)算法流程

  • 输入:CART算法生成的决策树 T 0 T_0 T0
  • 输出:最优决策树 T α T_\alpha Tα
  • (1)设 k = 0 , T = T 0 k=0, T=T_0 k=0,T=T0
  • (2)设 α = + ∞ \alpha=+\infin α=+
  • (3)自下而上地对各内部结点 t t t计算 R ( T t ) R(T_t) R(Tt) ∣ f ( T t ) ∣ |f(T_t)| f(Tt)以及:

g ( t ) = R ( t ) − R ( T t ) ∣ T t ∣ − 1 α = m i n ( α , g ( t ) ) g(t)=\frac{R(t)-R(T_t)}{|T_t|-1}\\ \alpha=min(\alpha, g(t)) g(t)=Tt1R(t)R(Tt)α=min(α,g(t))

  • (4)对 g ( t ) = α g(t)=\alpha g(t)=α的内部结点 t t t进行剪枝, 并对叶结点构成的树,回到步骤(2);否则令 T k = T n T_k=T_n Tk=Tn
  • (7)采用交叉验证法在子树序列 T 0 , T 1 , . . . , T n T_0, T_1, ...,T_n T0,T1,...,Tn中选取最优子树 T α T_\alpha Tα(分类:基尼系数 \ 回归:平均误差)。

(1.3)例题计算

 #### (一)原始决策树

img

 #### (二)第一次迭代

INPUT: α = 0 , T 1 = t 1 , t 2 , t 3 \alpha=0,~ T^1={t_1,t_2,t_3} α=0, T1=t1,t2,t3

在这里插入图片描述

OUTPUT: α 2 = min ⁡ g 1 ( t ) = 1 8 , t = t 2 或 t 3 \alpha^2=\min{g_1(t)}=\frac{1}{8},~t=t_2或t_3 α2=ming1(t)=81, t=t2t3

在这里插入图片描述

 #### (三)第二次迭代

INPUT: a l p h a 2 = 1 8 , T 2 = t 1 , t 2 alpha^2=\frac{1}{8},T^2={t_1, t_2} alpha2=81,T2=t1,t2

在这里插入图片描述

OUTPUT: α 3 = min ⁡ g 2 ( t ) = 1 8 , t = t 2 \alpha^3=\min{g_2(t)=\frac{1}{8}}, t=t_2 α3=ming2(t)=81,t=t2

在这里插入图片描述

 #### (四)第三次迭代
INPUT: T 3 = t 1 T^3={t1} T3=t1

OUTPUT: α 4 = g 3 ( t 1 ) = 8 16 − 4 16 2 − 1 = 1 4 \alpha^4=g_3(t_1)=\frac{\frac{8}{16}-\frac{4}{16}}{2-1}=\frac{1}{4} α4=g3(t1)=21168164=41

 即子树序列 T 0 , T 1 , . . . , T n T_0, T_1, ...,T_n T0,T1,...,Tn及其参数 α \alpha α的计算, 接下来进行交叉验证即可选择最优子树即可。

(1.4)代码实现

 手写实现 + sklearn实现

链接:https://pan.baidu.com/s/1gskUIAHfv9lZ6Mtq7r7I1Q 
提取码:wo7m

 代码参考:http://www.hzcourse.com/web/refbook/detail/9970/226

——————————————————————————————————————————-—————————————————

参考资料:

[1] 现代决策树模型及其编程实践 黄智濒 编著

[2] 统计学习方法(第二版) 李航 著

[3] https://blog.csdn.net/WANGWUSHAN/article/details/108556371


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

相关文章

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

一棵完全生长的决策树会面临一个很严重的问题&#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;通过剪…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[算法] 栈和队列

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

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

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

队列相关习题

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

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

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