决策树相关知识点

news2024/11/13 13:02:49

为什么id3和c4.5采用多叉树而cart采用二叉树?

ID3 和 C4.5 采用的多叉树虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但是其生成的决策树分支、规模都比较大,训练特别慢,CART 算法的二分法可以简化决策树的规模,提高生成决策树的效率。

决策树优点

可解释性

训练和测试快

特征类型

数值特征:离散特征和连续特征。连续特征的划分只能划分为二叉形式(二分法),离散特征的划分可以划分为二叉(=)或多叉(> <)

类别特征:取值不为数值,类别很少时,用one-hot,但是类别很多时(比如身份证),用one-hot会导致切分的子树及其不平衡,统计信息不准确,划分没意义,增益几乎为0。lightgbm对类别特征支持比较好。

剪枝方法

先剪枝

1 最大高度

2 叶子节点最小样本数

3 叶子节点属于同一类

4 增益最小阈值

5 所有特征都已经用于分割

缺点:它是基于“贪心”策略,会带来欠拟合风险。先剪枝有可能会过早停止决策树的生长,而继续生成有可能模型效果更好。

后剪枝

优缺点:后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。

由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记。可以在训练集(悲观剪枝)或测试集或交叉验证集上来剪枝过后准确率有所提升,则进行剪枝。 相比于预剪枝,后剪枝方法通常可以得到泛化能力更强的决策树,但时间开销会更大。


 

id3

连续特征

不能处理连续特征,只能处理离散特征,根据离散特征的取值将结点分为多叉。

信息熵

信息熵对属性值很多的属性有偏好,比如身份证id,分裂后每个节点只有一个样本,条件熵为0。其中,条件熵包含权重(否则有可能偏向不平衡划分,不平衡的划分没意义,比如一个节点10000多个样本,一个节点3个样本,相当于没有划分)

缺点:

没有剪枝策略,容易过拟合

信息增益对取值较多的属性有偏好(会导致分支数变多,每个分支的样本数量减少,模型变复杂,容易过拟合)

不能处理离散分布的特征

没有对缺失值进行妥善处理(直接丢弃会导致损失大量信息)

只能用于分类问题而不能用于回归问题(信息熵只能对分类问题算)

二叉树效率低

熵模型有大量的对数运算,很耗时间

c4.5

也是多叉树,不过可以处理连续特征

处理连续特征

在id3点基础上进行改进,可以处理连续特征,排序后取相邻样本值的均值作为待选切分点,寻找最优切分点,同时该连续属性也可以作为后代结点的划分属性,比如父节点上使用了“密度小于等于0.381”,不会禁止在左子节点上使用“密度小于等于0.294”的。值得注意的是,将连续特征作为切分点,则只有两个子节点。

信息增益率

信息增益率 = 信息增益/属性熵(计算公式和信息熵一致),对取值少的属性有偏好(导致分支变少,容易欠拟合),为了解决这个问题,c4.5先将信息增益小于平均水平的属性丢弃掉(偏好属性取值较多的),然后再选择信息增益率最大的(偏好属性取值较少的),这样的话两方面都有了兼顾。

缺失值处理:概率权重的方法

  • 对于缺失值的处理可以分为两个子问题:1. 在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)2. 选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
  • 针对问题一,C4.5 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算对应的信息增益;
  • 针对问题二,C4.5 的做法是:将缺失样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。
  • 测试时遇到缺失值则探索所有可能的分类结果并把所有结果结合起来考虑。这样,会存在多个路径,分类结果将是类别的分布而不是某一类别,从而选择概率最高的类别作为预测类别。

机器学习笔记(7)——C4.5决策树中的缺失值处理_c4.5处理缺失值_赵赵赵颖的博客-CSDN博客

剪枝

为什么要剪枝,没剪枝的树很容易过拟合,泛化性能很差。剪枝一般分为先剪枝和后剪枝。

c4.5采用悲观剪枝(Pessimistic Error Pruning)的方法,即认为所有节点都纯净,都需要剪枝,所以至上而下

利用训练集合,至上而下(不包括根节点和叶子节点),比较剪枝前后的误分类率和置信度来决定是否剪枝(包含对叶子节点的正则项)。当进行剪枝时,如果剪枝后的正确率比不剪枝的正确率低,但是差距不是很大,那么也可以进行剪枝。c4.5使用了标准差来计算未剪枝前的置信度。标准差反映了数据的离散程度,标准差越大,数据波动性越大,置信度就越低。

