机器学习—决策树—决策树的剪枝

news/2024/4/25 21:19:54/文章来源:https://www.cnblogs.com/opencv2015/p/16812753.html

1 决策树的剪枝

当输入的原始数据有较多的变量时,通过决策树算法生成的决策树可能会非常的庞大。这样的一颗决策树在训练集上有很好的表现,但是在测试集上的表现往往不甚理想,这样的问题也被叫做过拟合问题。面对这样的问题,一般所采用的处理方法是对决策树进行剪枝,常用的剪枝算法有REP、PEP、CCP等。本文详细介绍了三种剪枝算法,并配以计算实例。

1.1 剪枝的有关概念

1.1.1 决策树的过拟合问题

决策树算法生成的决策树非常庞大,每个变量都被详细地考虑过。在每一个叶节点上,只要继续分支会有信息增益的情况,不管信息增益有多大,都会进行分支操作。最终所达到的目的是决策树的叶节点所覆盖的训练样本都属于同一类。

如果我们用这个决策树来对训练集进行分类的话,那么这颗树的表现非常好。但是在测试集上的表现就远没有在训练集上的表现好,这就是过拟合问题。

1.1.2 决策树的剪枝

顾名思义,树的剪枝就是剪掉树的一些枝叶,考虑大决策树的枝代表着逻辑判断,也代表着分类后的子集。决策树的剪枝就是删掉一些不必要的逻辑判断,并且将子集合并。这样确实会造成在训练集上子集不纯的现象,但是因为我们最终目标是模型在测试集上的效果,所以牺牲在训练集上的效果换取解决测试集的过拟合问题这样的做法也是值得的。决策树剪枝可以分为两类,一类是预剪枝,一类是后剪枝。

1.1.3 预剪枝

预剪枝就是在生成决策树的同时进行剪枝。正常决策树的生成是只要有信息增益就要进行分支。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。预剪枝的思想比较简单,但在实际应用中,预剪枝的表现并不是很好。所以,目前我们基本都是使用后剪枝方法。

1.1.4 后剪枝

后剪枝就是在决策树构造完成后进行剪枝。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。后剪枝就是删除一些子树,然后用其叶节点代替。这个叶节点代表的子集不一定都是“纯”的。那么,这个叶子节点所标识的类别通过大多数原则确定。大多数原则就是指这个叶节点所代表的子集中大多数的类别来表示这个叶节点。

1.2 常见的后剪枝算法

1.2.1 错误率降低剪枝法

错误率降低剪枝法(Reduced-Error Pruning)简称REP方法。

REP方法是通过一个新的验证集来纠正树的过拟合问题。对于决策树中的每一个非叶子节点的子树,我们将它替换成一个叶子节点,该叶子节点的类别用大多数原则来确定,这样就产生了一个新的相对简化决策树,然后比较这两个决策树在验证集中的表现。

如果新的决策树在验证集中的正确率较高,那么该子树就可以替换成叶子节点,从而达到决策树剪枝的目的。

该算法是从下往上依次遍历所有的子树,直至没有任何子树可以替换使得在验证集上的表现得以改进时,算法就可以终止。

实例:

生成的决策树,我们要对其进行剪枝,使用REP算法。

Step 1: 将节点4删掉替换成8和9,测试在验证集上的表现,若表现更好,则将节点4删掉并替换成8和9的并集,若表现不好则保留原树的形状。
Step 2: 将节点2删掉替换成8、9和5,测试在验证集上的表现。
Step 3: 将节点3删掉替换成6和7,测试在验证集上的表现。

1.2.2 悲观剪枝法

悲观剪枝法(Pessimistic Error Pruning)简称PEP方法。

REP方法思想简单且易于使用,不过最大的问题在于它需要一个新的验证集来修正我们的决策树。在PEP方法中,我们不需要新的验证集。

PEP方法也是根据剪枝前后的错误率来决定是否剪枝。和REP不同之处在于:PEP不需要新的验证集,并且PEP是自上而下剪枝的。由于我们还是用生成决策树时相同的训练样本,那么对于每个节点剪枝后的错分率一定是会上升的,因此在计算错分率时需要加一个惩罚因子0.5。

