决策树(分类决策树)

分类决策树是一种基于树状结构的监督学习模型,主要用于对数据进行分类任务。它通过一系列规则(即树的分支)对输入数据进行递归划分,最终达到预测输出类别(即树的叶节点)的目的。分类决策树以其直观易懂、解释性强的特点被广泛应用在各种领域,如医学诊断、金融风险评估、市场营销策略制定等。下面我们对分类决策树进行更详细描述:

基本原理

分类决策树模拟人类在面对问题时进行逻辑判断和决策的过程。它通过一系列问题(基于数据的特征)逐步缩小决策范围,直至达到一个明确的结论。在数据科学和机器学习的语境下,这个过程表现为:

  • 根节点:代表整个数据集,即所有待分类的样本集合。

  • 内部节点(决策节点):每个内部节点表示一个特征测试条件。根据该特征的不同取值,数据被分割成若干子集,并沿着树的分支流向对应的子节点。

  • 分支:连接内部节点和子节点的连线,代表特征测试条件的结果导向。

  • 叶节点(终端节点):树的最底层节点,表示分类结果。每个叶节点对应一个类别标签,代表经过从根到该节点路径上的特征测试后,数据样本被归属于该类别的概率或确定性标签。

构建过程

构建分类决策树通常包括以下步骤:

特征选择

在每个内部节点,选择一个最优特征作为划分标准。最优特征通常是指根据这个特征划分后信息增益、基尼指数或类似指标的特征最优的特征,这些指标反映了根据该特征划分数据集后纯度的提升程度。

纯度:对于包含多个类别的数据集,如果类别数越多,则认为这个数据集越不纯。反之则越纯。纯度越高,分类效果越好。

信息增益

首先了解一下信息熵

信息熵

在机器学习中,信息熵(Entropy)是一个核心概念,用于量化随机变量或数据集的“不确定性”或“混乱度”。它衡量了一个随机变量可能取值的期望信息量。具体来说,信息熵越大,代表随机变量的不确定性越高,或者说数据的混乱程度越高,越混乱,证明其中所含有的标签越多,自然也就越混乱。

举个例子:在一个书架上,每本书是一个样本,当我们排列这些书时,如果它们同样高,那么排出来是美观的,如果高度都是参差不齐的,那么排出来就很乱。这就是熵低与高的区别。
熵高 -> 不一样的多 熵低 -> 一样的多

在信息论中,熵被用来衡量一个随机变量出现的期望值。它代表了在被接收之前,信号传输过程中损失的信息量,又被称为信息熵。对于离散随机变量 X X X,其信息熵 H ( X ) H(X) H(X) 定义为:

H ( X ) = − ∑ x ∈ X p ( x ) log ⁡ 2 p ( x ) H(X) = -\sum_{x \in X} p(x) \log_2 p(x) H(X)=xXp(x)log2p(x)

其中, p ( x ) p(x) p(x) 是随机变量 X X X 取值为 x x x 的概率。这个公式计算了所有可能取值的概率与其对应的信息量(即概率的负对数)的期望值。

信息增益的计算

计算信息增益的步骤如下:

  1. 计算父节点的熵:首先,需要计算整个数据集的熵,这代表了数据集的不确定性。父节点的熵的计算公式为:
    Entropy ( S ) = − ∑ i = 1 n p ( i ) log ⁡ 2 p ( i ) \text{Entropy}(S) = -\sum_{i=1}^{n} p(i) \log_2 p(i) Entropy(S)=i=1np(i)log2p(i)
    其中,S代表数据集,p(i)代表数据集中第i个类别出现的概率。

  2. 计算子节点的熵以及加权平均:然后,对于每个特征,计算其划分数据集后得到的子节点的熵。这涉及到对数据集按照每个特征的不同取值进行划分,并计算每个子集的熵。

子节点熵的加权平均的公式如下:

Weighted Average of Child Entropies = ∑ j = 1 m ∣ S j ∣ ∣ S ∣ × Entropy ( S j ) \text{Weighted Average of Child Entropies} = \sum_{j=1}^{m} \frac{|S_j|}{|S|} \times \text{Entropy}(S_j) Weighted Average of Child Entropies=j=1mSSj×Entropy(Sj)