决策树算法--C4.5算法 - 知乎

优点

改善了id3中信息增益对取值比较多的属性的偏好问题

支持对缺失值的处理

可以处理连续值属性

可以剪枝,防止过拟合

缺点

二叉树效率低

只能分类不能回归

熵模型有大量的对数运算,很耗时间;连续值还有排序运算;排序时需要数据集常驻内存,训练集合太大时容易爆内存。

cart

同c4.5,可以处理连续特征和离散特征,不过是二叉树。采用分裂后基尼系数(分类树)/误差的平方(回归树)最小的那个分割点。

基尼系数的意义

从数据集D中随机抽取两个样本,其类别不同的概率。直觉地,基尼指数越小,则数据集D的纯度越高。采用基尼系数的原因是可以衡量数据集的纯度并且运算简单,不用复杂的对数运算。

剪枝(较难)

至下而上,从底端不断剪枝,过程中的树生成一个树集合,用交叉验证的方法对树集合进行测试,从而选择最优的子树。

CART生成与剪枝算法 – 月来客栈

缺失值处理:概率权重和代理特征分割

  • 对于缺失值的处理可以分为两个子问题:1. 在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)2. 选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
  • 针对问题一,Cart 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算对应的信息增益;
  • 针对问题二,Cart的做法是:按照选取的特征进行分裂并遇到缺失值时那么我们需要遍历剩余的特征,剩余的特征中如果有也存在缺失值的特征,那么这些特征忽略,仅仅在完全没有缺失值的特征上进行选择,我们选择其中能够与最佳增益的缺失特征分裂之后增益最接近的特征进行分裂,当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。
  • 对测试中存在的缺失值处理方式存疑。

优点

既能处理分类问题也能处理回归问题

基尼系数大大减少了计算量

可以处理缺失值

可以剪枝

使用二叉树而不是多叉树可以缓解过拟合

lightgbm和xgboost都是将有缺失值的样本分配给增益最大的节点,测试时,如果在训练集中有相同的分割,则和训练集一样,如果没有,那么默认将有缺失值的样本分割左节点。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis框架源码笔记(十一)之Spring整合mybatis演示与整合原理解析

1 Spring框架整合Mybatis示例 1.1 创建演示项目 1.2 项目目录结构 1.3 依赖配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

d2l机器翻译数据集

着重讲解一下机器翻译数据集的文件处理&#xff0c;以及最终返回了什么 目录 1.载入文件 2.文本预处理 3.词表 4.集成封装 5.总结返回值 1.载入文件 #save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5) #save def read…

AJAX-0基础第一天入门

AJAX-第一天入门 学习目标 掌握 axios 相关参数&#xff0c;从服务器获取并解析展示数据掌握接口文档的查看和使用掌握在浏览器的 network 面板中查看请求和响应的内容了解请求和响应报文的组成部分 01.AJAX 概念和 axios 使用 目标 了解 AJAX 概念并掌握 axios 库基本使用…

生信刷题之ROSALIND——Part 2

目录 1、Counting Point MutationsProblemSample DatasetSample OutputCodeOutput 2、Mendels First LawProblemSample DatasetSample OutputCodeOutput 3、Translating RNA into ProteinProblemSample DatasetSample OutputCodeOutput 4、Finding a Motif in DNAProblemSample…

C/C++每日一练(20230415)

目录 1. 交错字符串 &#x1f31f;&#x1f31f; 2. 最短回文串 &#x1f31f;&#x1f31f; 3. 分段函数计算 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 交错字符串 给定…

【数据库】MySQL的增删改查

目录 1.CRUD 2.新增数据 2.1单行数据全列插入 2.2多行数据指定列插入 3.查询数据 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.4别名 3.5去重DISTINCT 3.6排序ORDER BY 3.7 条件查询&#xff1a;WHERE 3.8 分页查询&#xff1a;LIMIT 4.修改数据 5.删除数…

Flutter开发中的线程与事件队列,如何实现高效优化?

Flutter 中线程简要介绍&#xff1a; 主 UI 线程&#xff1a; Flutter 的主 UI 线程通常称为 “UI Isolate”&#xff0c;它是单线程的&#xff0c;负责处理用户界面的渲染和响应用户输入。在主 UI 线程中运行的代码主要包括 Flutter 应用的 UI 组件构建、布局、绘制等操作&a…