对于一叶节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为:

$p=\frac{\sum_{=1}^{L}E_{i}+0.5L}{\sum_{i=1}^{L}Ni}$

我们假设在子树中每一个样本的误判服从一个二项分布B(N,p),其中N表示子树所包含的所有样本个数。

所以,在剪枝前,其期望的误判数为:

$E(剪枝前误判数)=N*p$

其误判的标准差为:

$std(剪枝前误判数)=\sqrt{N*p*(1-p)}$

在剪枝之后,把子树替换成叶节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶节点的误判次数均值为:

$E(剪枝后误判数)=N*e$

当子树的误判个数大于对应叶节点的误判个数一个标准差之后,就决定剪枝。剪枝条件为:

$E(剪枝后误判数)-std(剪枝前误判数)<E(剪枝前误判数)$

实例:

 

对于节点T4而言,剪枝前后的计算过程如下:
E(T7)=0 ;E(T8)=2;E(T9)=1;E(T10)=1;E(T4)=7;所以,剪枝前的误判概率为:

$p=\frac{(0+2+1+1)+4*0.5}{20}=0.3$

所以:

$E(剪枝前误判数)=20+0.3=6$
$std(剪枝前误判数)=\sqrt{20*0.3*0.7}=2.05$

在我们对T4进行剪枝后,即将T4直接作为叶节点,剪枝后的误判概率

$e=\frac{7+0.5}{20} =0.375$

剪枝后的误判期望数为:

$E(1)=20*0.375=7.5$

剪枝条件为:

$7.-2.05<6$

因此满足条件,所以我们将把T4节点剪枝。

1.2.3 代价复杂度剪枝法

代价复杂度算法(Cost-Complexity Pruning)简称为CCP算法。

CCP算法为子树Tt定义了代价和复杂度,以及一个衡量代价与复杂度之间关系的参数α。

代价指的是在剪枝过程中因子树Tt被叶节点替代而增加的错分样本;
复杂度表示剪枝后子树Tt减少的叶结点数;
α则表示剪枝后树的复杂度降低程度与代价间的关系,定义为:

$\alpha =\frac{R(t)-R(T_{t})}{|N|-1}$

其中,R(t)表示节点t的错误代价,R(t)=r(t)∗p(t)
r(t)表示节点t的错分样本率;
p(t)表示节点t中样本占全部样本的比例
∣N∣表示子树Tt中的叶节点数 

CCP算法可以分为两个步骤,
Step 1: 按照上述公式从下到上计算每一个非叶节点的$\alpha$值,然后每一次都剪掉具有最小$\alpha$值的子树。从而得到一个集合 $\left\{T_0,T_1,T_2,...,T_M \right\}$,其中$\left\{T_0 \right\}$表示完整的决策树,$\left\{T_M \right\}$表示根节点。

Step 2: 根据真实的错误率在集合 $\left\{T_0,T_1,T_2,...,T_M \right\}$选出一个最好的决策树

实例:

假设数据有100条,从下往上,首先计算$T_{5}$的$\alpha$值。

$R(T_5)= \frac{2}{12}*\frac{12}{100}=0.02$

$R(T_{5}t)=\sum_{i}^{} (R_{i})=\frac{0}{6}*\frac{6}{100}+\frac{2}{6}*\frac{6}{100}=0.02$

$\alpha = \frac{0.02-0.02}{2-1}=0 $

 同理,$T_{6}$的$\alpha$为0.03,由于0<0.03,此时,我们将$T_{5}$剪掉而得到一棵新树。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_404216.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【k8s】(三) kubernetes 集群 YAML 文件详解

目录 一、YAML 文件概述 二、YAML 文件书写格式 2.1 YAML 介绍 2.2 YAML 基本语法 2.3 YAML 支持的数据结构 三、资源清单描述方法 3.1 资源清单描述方法 3.2 常用字段 四、如何快速编写一个yml文件 4.1 使用kubectl create命令 4.2 使用kubectl get 命令 一、YAML 文件…

