机器学习算法 决策树

news2024/10/6 4:26:27

文章目录

  • 一、决策树的原理
  • 二、决策树的构建
    • 2.1 ID3算法构建决策树
    • 2.2 C4.5 算法树的构建
    • 2.3 CART 树的创建
  • 三、决策树的优缺点

一、决策树的原理

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据。

决策树算法的本质是一种图结构,我们只需要问一系列问题就可以对数据 进行分类了。比如说,来看看下面这组数据集,这是一系列已知物种以及所属类别的数据:

在这里插入图片描述
我们现在的目标是,将动物们分为哺乳类和非哺乳类。那根据已经收集到的数据,决策树算法为我们算出了下面的这 棵决策树:
在这里插入图片描述
假如我们现在发现了一种新物种Python,它是冷血动物,体表带鳞片,并且不是胎生,我们就可以通过这棵决策树 来判断它的所属类别。

可以看出,在这个决策过程中,一直在对记录的特征进行提问。最初的问题所在的地方叫做根节点,在得到结论 前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点

  • 根节点:没有进边,有出边。包含样本全集
  • 中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
  • 叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签

使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。从根结点到每个叶结点的路径对应了一个判定的测试序列。决策树学习的目的是产生一棵泛化能力强,即处理未见示例强的决策树。

决策树算法的核心是要解决两个问题

  1. 如何从数据表中找出最佳节点和最佳分枝?
  2. 如何让决策树停止生长,防止过拟合?

二、决策树的构建

决策树最终的优化目标是使得叶节点的总不纯度最低,即对应衡量不纯度的指标最低。

为了要将表中的数据转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,而衡量这个“最佳”的指标叫做“不纯度”。不纯度基于叶子节点来计算的,所以树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。

不纯度:决策树的每个叶子节点中都会包含一组数据,在这组数据中,如果有某一类标签占有较大的比例,我们就说叶子 节点“纯”,分枝分得好。某一类标签占的比例越大,叶子就越纯,不纯度就越低,分枝就越好。如果没有哪一类标签的比例很大,各类标签都相对平均,则说叶子节点”不纯“,分枝不好,不纯度高。

通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。若我们定义 t t t代表决策树的某节点, D t Dt Dt t t t节点所对应的数据集,设 p ( i ∣ t ) p(i|t) p(it)表示给定结点 t t t中属于类别 i i i的样本所占的比例,这个比例越高,则代表叶子越纯。

:物理意义是体系混乱程度的度量。

信息熵:表示事物不确定性的度量标准,可以根据数学中的概率计算,出现的概率就大,出现的机会就多,不确定性就小(信息熵小)。
E n t r o p y = ∑ i = 0 c − 1 p ( i ∣ t ) log ⁡ 2 p ( i ∣ t ) Entropy = \sum_{i=0}^{c-1} p(i|t)\log_2p(i|t) Entropy=i=0c1p(it)log2p(it)
其中 c c c表示叶子节点上标签类别的个数, c − 1 c-1 c1表示标签的索引。注意在这里,是从第0类标签开始计算,所以最后的标签类别应该是总共 c c c个标签, c − 1 c-1 c1为最后一个标签的索引。在计算 E n t r o p y Entropy Entropy时设定 log ⁡ 2 0 = 0 \log_20=0 log20=0

信息增益(ID3):求父节点信息熵和子节点总信息熵之差

一个父节点下可能有多个子节点,而每个子节点又有自己的信息熵,所以父节点信息熵和子节点信息熵之差,应该是父节点的信息熵 - 所有子节点信息熵的加权平均。其中,权重是使用单个叶子节点上所占的样本量比上父节点上的总样本量来确定的一个权重。
I ( c h i l d ) = ∑ j = 1 k N ( v j ) N I ( v j ) I(child) = \sum_{j=1}^k \frac{N(v_j)}{N}I(v_j) I(child)=j=1kNN(vj)I(vj)

信息增益公式如下:

I n f o r m a t i o n G a i n = I ( p a r e n t ) − I ( c h i l d ) {InformationGain} = I(parent) - I(child) InformationGain=I(parent)I(child)

信息增益率(C4.5):在信息增益计算方法的子节点总信息熵的计算方法中添加了随着分类变量水平的惩罚项分支度。而分支度的计算公式仍然是基于熵的算法,只是将信息熵计算公式中的 p ( i ∣ t ) p(i|t) p(it)(即某类别样例占总样例数)改成了 P ( v i ) P(v_i) P(vi) ,即某子节点的总样本数占父节点总样本数的比例,这其实就是我们加权求和时的”权重“。这样的一个分支度指标,让我们在切分的时候,自动避免那些分类水平太多,信息熵减小过快的特征影响模型,减少过拟合情况。 I V IV IV计算公式如下:
I n f o r m a t i o n V a l u e = − ∑ i = 1 k P ( v i ) log ⁡ 2 P ( v i ) Information Value = -\sum_{i=1}^k P(v_i)\log_2P(v_i) InformationValue=i=1kP(vi)log2P(vi)