其中:

  • ( S ) 是父节点所代表的数据集。
  • ( S_j ) 是根据某个特征的第 ( j ) 个取值划分得到的子节点所代表的数据子集。
  • ( m ) 是该特征的不同取值的数量,也就是子节点的数量。
  • ( |S| ) 和 ( |S_j| ) 分别表示父节点和子节点数据集的大小(即样本数量)。
  • ( \text{Entropy}(S_j) ) 是子节点 ( S_j ) 的熵。
  1. 计算信息增益:最后,用父节点的熵减去子节点熵的加权平均,得到该特征的信息增益。
    Information Gain ( S , feature ) = Entropy ( S ) − Weighted Average of Child Entropies \text{Information Gain}(S, \text{feature}) = \text{Entropy}(S) - \text{Weighted Average of Child Entropies} Information Gain(S,feature)=Entropy(S)Weighted Average of Child Entropies

通过计算每个特征的信息增益,可以选择信息增益最大的特征作为当前节点的划分标准。这样,每次划分都能最大程度地减少数据的不确定性,从而提高分类模型的性能。

信息增益率(Information Gain Ratio)是信息增益的一个改进版本,它考虑了特征取值数量的影响,以避免选择取值较多的特征(比如读取数据时把id也读取了)。信息增益率的计算公式为:
Information Gain Ratio = Information Gain Intrinsic Value of Feature \text{Information Gain Ratio} = \frac{\text{Information Gain}}{\text{Intrinsic Value of Feature}} Information Gain Ratio=Intrinsic Value of FeatureInformation Gain

基尼指数

基尼指数(Gini Index)在机器学习和数据挖掘中,是一个用于衡量数据集合纯度的指标。与熵相似,基尼指数越小,表示集合的纯度越高。在构建决策树时,基尼指数被用来选择划分数据集的最优特征,以便将数据集划分为更纯的子集。

基尼指数的计算公式如下:

Gini Index ( S ) = 1 − ∑ i = 1 m p i 2 \text{Gini Index}(S) = 1 - \sum_{i=1}^{m} p_i^2 Gini Index(S)=1i=1mpi2

其中:

  • (S) 是要计算基尼指数的数据集。
  • (m) 是数据集中类别的数量。
  • (p_i) 是数据集中第 (i) 个类别出现的概率。

这个公式衡量的是从数据集中随机选择一个样本,然后错误地将其分类到其他类别的概率。当数据集完全属于一个类别时(即纯度最高),基尼指数达到最小值0;当数据集中的类别分布均匀时,基尼指数达到最大值(1 - \frac{1}{m})。

属性的基尼指数它用于评估按照某个属性(或特征)的不同取值划分数据集后,所得子集的纯度和不确定性。基尼指数越小,表示按照该属性划分后的子集纯度越高。

计算属性的基尼指数的基本步骤如下:

  1. 确定数据集:首先,确定要计算基尼指数的数据集,以及用于划分的属性。

  2. 划分数据集:根据属性的不同取值,将数据集划分为多个子集(或称为子节点)。

  3. 计算每个子集的基尼指数:对于每个子集,计算其基尼指数。基尼指数的计算公式为:

    Gini Index ( S ) = 1 − ∑ i = 1 m p i 2 \text{Gini Index}(S) = 1 - \sum_{i=1}^{m} p_i^2 Gini Index(S)=1i=1mpi2

    其中,(S) 是子集,(m) 是子集中类别的数量,(p_i) 是子集中第 (i) 个类别出现的概率。

  4. 计算加权基尼指数:由于不同子集的大小(即样本数量)可能不同,因此需要计算加权基尼指数,以考虑不同子集对数据集整体纯度的影响。加权基尼指数是每个子集的基尼指数与其样本数量占数据集总样本数量的比例的乘积之和。

    Weighted Gini Index = ∑ j = 1 n ∣ S j ∣ ∣ S ∣ × Gini Index ( S j ) \text{Weighted Gini Index} = \sum_{j=1}^{n} \frac{|S_j|}{|S|} \times \text{Gini Index}(S_j) Weighted Gini Index=j=1nSSj×Gini Index(Sj)

    其中,(S_j) 是根据属性划分得到的第 (j) 个子集,(n) 是子集的数量,(|S_j|) 是子集 (S_j) 的样本数量,(|S|) 是数据集的总样本数量。

  5. 选择最优属性:比较不同属性的加权基尼指数,选择使得加权基尼指数最小的属性作为划分标准。这样,每次划分都能使得数据集的纯度得到最大提升。

