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

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

CCP REP PEP MEP
剪枝方式 自底向上 自底向上 自顶向下 自底向上
计算复杂度 O(n2)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算法为子树TtT_tTt​定义了代价和复杂度,以及一个衡量代价与复杂度之间关系的参数α\alphaα。大致流程为,从决策树T0T_0T0​开始不断剪枝直到T0T_0T0​的根节点,形成一个子树序列{T0,T1,...,TnT_0, T_1,...,T_nT0​,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)=t∈f(T)∑​r(t).p(t)=t∈f(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)∑t∈f(T)​R(t)表示每个叶子节点所产生的错误分类的误差和。
  • p(t)p(t)p(t)为叶子节点权重(=n(t)n=\frac{n(t)}{n}=nn(t)​),r(t)r(t)r(t)为叶子结点误分类率(=error(t)n(t)=\frac{error(t)}{n(t)}=n(t)error(t)​)。

  进一步推导,对于一个固定的α\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\infty0→∞,α\alphaα对应的最优树TαT_{\alpha}Tα​从繁变简。

  再结合BreimanBreimanBreiman等人的证明: 将α\alphaα从小增大, 0=α0<α1<...<αn<∞0=\alpha_0<\alpha_1<...<\alpha_n<\infty0=α0​<α1​<...<αn​<∞, 产生一系列的区间[ai,ai+1)[a_i, a_{i+1})[ai​,ai+1​),i=0,1,2,...,ni=0,1,2,...,ni=0,1,2,...,n; 剪枝得到的子树序列对应着区间α∈[ai,ai+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的最优子树序列{T0,T1,...,TnT_0, T_1, ...,T_nT0​,T1​,...,Tn​},序列中的子树是嵌套的, 即T0T_0T0​爷爷/T1T_1T1​父亲/T2T_2T2​儿子/T3T_3T3​孙子…以此类推。

  那么如何选取每一阶段的α\alphaα, 这里引入剪枝整体损失函数减少程度指标 g(t)=R(t)−R(Tt)∣Tt∣−1g(t)=\frac{R(t)-R(T_t)}{|T_t|-1}g(t)=∣Tt​∣−1R(t)−R(Tt​)​,其具体含义如下:
当Rα(Tt)=Rα(t)时,即剪枝后误差增长率为0Rα(Tt)=Rα(Tt)+∣f(Tt)∣Rα(t)=Rα(t)+1解得α’=R(t)−R(Tt)∣Tt∣−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解得α’=∣Tt​∣−1R(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_\alphaTα​需寻求误差增长率最小, 即g(t)g(t)g(t)最小。故我们所需要做的, 就是每轮迭代中遍历所有非叶子节点,Ti−1T_{i-1}Ti−1​剪枝g(t)g(t)g(t)最小的节点生成下一颗最优子树TiT_iTi​,从而生成子树序列。

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

(1.2)算法流程

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

g(t)=R(t)−R(Tt)∣Tt∣−1α=min(α,g(t))g(t)=\frac{R(t)-R(T_t)}{|T_t|-1}\\ \alpha=min(\alpha, g(t)) g(t)=∣Tt​∣−1R(t)−R(Tt​)​α=min(α,g(t))

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

(1.3)例题计算

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

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

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

OUTPUT: α2=min⁡g1(t)=18,t=t2或t3\alpha^2=\min{g_1(t)}=\frac{1}{8},~t=t_2或t_3α2=ming1​(t)=81​, t=t2​或t3​

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

INPUT:alpha2=18,T2=t1,t2alpha^2=\frac{1}{8},T^2={t_1, t_2}alpha2=81​,T2=t1​,t2​

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

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

OUTPUT: α4=g3(t1)=816−4162−1=14\alpha^4=g_3(t_1)=\frac{\frac{8}{16}-\frac{4}{16}}{2-1}=\frac{1}{4}α4=g3​(t1​)=2−1168​−164​​=41​

 即子树序列T0,T1,...,TnT_0, T_1, ...,T_nT0​,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

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

  1. 基于阿尔法贝塔剪枝算法的五子棋_C4.5算法剪枝2

    作者:柏安之    封面:自己想吧 1 悲观错误剪枝 在讲解悲观剪枝思路的时候,将会运用统计学的相关知识,所以我们将对这部分知识进行粗略的复习,再进行悲观错误剪枝的学习. 首先,我们认为决策树构建期间 ...

  2. 决策树后剪枝算法(四)最小错误剪枝MEP

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

  3. 决策树剪枝算法(二)

    转自:http://www.cnblogs.com/starfire86/p/5749334.html 上一章主要描述了ID3算法的的原理,它是以信息熵为度量,用于决策树节点的属性选择,每次优选信息量 ...

  4. 决策树-剪枝算法(二)

    上一章主要描述了ID3算法的的原理,它是以信息熵为度量,用于决策树节点的属性选择,每次优选信息量最多 的属性,以构造一颗熵值下降最快的决策树,到叶子节点处的熵值为0,此时每个叶子节点对应的实例集中的实 ...

  5. 决策树剪枝算法:REP/PEP/CCP算法

    一颗完全生长的决策树会面临一个严重的问题--过拟合,因此我们需要剪掉一些枝叶来提高决策树的泛化能力.即使不存在过拟合,如果样本数量和分类数量是一个海量的级别,也需要预剪枝,因为计算资源不足以支撑生成完 ...

  6. 细讲sklearn决策树后剪枝(带例子)

    <老饼讲解机器学习>http://ml.bbbdata.com/teach#103 目录 一.CCP后剪枝简介 二.剪枝操作过程 (1) 查看CCP路径 (2)根据CCP路径剪树 为预防模 ...

  7. 决策树(1)——ID3算法与C4.5算法的理论基础与python实现

    1.前言   决策树是一种常用的机器学习算法,既可以做分类任务也可以做回归任务,本文主要讨论用于分类任务的决策树.决策树与数据结构中的树相同,也是由一个根结点.若干个内部结点和若干个叶结点构成.这里我 ...

  8. 极大极小算法和AlphaBeta剪枝算法

    作为菜鸟,先贴上参考博文: 1.极小极大算法 2.<<CS 161 Recitation Notes - The Minimax Algorithm>> 3.<PC游戏编 ...

  9. Alpha-Beta剪枝算法在直棋中的运用

    游戏说明 详见本人的项目描述页面:https://gitee.com/liuweilhy/NineChess/blob/master/Readme.md 我做了个简单的GUI如下图. 点击这里可以下载 ...

最新文章

  1. vue中key的作用
  2. webpack 中的加载器简介||webpack 中加载器的基本使用——1. 打包处理 css 文件 2. 打包处理 less 文件 3.打包处理 scss 文件
  3. 手机怎么解决同ip多账号_抖音被限流,作品被判搬运,账号被判搬运限流,Dou?被封怎么办?...
  4. Cisco 3750文件系统学习总结
  5. 使用vue-cli + webpack搭建vue项目环境
  6. golang time包梳理
  7. java ssh pdf_JavaSSH框架技术规范.pdf
  8. JVM核心——JVM运行和类加载全过程
  9. android 点击空白退出,Android 点击空白处隐藏键盘
  10. linux ifconfig
  11. 纸上谈兵: 队列 (queue)
  12. 【免费毕设】PHP校园二手信息网站的设计与开发(源代码+论文)
  13. 一位寒门博士的致谢,女友回复...
  14. Kinect + OpenNI + OpenCV + OpenGL 三维重建
  15. js基础-21-事件委托
  16. ubuntu 下安装ibus 中文输入法
  17. 求2n个数中最大值和最小值的最少比较次数
  18. Redis 使用 scan 命令代替 keys
  19. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码
  20. ArrayList集合类实现的RandomAccess空接口有何用?

热门文章

  1. 艺术与审美见面课测验答案
  2. 数字图像处理三 | 二值形态学操作(Distance Transform, 骨架提取,Conditional Dilation)的原理及Python实现
  3. 设计和生产3D打印的定制乳房假体
  4. 通过syslog协议发送日志信息到日志审计系统(配置logback-spring.xml方式)
  5. mysql 中文全文搜索总结
  6. ccf认证历年真题java_CCF-CSP认证历年真题
  7. java 文字转换成语音 代码_【Java】将文本转化成语音
  8. MFC和GDI+制作雪花飞舞小程序
  9. 成为Java技术专家需要掌握的知识点
  10. pure-ftpd mysql_Pureftpd高级应用:用MySQL管理PureFTPd用户