其中, i i i表示父节点的第 i i i个子节点, v i v_i vi表示第 i i i个子节点样例数, P ( v i ) P(v_i) P(vi)表示第 i i i个子节点拥有样例数占父节点总样例数的比例。很明显,IV可作为惩罚项带入子节点的信息熵计算中。可以简单计算得出,当取ID字段作为切分字段时,IV值为 log ⁡ 2 k \log_2k log2k。所以IV值会随着叶子节点上样本量的变小而逐渐变大,这就是说一个特征中如果标签分类太多,每个叶子上的IV值就会非常大。在C4.5中,使用之前的信息增益除以分支度作为选取切分字段的参考指标,该指标被称作Gain Ratio(获利比例,或增益率),计算公式如下:
G a i n R a t i o = I n f o r m a t i o n G a i n I n f o r m a t i o n V a l u e Gain Ratio = \frac{Information Gain}{Information Value} GainRatio=InformationValueInformationGain

Gini(基尼)指数:主要用于CART树的纯度判定中:
G i n i = 1 − ∑ i = 0 c − 1 [ p ( i ∣ t ) ] 2 Gini = 1-\sum_{i=0}^{c-1} [p(i|t)]^2 Gini=1i=0c1[p(it)]2

2.1 ID3算法构建决策树

ID3采用信息熵来衡量不纯度,此处就先以信息熵为例进行讨论。ID3最优条件是叶节点的总信息熵最小,因此ID3决策树在决定是否对某节点进行切分的时候,会尽可能选取使得该节点对应的子节点信息熵最小的特征进行切分。换而言之,就是要求父节点信息熵和子节点总信息熵之差要最大。对于ID3而言,二者之差就是信息增益,即Information gain

但这里需要注意,一个父节点下可能有多个子节点,而每个子节点又有自己的信息熵,所以父节点信息熵和子节点信息熵之差,应该是父节点的信息熵 - 所有子节点信息熵的加权平均。

局限性

  • 分支度越高(分类水平越多)的离散变量往往子节点的总信息熵会更小,ID3是按照某一列进行切分,有一些列的分类可能不会对我需要的结果有足够好的指示。极限情况下取ID作为切分字段,每个分类的纯度都是100%,因此这样的分类方式是没有效益的
  • 不能直接处理连续型变量,若要使用ID3处理连续型变量,则首先需要对连续变量进行离散化
  • 对缺失值较为敏感,使用ID3之前需要提前对缺失值进行处理
  • 没有剪枝的设置,容易导致过拟合,即在训练集上表现很好,测试集上表现很差

2.2 C4.5 算法树的构建

在C4.5中,使用信息增益率作为特征选择的依据,并首先通过引入分支度(IV:Information Value)的概念,来对信息增益的计算方法进行修正。增益比例是我们决定对哪一列进行分枝的标准,我们分枝的是数字最大的那一列,本质是信息增益最大,分支度又较小的列(也就是纯度提升很快,但又不是靠着把类别分特别细来提升的那些特征)。IV越大,即某一列的分类水平越多,Gain ratio实现的惩罚比例越大。当然,我们还是希望GR越大越好。

连续变量处理手段

在C4.5中,还增加了针对连续变量的处理手段。算法首先会对这一列数进行从小到大的排序,然后 选取相邻的两个数的中间数作为切分数据集的备选点,若一个连续变量有N个值,则在C4.5的处理过程中将产生N-1个备选切分点,并且每个切分点都代表着一种二叉树的切分方案

2.3 CART 树的创建

CART决策树使用“基尼指数”来选择划分属性。数据集D的纯度可用基尼值来度量,Gini(D)越小,则数据集的纯度越高。CART生成的是二叉树,计算量相对来说不是很大,可以处理连续和离散变量,能够对缺失值进行处理。

三、决策树的优缺点

优点

  • 速度快:计算量相对较小,且容易转化成分类规则。只要沿着树根向下一直走到叶,沿途的分裂条件就能够唯一确定一条分类的谓词。
  • 准确性高:挖掘出的分类规则准确性高,便于理解,决策树可以清晰的显示哪些字段比较重要。
  • 非参数学习,不需要设置参数。

缺点

  • 决策树很容易过拟合,很多时候即使进行后剪枝也无法避免过拟合的问题,因此可以通过设置树深或者叶节点中的样本个数来进行预剪枝控制;
  • 决策树属于样本敏感型,即使样本发生一点点改动,也会导致整个树结构的变化,可以通过集成算法来解决;

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

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

相关文章

NDK OpenCV人脸定位

NDK系列之OpenCV人脸定位技术实战,本节主要是通过OpenCV C库,实现识别人脸定位,并对识别到的人脸画面增加红框显示。 实现效果: 实现逻辑: 1.初始化CameraX,绑定图片分析器ImageAnalysis,监听…

7.队列算法