属性的基尼指数在决策树构建过程中起着关键作用,它帮助我们选择能够最大程度提升数据集纯度的属性作为划分依据,从而构建出性能更优的分类模型。

决策树生长

选定我们要分类的特征后,就可以开始构建决策树。决策树的生长过程就是从根节点开始,递归地对数据集进行划分,生成一系列的内部节点和叶节点。

基于选定的最优特征及其阈值(对于连续特征[回归决策树(解决回归问题)])或类别(对于离散特征的普通决策树),将数据集划分为多个子集,并为每个子集生成新的节点。这一过程递归地在每个子节点上重复,直到满足停止条件为止。常见的停止条件包括:

节点包含的样本数小于预设阈值:当节点内样本数量过少时,继续划分可能带来过拟合风险,此时停止生长。
所有样本属于同一类别:该节点无需再划分,其类别已经一致。
没有更多特征可供划分:所有特征已用于划分,或剩余特征无法有效提高模型性能。
达到预设的最大深度或节点数:防止过深的树导致模型过于复杂,降低泛化能力。

决策树剪枝

生长得到的原始决策树可能存在过拟合现象,即对训练数据拟合得过于复杂,不利于泛化到未知数据。剪枝旨在简化树结构,提高模型的泛化能力。常见的剪枝方法包括:

预剪枝:在生长过程中提前终止树的生长,如设定最大深度、最小样本数等阈值。
后剪枝:先生成完整的决策树,然后自底向上考察各内部节点,若将其替换为叶节点能带来整体性能的提升(如根据验证集计算的精度提高),则进行剪枝。

应用与优势

分类决策树具有以下优点:

易于理解和解释:决策树的结构清晰,决策规则直观,便于非专业人士理解模型的决策逻辑。
无需数据预处理:对于缺失值和非数值型数据有较好的适应性,通常不需要进行复杂的预处理。
可处理多输出问题:通过构建多棵树或扩展单棵树的结构,可以处理多类别或多输出的任务。
支持并行计算:在某些实现中,决策树的构建过程可以并行化,加速训练速度。

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

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

相关文章

OpenMesh 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #define _USE_MATH_DEFINES #include

前端实现Excel文件导出功能的完整指南(vue实现excel文件导出功能)

简介:在许多Web应用程序中,导出数据到Excel文件是一项常见的需求。本文将介绍如何通过前端代码实现Excel文件的导出功能,以及如何优化和扩展这一功能,以满足不同场景下的需求。这里来记录一下 一. 技术背景 在许多业务场景中&…

springboot日志使用 SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

还是直接上代码 Slf4j 这玩意 默认支持 不用引入 yml 配置文件 # 日志配置 如果配置了xml 这个就不生效了 xml优先级最高 #logging: # file: # path: /home/logs # 日志目录地址 # name: /home/logs/skeleton.log # max-size: 1KB # 设置日志大小的最大大小 1…

DevOps转型的意义:加速创新、提高效率

DevOps作为一种文化和方法论,正在成为现代软件开发和运维的核心。本文将探讨DevOps转型的意义,以及它对组织的影响,如何加速创新、提高效率,并为企业赋予竞争优势。 --- 在当今数字化时代,软件开发和运维已经成为企业竞…

ELB 后端主机异常

场景:运维同事发现某个业务访问不正常,用户访问页面得不到响应。查看elb(共享ELB)后端主机组发现,后端主机组显示异常。开始以为是共享负载均衡的问题,修改监控检查协议为tcp,之前是http协议。发现后端主机组显示正常。但是业务不…

Ubuntu22.04.4 - SSH - 笔记

SSH在Ubuntu22.04.4环境下的笔记 在服务器安装的时候勾选了ssh选项,后面都是默认配置信息 一、允许 root ssh 登录 这里遇到了 使用xshell 连接虚拟机,出现拒绝密码的提示 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori 备份 vi /etc/ssh/sshd_con…

