决策树构建算法—ID3、C4.5、CART树

article/2025/9/24 15:59:50

决策树构建算法—ID3、C4.5、CART树

    • 决策树构建算法—ID3、C4.5、CART树
  • 构建决策树的主要算法
  • ID3
  • C4.5
  • CART
  • 三种算法总结对比

决策树构建算法—ID3、C4.5、CART树

构建决策树的主要算法

  • ID3
  • C4.5
  • CART (Classification And Rsgression Tree)

ID3

ID3算法是决策树的一个经典的构造算法,内部使用:信息熵,信息增益,来进行构建:每次迭代选择信息最大的特征属性作为分割属性。
也就是说,在ID3算法中

  • 节点纯度的度量我们用的是 “信息熵”
  • 分裂特征的选择用的是信息增益度作为衡量指标

这和我们《决策树的构建三》用的思想是一样的。

信息熵越低——确定性越高——有序——数据越纯
信息增益——以A特征分割后,信息熵减少的越多,那就以为和Gain越大,说明分裂后信息的信息熵更低,数据更纯。

ID3算法用到的两个计算公式在决策树的构建中我们已经提到:
在这里插入图片描述

ID3算法具有以下特点

  • ID3算法只支持离散(类别型)特征属性,不支持连续特征属性
    如果你有连续性属性,要用ID3算法,在没分列前,要讲连续属性进行离散化。
  • ID3算法构建的是 多叉树

优点:

  • 决策树构建速度快;实现简单;

缺点:

  • 计算依赖于特征取值数目较多的特征,而属性值最多的属性并不一 定最优
    因为ID3构建决策树的时候固定构建的是多叉树,假如现在有X1,X2两个特征,X1有5种取值,X2有2种取值,现在将其构建成多叉树,如果以X1特征分裂会分成5个节点,每个节点只有2个,按照X2特征进行分裂的话,每个节点有5个样本,那么这个时候肯定按照X1特征进行分裂的树分裂后更纯。就意味着最终构建的决策树就依赖于属性值多的特征。
  • ID3算法不是递增算法
  • ID3算法是单变量决策树,对于特征属性之间的关系不会考虑
    • 单变量(属性)决策树
      在进行分了的时候,每一次分裂只由于一个特征决定。(X1 = 是,X1=否)
    • 多变量(属性)决策树
      反之,分裂时由多个特征决定(X1 = 是X2=否,X1=否X2=是)
  • 抗噪性差
    不做限制,训练集可以达到100%正确,但是,当有异常数据进来时,很容易被分错。
  • 只适合小规模数据集,需要将数据放到内存中

C4.5

C4.5实际上是对ID3算法进行的优化算法。也是一种经典的决策树构建算法。
对比比ID3算法看一下C4.5算法

  • 使用信息增益率来取代ID3算法中的信息增益,
  • 在树的构造过程中会进行剪枝操作进行优化
  • 能够自动完成对连续属性的离散化处理(可以对连续特征进行分裂)
  • C4.5构建的是多分支的决策树;
  • C4.5算法在选中分割属性的时候选择信息增益率最大的属性

涉及到的公式:
在这里插入图片描述
对于上述公式我们看个例子:
在这里插入图片描述

A :分裂属性X的分布(已婚 或 未婚)
D:样本标签Y的分布(1或0)
H(A): 按照特征属性A进行分类样本D的信息熵(黑色为已婚,红色为未婚)
H(D):样本D中,按照标签1,0计算的信息熵
H(D|A):按照特征属性A进行划分,划分后两个叶子结点按便签1,0计算的信息熵的和。
上边的图颜色上就是为了标注样本A属性类别,分裂的时候不是很正规,将就着看吧,将道理应该是一边全是黑色,一边全是红色。

优点:

  • 产生的规则易于理解
  • 准确率较高
  • 实现简单

缺点:

  • 对数据集需要进行多次顺序扫描和排序(,对连续特征进行分裂,实现连续特征离散化),所以效率较低
  • 只适合小规模数据集,需要将数据放到内存中

CART

实际上现在构建决策树的时候只用到了CART算法
CART既可以做分类任务,也可以做回归任务
对比上两个构建算法:

重点:

  • CART使用:
    • 基尼系数(分类树),作为数据纯度的度量指标
      最后用多数投票法决定叶子节点代表的值。
    • 均方差(回归树),作为数据纯度的度量指标
      最后的预测结果用节点中数据的平均值

根据公式基尼系数计算的是一个节点中标签Y的概率分布,但是如果你是一个连续值的话,这个概率就不好求了,这个时候不硬基尼系数作为纯度度量指标
回归任务们用均方差:
当叶子结点中的均方差越小——>叶子中的数据比较接近——>越纯(比如均方差为0,意味着所有样本的取值都一样,没有任何的波动,达到了最纯的条件)

  • 使用基尼增益率作为分割属性选择的标准
    选择基尼增益率最大的作为当前数据分割属性
  • CART允许特征多次使用
  • CATR构建的是二叉树

不管针对的是离散属性,还是连续属性,最后构建的都是二叉树,实际上,上一节我们用图像展示过三个度量纯度指标的效果实际上是一样的,对于我们最终构建的结果影响不大,但是构建的是多叉树还是二叉树,对最终决策的结果影响很大(多叉树分的会更细,一定能保证100%正确,反而会导致过拟合,我是这么认为的)。CART与上边两种算法最大的区别就在于左后构建的是一颗二叉树。

在这里插入图片描述