算法:队列算法 队列是一种抽象的数据结构,有点类似于Stacks。与堆栈不同,队列的两端都是开放的。一端始终用于插入数据(入队),另一端用于删除数据(出队)。队列遵循先进先出方法,即首先访问先存储的数据项。 一个真实的…

【C++初阶】类与对象(上)

一.什么是类,什么是对象 我们可以形象的把类比作是一个房子的设计图纸,而对象就是根据设计图纸设计出来的房子。 由设计图纸到房子的过程,我们称之为类的实例化。 C兼容C的,所以C中的结构体在C中也能用,但是C把结构体升…

rust教程 第一章 —— 初识rust

文章目录 前言一、Rust简介二、安装Rust编译器三、第一个Rust程序四、 IDE环境五、初识包管理六、总结 前言 本系列教程目录可查看这里:Rust教程目录 近些年来不断有新的语言崛起,比如当下非常火的go语言,不过相比于C,go语言确实…

C++类和对象 (3)

类和对象 1. 类的6个默认成员函数2. 构造函数2.1. 概念(问题提出)2.2. 特性 3.析构函数3.1. 概念3.2.特性 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在…

使用OpenFeign实现接口访问

1. 引言 在微服务横行的年代,后端根据业务的不一样分成了很多单独运行的服务,比如在物联网中,根据业务拆分为定时服务、设备控制等服务。当前端想控制设备时,其请求首先到其对应的后端服务,后端服务再调用设备控制服务…

Vue+Vant封装通用模态框单选框组件

前言 我们知道,在vant组件中提供的组件往往是比较基础的,能够满足基本需求。但是我们想实现ui设计的一些比较丰富效果的组件,需要自己去实现,且当项目中多次用到的时候,我们将以组件化的思想将其封装起来,…

Node.js -- 使用Express写接口

1.创建基本的服务器 //导入express const express require(express) //创建服务器实例 const app express() //调用app.listen方法,指定端口号并启动web服务器 app.listen(80,function(){console.log(Express server running at http://127.0.0.1) })2. 创建API路…

路由交换综合实验

拓扑结构: 要求 1、R6为网络运营商(ISP),接口IP地址均为公有地址;该设备只能配置IP地址,之后不能在对其进行任何配置; 2、R1~R5为局域网,私有IP地址192.168.1.0/24,请合…

真题详解(UML图)-软件设计(五十五)

真题详解(计算机知识)-软件设计(五十四)https://blog.csdn.net/ke1ying/article/details/130278265 组织域名: com商业组织 edu教育组织 gov政府组织 net主要网络支持中心 mil军事部门 Int国际组织 2、时间复杂度 O&#…

写一个自己的命令行解释器

写一个自己的命令行解释器 当我点开xshell运行服务器的时候bash就被加载到了内存中,此后我在bash上执行的所有程序都是作为bash的子进程。在bash这个进程内创建子进程,并让子进程去执行全新的代码,这不就是程序替换吗? 所以我们…

腾讯云4核8g服务器支持多少人在线使用?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

【Unity入门】17.脚本访问父子结点

【Unity入门】脚本访问父子结点 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)父级节点 (1)访问父级节点 父子关系我们并不陌生,在cocos中常用node:get…

单链表的实现

链表的概念与结构 链表与我们通讯录中的顺序表是不同的,顺序表的空间是连续的,像数组一样可以通过下标访问。而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。即:链表…

数据结构笔记:二叉树的遍历与技巧

引言 本篇是最近有遇到过的一个题目,关于二叉树的遍历,正好有一些经验与技巧,所以开一篇帖子记录一下。 二叉树遍历介绍 遍历是数据结构中常见的操作,主要是将所有元素都访问一遍。对于线性结构来说,遍历分为两种&a…

RecyclerView 静态布局实现过程解析:如何构建高性能的列表

作者:maxcion Recyclerview在日常开发中所使用的控件中绝对是顶流一般的存在,想嚼它这个想法一次两次了。在网上也看了很多关于Recyclerview源码解析的文章,大佬们写的都很深刻,但是对于像我们这种储备知识不足的小白读者来说&…

前端实现端到端测试(代码版)

端到端测试框架选取 playwright 、 cypress 、 selenium 对比 cypress使用 下载 cypress npm install cypress --save-dev package.json npm run cypress:open {"scripts": {"cypress:open": "cypress open"} }使用流程 入门官方文档 npm ru…

一本通 3.4.5 最小生成树

1348:【例4-9】城市公交网建设问题 【题目描述】 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点&…

SQL Server基础 第四章 select定制查询(select中的各种查询筛选条件)

本章主要介绍 select 语句查询数据的基本用法,其中包括查询指定字段信息、条件查询等。 目录 1、比较运算符、逻辑运算符 (1)查询phone大于500且不是单县的 (2)查询地址为烟台或者单县但是phone要大于666的 &#…

IMX6ull 之 HelloWorld Led点灯

一 GPIO点灯,嵌入式的helloworld 1 何为GPIO? GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO、UART、I2C等);该功能由CPU内外设提供,具体是什么功能由IOMUX…