【STM32】硬件资源及芯片介绍

以精英板STM32F103为例。STM32是Cortex M3架构&#xff0c;拥有更强劲的性能、更高的代码密度、位带操作、可嵌套中断、低成 本、低功耗等众多优势。 了解架构方面的知识可以查看以下文档&#xff1a; 《STM32 参考手册》中文版 V10.0《Cortex-M3 权威指南》中文版&#xff0…

【http代理】ProxyPool代码样例

1.此样例是私密代理简单IP池管理的实现2.requests不是python原生库,需要安装才能使用: pip install requests 3.支持Python2.7和Python3 #!/usr/bin/env python# -*- encoding: utf-8 -*-import timeimport randomimport threadingimport requestsclass ProxyPool():def __ini…

中国办公桌行业发展趋势及投资风险研究报告

智研瞻产业研究院专注于中国产业经济情报及研究&#xff0c;目前主要提供的产品和服务包括传统及新兴行业研究、商业计划书、可行性研究、市场调研、专题报告、定制报告等。涵盖文化体育、物流旅游、健康养老、生物医药、能源化工、装备制造、汽车电子、农林牧渔等领域&#xf…

docker本地私有库和harbor仓库

目录 docker仓库 一、docker私有仓库 Ⅰ、安装运行 Ⅱ、上传镜像 Ⅲ、拉取私有库镜像 二、harbor仓库 Ⅰ、前提需要 Ⅱ、创建证书文件 Ⅲ、下载安装harbor Ⅳ、harbor的管理 Ⅴ、浏览器访问管理 ①登录 报错 ②上传镜像 ③拉取镜像 docker仓库 仓库&#xff08;…

Vue3 + ElementPlus 前端实现分片上传

目录 1. 什么是分片上传 2. 上传组件模板 3. 上传组件逻辑 3.1 基本思路 3.2 选择上传文件 3.3 校验文件是否合法 3.4 文件加密 3.5 合并文件 3.6 文件切片上传 4. 参考文章 4.1 文章链接 4.2 参考文章提到的注意事项 4.2.1 nginx 上传大小限制 4.2.2 大文件下载…

Excel中的HLOOKUP、VLOOKUP、XLOOKUP函数

昨天使用INDEX和MATCH两个EXCEL函数完成了表中数据的快速查找&#xff0c;想一想&#xff0c;EXCEL中还有另外的查找函数&#xff0c;比如HLOOKUP、VLOOKUP、LOOKUP、XLOOKUP函数&#xff0c;那使用它们能不能完成同样的操作呢&#xff1f;   可以的。   仍然是昨天的问题&…

window下,cuda版本和NVIDIA驱动版本关系,cuda版本 和 TensorFlow-GPU版本关系,TensorFlow-GPU安装

一、cuda安装&#xff0c;cuda 和 TensorFlow 版本对应&#xff0c;链接https://www.tensorflow.org/install/source#tested_source_configurations 1.查看自己安装的驱动版本, nvidia-smi 2.安装所需要的cuda&#xff0c;下载链接CUDA Toolkit Archive | NVIDIA Developer 找…

微信小程序云开发入门-数据库插入数据(包含批量)

一、前言 文章将介绍如何在微信小程序云开发中向云开发数据库插入数据&#xff08;单条或批量&#xff09;。 写法有好几种&#xff0c;文章将会一一进行对比&#xff0c;看看每种写法之间有何优缺点&#xff0c;如何让代码看起来更优雅。 为了更加贴合实际的开发逻辑&#xf…

Unity重启 --- 工具介绍部分 (面板与工具条)

第一部分 --- Project项目资源面板 1.两类常用文件 --- PNG图像文件和FBX文件&#xff08;游戏模型文件&#xff09; 2.每一个项目文件夹中都会自动创建一个资源Assets文件夹&#xff0c;我们各类美术资源&#xff0c;游戏脚本都是放在这个文件夹中的 3.在Unity中资源文件夹会…

操作系统实验三:死锁避免程序设计