Linux 操作系统gdb、makefile

今天是对前面两天的补充和完善。 1、gdb 1.1 gdb 作用 调试程序 1.2 调试bug的步骤 测试:发现问题 固化:让bug重现 定位:找到bug的位置 修改:修改bug 验证 1.3 gdb调试工具的使用 1->想要使用gdb调试工具,在编…

【网站项目】自习室预约系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

汽车充电桩充电效率的四大决定因素

随着电动汽车的快速普及,交流充电桩作为电动汽车的充电基础设施,其充电效率受到了广泛的关注。接下来,我们将深入探讨交流充电桩的充电效率,包括充电效率的定义、影响因素以及提升方法。 充电效率的定义 交流充电桩的充电效率指的…

在CentOs7中设置tomcat应用systemd启动服务

目的: 解决安装tomcat服务后无法后台启动问题 一:配置Tomcat应用的service服务 具体文件内容如下: tomcat.service [Unit] DescriptionApache Tomcat Web Application Container Aftersyslog.target network.target [Service] Typeforkin…

【微信小程序从入门到精通(项目实战)】——微电影小程序

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

2024华中杯C题完整解题思路及代码

C 题 基于光纤传感器的平面曲线重建算法建模 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技 术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号,其 基本原理是当外界环境参数发生变化时,会引起光纤传感器中光波参量&…

零基础机器学习|线性回归

一、数据收集和预处理 1、读取可视化 使用pandas库导入csv(逗号相隔开的文件)pd.read_csv() import pandas as pd df_ads pd.read_csv("本地文件地址D:\…\双斜线表示“) 使用head()读出数据表格的前5行 df_ads.head() 2、相关分析 …

Vue前端框架如何调用天聚数行API?

Vue是一个业内优秀的前端解决方案,采用了最新流行的MVVM框架模式,深受web前端开发者的喜爱,在相关开发者社区也一直都是热门交流话题。那么,如何通过Vue调用天行数据的API接口呢,下面就具体给大家示例。 vue采用的是数…

数字零售力航母-看微软如何重塑媒体

数字零售力航母-看微软如何重塑媒体 - 从2024全美广播协会展会看微软如何整合营销媒体AI技术和AI平台公司 2024年,微软公司联合英伟达总司,赞助全美广播协会展会。本次展会微软通过搭建一个由全面的合作伙伴生态系统支持的可信和安全的平台,…

TCP和UDP协议的区别

1、定义 TCP协议的全称是Transmission Control Protocol(传输控制协议),是一种面向连接的点对点的传输层协议。 UDP协议的全称是User Datagram Protocal(用户数据报协议),为应用程序提供一种无需建立连接…

手机从0基础到精通拍摄,拍摄手法0基础教学,快速入门

课程下载:https://download.csdn.net/download/m0_66047725/89064797 更多资源下载:关注我。 课程内容: 1 为什么学拍摄剪辑.mp4 2 如何选择手机.mp4 3 补光灯的作用.mp4 !三角支架的作用.mp4 5 麦克风的作用.mp4 6 帧率清晰度参数.m…

Hive进阶

目录 一、MapReduce的计算过程 二、Yarn的资源调度 yarn的资源调度策略 三、Hive的语法树 四、Hive配置优化 五、数据开发 六、数据仓库 七、数据仓库开发流程 八、数仓分层 九、ETL和ELT 一、MapReduce的计算过程 分布式计算框架 需要编写代码执行,执行时…

Edge的使用心得与深度探索:优化浏览体验的技巧与建议

随着互联网的快速发展,浏览器已经成为我们日常生活中不可或缺的工具之一。在众多浏览器中,微软Edge凭借其稳定性、安全性和功能丰富性备受用户青睐。本文将深入探讨Edge浏览器的各种功能与技巧,帮助用户优化其浏览体验。 文章目录 Edge翻译插…

【无标题】axios的ts封装,记录一下(Vue3项目)

request.ts: // 参考:https://www.jb51.net/article/282238.htm import axios from axiosconst instance axios.create({baseURL: https://api.apiopen.top/api })// 添加请求拦截器 instance.interceptors.request.use(function (config) {// 在发送请求之前做些…