基于DSP+FPGA的机载雷达伺服控制系统(二)电源仿真

板级电源分配网络的分析与仿真在硬件电路设计中&#xff0c;电源系统的设计是关键步骤之一&#xff0c;良好的电源系统为电路板 上各种信号的传输提供了保障。本章将研究电源完整性的相关问题&#xff0c;并提出一系列改 进电源质量的措施。 3.1 电源完整性 电源完整性&#xf…

7.思维题(0x3f:从周赛中学算法 2022下)

来自0x3f【从周赛中学算法 - 2022 年周赛题目总结&#xff08;下篇&#xff09;】&#xff1a;https://leetcode.cn/circle/discuss/WR1MJP/ 包含贪心、脑筋急转弯等&#xff0c;挑选一些比较有趣的题目。 注&#xff1a;常见于周赛第二题&#xff08;约占 21%&#xff09;、第…

【Linux】进程间通信 -- System V共享内存

前言 本篇博客介绍第二种进程间通信的方式 – System V System V 有三种方式&#xff1a; 共享内存 消息队列 信号量 本篇博客对于系统调用的函数&#xff0c;会进行一定的封装 文章目录 前言一. System V 共享内存二. 共享内存的原理三. 共享内存的创建四. 共享内存的查看和删…

MinGW MinGW-W64介绍

Table of content 0 Preface/Foreword 1 MinGW-w64 1.1 使用MinGW-w64的原因 1.2 MinGW-w64使用场景 1.3 官网 2 GCC & LLVM 2.1 编译器构成 2.2 GCC 2.3 LLVM 2.3.1 Clang 0 Preface/Foreword MInGW全称为&#xff1a;Minimalist GNU on Windows.将经典的开源C…

Unity VFX -- (4)创建burst粒子效果

如果用户成功达成某个目标&#xff0c;我们可以使用一个爆裂的礼花来激励用户。如果角色挥舞刀剑&#xff0c;我们可以做出剑气来增加气势。如果角色落到地面上&#xff0c;我们可以在脚部做出飞舞的灰尘来增加表现力。这些都可以视为burst粒子效果。 下面是一些burst粒子效果&…

JVM学习(六):类加载子系统

目录 〇、前言 一、类加载子系统 1.1 内存结构概述 1.2 类加载器及类加载过程概述 1.2.1 类加载器 1.2.2 类加载过程 1.3 类加载过程一&#xff1a;Loading 1.3.1 加载过程 1.3.2 加载类的方式 1.4 类加载过程二&#xff1a;Linking 1.4.1 验证(Verify) 1.4.…

贯穿设计模式第八话--设计原则总结篇

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…

在uos上编译opencv

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 下载源码并创建build文件夹 系统环境为操作系统为&#xff1a;UnionTech OS Server 20 Enterprise&#xff0c;处理器为: 华为鲲鹏处理器&#xff08;ar…

C++11(上)

目录 1&#xff1a;列表初始化 2&#xff1a;std::initializer_list 3:变量类型推导 3.1:auto推导类型 3.2:decltype 3.3:nullptr 4:范围for 5:STL新增容器和容器新增接口 5.1:array 6:左值引用和右值引用 6.1:左值 6.2:右值 6.3:左值引用 6.4:右值引用 6.5:左值…

python常用库之time库

目录 一、前言time库中的常用函数 二、time()函数三、localtime()和gmtime()函数四、strftime() 、asctime()、mktime()函数&#xff08;一&#xff09;strftime()函数&#xff08;二&#xff09;asctime()函数&#xff08;三&#xff09;mktime()函数 五、ctime()函数六、stri…

【2023最新】超详细图文保姆级教程:App开发新手入门(5)

上文回顾&#xff0c;我们已经完成了一个应用的真机调试&#xff0c;本章我们来了解一下如何引入YonBuilder移动开发的&#xff08;原生&#xff09;移动插件, 并利用移动插件完成一个简单的视频播放器。 8. 「移动插件」的使用 8.1 什么是 「移动插件」&#xff1f; 用通俗…

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…

【高危】Apache Spark 权限提升漏洞(CVE-2023-22946)

漏洞描述 Apache Spark 是一款支持非循环数据流和内存计算的大规模数据处理引擎。 使用 spark-submit 脚本在集群中启动任务可以通过指定proxy-user参数限制运行用户。在 Apache Spark 受影响版本中&#xff0c;攻击者通过指定自定义的classpath&#xff0c;则可以覆盖该配置…