三种算法总结对比

  1. ID3、C4.5和CART算法均只适合在小规模数据集上使用
  2. ID3、C4.5和CART算法都是单变量决策树
  3. 当属性值取值比较多的时候,最好考虑C4.5算法,ID3得出的效果会比较差
  4. 决策树分类一般情况只适合小数据量的情况(数据可以放内存)
  5. CART算法是三种算法中最常用的一种决策树构建算法**(sklearn中仅支持CART:构造出来的是二叉树)**
  6. 三种算法的区别仅仅只是对于当前树的评价标准不同而已,ID3使用信息增益、C4.5使用信息增益率、CART使用基尼系数。(不是主要区别)
  7. CART算法构建的一定是二叉树,ID3和C4.5构建的不一定是二叉树。(主要区别)

在这里插入图片描述


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

相关文章

3-6 决策树、CART树、GBDT、xgboost、lightgbm一些关键点梳理

目录 1、决策树 2、CART树 2.1 CART分类树-输入样本特征;输出样本对应的类别(离散型) 2.2 CART回归树-输入样本特征;输出样本的回归值(连续型) 3、GBDT 3.1 提升树 3.2 GBDT 4、xgboost 4.1 损失函数及节点展开 4.2 精确贪心算法及相关近似算法…

CART树回归

说明:本博客是学习《python机器学习算法》赵志勇著的学习笔记,其图片截取也来源本书。 基于树的回归算法是一类基于局部的回归算法,通过将数据集切分成多份,在每一份数据中单独建模。与局部加权线性回归不同的是,基于…

剪枝、cart树

一、剪枝 1. 为什么要剪枝 在决策树生成的时候,更多考虑的是训练数据,而不是未知数据,这会导致过拟合,使树过于复杂,对于未知的样本不准确。 2. 剪枝的依据——通过极小化决策树的损失函数 损失函数的定义为&#x…

【机器学习】决策树——CART分类回归树(理论+图解+公式)

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 数据集 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 数据集 完整源码&…

CART树(分类回归树)

主要内容 (1)CART树简介 (2)CART树节点分裂规则 (3)剪枝 --------------------------------------------------------------------------------------------------------------------- 一、简介 CART…

CART树

算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法。 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支。因此…

Pytorch之view,reshape,resize函数

对于深度学习中的一下数据,我们通常是要变成tensor格式,并且需要对其调整形状,很多时候我们往往只关注view之后的结果(比如输出的尺寸),而不关心过程。但有时候还是要关注一下这个到底是怎么变换过来的&…

OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 图像缩放用于对图像进行缩小或扩大,当图像缩小时需要对输入图像重采样去掉部分像素,当图像扩大时需要在输入图像中根据算法生成部分像素,二者都会利用插值算法来实现。 一…

vector的resize函数和reserve函数

博客原文:C基础篇 -- vector的resize函数和reserve函数_VampirEM_Chosen_One的博客-CSDN博客,写的特别好,谢谢原博主。 正文: 对于C的vector容器模板类,存在size和capacity这样两个概念,可以分别通过vect…

OpenCV 图片尺寸缩放——resize函数

文章目录 OpenCV中的缩放:resize函数代码案例 OpenCV中的缩放: 如果要放大或缩小图片的尺寸,可以使用OpenCV提供的两种方法: resize函数,是最直接的方式;pyrUp,pyrDown函数,即图像…

OpenCV的resize函数优化

背景 在使用OpenCV做图像处理的时候,最常见的问题是c版本性能不足,以resize函数为例来说明,将size为[864,1323,3]的函数缩小一半: Mat img0;gettimeofday(&t4, NULL);cv::resize(source, img0, cv::Size(cols_out,rows_out)…

C++ | resize函数的用法

最近在leetcode用C刷题,刚遇到一题需要给重新弄一个容器,并给容器初始化。新建容器要在private类中声明resize函数用来初始化preSum容器。 resize函数是C中序列式容器的一个共性函数,vv.resize(int n,element)表示调整容器vv的大小为n&#x…

opencv的resize函数

一、Opencv官方文档中resize的描述: resize Resizes an image. C: void resize(InputArray src, OutputArray dst, Size dsize, double fx0, double fy0, int interpolationINTER_LINEAR ) Python: cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) …

resize()函数

resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:正在建造…

OpenCV 图像缩放:cv.resize() 函数详解

目录 系列前言API函数详解参数列表缩放方式其一缩放方式其二两种方式的优先级关于插值方式 扩展 —— 相关函数 系列前言 这个系列是我第一个想要更下去的系列。每篇会全面介绍一个 OpenCV 函数,会给出 API 和示例。示例主要是用 Python 去写,但是 Open…

安卓中的几种线程间通信方式

一:Handler实现线程间的通信 andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的…

Java中的线程通信的几种方式

Java中的线程间通信是指不同线程之间相互协作,以完成一些复杂的任务或实现某些功能的过程。线程间通信主要包括两个方面:线程之间的互斥和同步,以及线程之间的数据共享和通信。Java提供了多种方式来实现线程间通信,本文将介绍Java…

创建线程的四种方式 线程通信

文章目录 1.1 创建线程1.1.1 创建线程的四种方式1.1.2 Thread类与Runnable接口的比较1.1.3 Callable、Future与FutureTask 1.2 线程组和线程优先级1.3 Java线程的状态及主要转化方法1.4 Java线程间的通信1.4.1 等待/通知机制1.4.2 信号量1.4.3 管道 1.1 创建线程 1.1.1 创建线…

【多线程间几种通信方式】

一、使用 volatile 关键字 基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式 代码案例 package com.han…

线程之间的通信方式

前言 我只是个搬运工,尊重原作者的劳动成果,本文来源下列文章链接: https://zhuanlan.zhihu.com/p/129374075 https://blog.csdn.net/jisuanji12306/article/details/86363390 线程之间为什么要通信? 通信的目的是为了更好的协…