银行家算法&#xff1a;Python模拟与实现一、实验目的二、实验内容三、实验要求四、实验代码结果展示全部代码一、实验目的 1、 理解死锁产生的基本原理&#xff0c;以及死锁的必要条件&#xff1b; 2、 掌握死锁避免的基本原理与思路。 二、实验内容 试利用银行家算法对死锁…

人工神经网络概念及组成,人工神经网络基本结构

1、简述人工神经网络的结构形式 神经网络有多种分类方式&#xff0c;例如&#xff0c;按网络性能可分为连续型与离散型网络&#xff0c;确定型与随机型网络:按网络拓扑结构可分为前向神经网络与反馈神经网络。本章土要简介前向神经网络、反馈神经网络和自组织特征映射神经网络…

postman使用excel参数批量执行

postman使用excel参数批量执行第一步,写好连接,报错。参数使用{{name}},这样的划分。保存接口第二步,找到runner。选择接口所在的文件夹,点击runner 第三步,选择接口和文件 点击run,运行,等待接口执行完成

百多安医疗冲刺科创板:半年营收1亿 为张海军与郭海宏夫妻店

雷递网 雷建平 10月20日山东百多安医疗器械股份有限公司&#xff08;简称&#xff1a;“百多安医疗”&#xff09;日前递交招股书&#xff0c;准备在科创板上市。百多安医疗计划募资7.6亿元&#xff0c;其中&#xff0c;2.64亿元用于医用导管产业化升级项目&#xff0c;2.48亿元…

《软件测试》实验2:嵌入式软件测试实验报告

文章目录实验目的温度控制器需求文档及测试要求环境搭建实验内容温度采集处理功能测试加热棒输出电压测试散热风扇温度传感器输入接口&#xff08;Senser_JK&#xff09;控制加热棒输出接口&#xff08;Heater_JK&#xff09;控制散热风扇输出接口&#xff08;Fan_JK&#xff0…

《设计模式:可复用面向对象软件的基础》——结构型模式(2)(笔记)

文章目录四、结构型模式4.4 DECORATOR(装饰)——对象结构型模式1.意图2.别名补充部分3.动机4.适用性5.结构6.参与者7.协作8.效果9.实现10.代码示例11.相关模式4.5 FACADE&#xff08;外观&#xff09;1.意图2.动机3.适用性4.结构5.参与者6.协作7.效果8.实现9.代码示制10.相关模…

Postgresql中yacc语法树冲突解决方法(shift/reduce conflicts)

处理方法 Postgresql中的gram.y可以独立编译&#xff0c;独立编译可以控制bison的参数来打印具体错误&#xff1a; PG15 cd src/backend/parserbison -d -o gram.c gram.y -Wno-deprecated正常执行后会产生gram.c文件&#xff0c;一旦发生冲突&#xff0c;bison会报错&#…

设计模式—关于如何更好的封装与创建对象

上一节我们主要学习了使用设计模式来写代码的指导思想以及设计模式的分门别类,本节主要学习创建型的三种设计模式是怎么使用的。如何利用创建型设计模式来指导我们更好的封装代码更好的创建对象。 为什么要封装?封装能带给我们什么好处?定义变量不会污染外部:封装的首要目的…

神经网络图像识别技术,神经网络指纹识别

1、声纹识别技术未来的发展趋势如何&#xff1f; 近几年来&#xff0c;我国生物识别技术行业市场主体数量呈迅速增长的趋势&#xff0c;截至目前&#xff0c;行业企业数量超4000家。据统计&#xff0c;2013-2018年&#xff0c;我国生物识别技术行业新增企业数量呈逐年增长的趋…

【编程题】【Scratch四级】2022.06 成绩查询

成绩查询 期末考试结束了,小朋友想知道自己考试的成绩和班级排名,让我们一起来实现这个功能吧! 1. 准备工作 (1)保留默认白色背景和小猫角色; (2)创建名为“姓名”和“成绩”的列表,按照图1输入相关内容。 2. 功能实现 (1)点击小绿旗,小猫询问“你要查询谁的成…