当前位置: 首页 > news >正文

决策树(Decision Tree)

决策树(Decision Tree)是一种常用的分类与回归方法,它通过树状结构将数据集进行划分,从而实现数据的分类或回归预测。决策树的实现逻辑主要涉及节点的分裂、最优属性的选择、树的构建以及剪枝等步骤。其中,信息增益(Information Gain)和信息增益率(Gain Ratio)是选择最优分裂属性的重要准则。以下将详细解释决策树的实现逻辑,并给出信息增益和信息增益率的计算公式。

一、决策树的实现逻辑

1. 决策树的基本概念

决策树是一种树形结构,每个内部节点表示一个属性的测试,每个分支代表测试的一个结果,而每个叶节点则代表一个类别或回归值。决策树的构建过程是一个递归过程,从根节点开始,通过选择最优属性进行分裂,直到满足停止条件(如所有实例属于同一类别、属性用尽或达到最大深度等)。

2. 决策树的构建步骤

(1)选择最优属性:在每个节点处,选择能够最大化信息增益或信息增益率的属性作为分裂属性。

(2)分裂数据集:根据选定的属性,将数据集分裂为不同的子集,每个子集对应属性的一个取值。

(3)递归构建子树:对每个子集递归地应用上述步骤,直到满足停止条件。

(4)剪枝处理:为了防止过拟合,通常需要对生成的决策树进行剪枝处理,即去除一些不必要的分支。

3. 停止条件
  • 所有实例属于同一类别:此时无需再分裂,直接将该节点标记为叶节点,并赋予该类别。
  • 属性用尽:即当前节点的所有样本在所有属性上的取值都相同,无法再分裂。此时,可以将该节点标记为叶节点,并根据多数投票原则赋予一个类别。
  • 达到最大深度:为了控制树的复杂度,可以设置树的最大深度,当达到该深度时停止分裂。

二、信息增益的计算公式

信息增益是选择最优分裂属性的常用标准,它基于熵(Entropy)的概念。熵用于衡量数据集的不确定性,熵越大,数据集的不确定性就越大。信息增益表示使用某个属性对数据集进行划分后,数据集不确定性的减少程度。

1. 熵的计算公式

设数据集D中包含K个类别,第k个类别包含的样本数为 ∣ C k ∣ |C_k| Ck,则数据集D的熵Ent(D)定义为:

Ent ( D ) = − ∑ k = 1 K p k log ⁡ 2 p k \text{Ent}(D) = -\sum_{k=1}^{K} p_k \log_2 p_k Ent(D)=k=1Kpklog2pk

其中, p k = ∣ C k ∣ ∣ D ∣ p_k = \frac{|C_k|}{|D|} pk=DCk 是第k个类别在数据集D中出现的概率。

2. 信息增益的计算公式

设属性A有V个可能的取值 { a 1 , a 2 , … , a V } \{a^1, a^2, \ldots, a^V\} {a1,a2,,aV},若使用属性A对数据集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性A上取值为 a v a^v av的样本,记为 D v D^v Dv。根据信息增益的定义,属性A对数据集D的信息增益Gain(D, A)为:

Gain ( D , A ) = Ent ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ( D v ) \text{Gain}(D, A) = \text{Ent}(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} \text{Ent}(D^v) Gain(D,A)=Ent(D)v=1VDDvEnt(Dv)

其中, ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} DDv 是第v个分支结点的权重,表示该分支结点包含的样本数占数据集D总样本数的比例。 Ent ( D v ) \text{Ent}(D^v) Ent(Dv) 是第v个分支结点的熵。

三、信息增益率的计算公式

信息增益率是为了克服信息增益对取值数目较多的属性的偏爱而提出的。它使用信息增益与属性A的固有值(Intrinsic Value)之比作为选择最优属性的标准。

1. 固有值的计算公式

属性A的固有值IV(A)定义为:

IV ( A ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ \text{IV}(A) = -\sum_{v=1}^{V} \frac{|D^v|}{|D|} \log_2 \frac{|D^v|}{|D|} IV(A)=v=1VDDvlog2DDv

这个公式实际上计算了属性A的熵,但它与数据集D的熵不同,因为它只考虑了属性A的不同取值在数据集D中的分布。

2. 信息增益率的计算公式

属性A对数据集D的信息增益率Gain_ratio(D, A)定义为:

Gain_ratio ( D , A ) = Gain ( D , A ) IV ( A ) \text{Gain\_ratio}(D, A) = \frac{\text{Gain}(D, A)}{\text{IV}(A)} Gain_ratio(D,A)=IV(A)Gain(D,A)

如果某个属性的固有值IV(A)很小(即该属性的取值很少),则信息增益率Gain_ratio(D, A)会很大,这可能导致对取值数目较少的属性的偏好。因此,在实际应用中,信息增益率通常不是直接作为选择最优属性的唯一标准,而是先使用信息增益来选择候选属性,然后从这些候选属性中再选择信息增益率较高的属性作为最优属性。

四、决策树中的其他考虑因素

除了信息增益和信息增益率外,决策树的构建过程中还可能考虑其他因素,如基尼不纯度(Gini Impurity)和剪枝策略。

1. 基尼不纯度

基尼不纯度是另一种衡量数据集不确定性的指标,它基于基尼系数的概念。对于包含K个类别的数据集D,其基尼不纯度Gini(D)定义为:

Gini ( D ) = 1 − ∑ k = 1 K p k 2 \text{Gini}(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1k=1Kpk2

其中, p k p_k pk 是第k个类别在数据集D中出现的概率。与熵类似,基尼不纯度也越小,表示数据集的不确定性越小。在决策树构建过程中,可以使用基尼不纯度作为选择最优属性的标准,即选择使基尼不纯度减少最多的属性进行分裂。

2. 剪枝策略

剪枝是决策树算法中防止过拟合的重要步骤。过拟合是指模型在训练数据上表现良好,但在新数据上表现不佳的现象。剪枝可以通过移除决策树中的一些子树或叶节点来简化模型,从而提高其泛化能力。

剪枝策略主要分为预剪枝和后剪枝两种。预剪枝是在构建决策树的过程中,提前停止树的生长,如通过设置最大深度、最大叶节点数或最小样本数等停止条件。后剪枝则是在决策树完全生长后,通过评估移除子树对模型性能的影响来决定是否进行剪枝。常用的后剪枝算法包括成本复杂度剪枝(Cost-Complexity Pruning)和错误率降低剪枝(Reduced-Error Pruning)等。

五、决策树的优缺点及应用

优点:
  1. 易于理解和解释:决策树模型以树状图的形式呈现,直观易懂,便于非专业人士理解和使用。
  2. 能够处理非线性关系:决策树可以自动学习数据中的非线性关系,无需进行复杂的特征转换。
  3. 能够处理多输出问题:决策树可以同时处理多个输出变量,适用于多标签分类问题。
  4. 对数据分布没有严格要求:决策树算法对数据分布没有严格要求,既可以处理连续数据,也可以处理离散数据。
缺点:
  1. 容易过拟合:当决策树过于复杂时,容易在训练数据上产生过拟合现象,导致模型在测试数据上表现不佳。
  2. 对缺失值敏感:决策树算法对输入数据的缺失值比较敏感,需要进行适当的处理。
  3. 不够稳定:决策树算法的性能受数据样本和特征选择的影响较大,不同的样本和特征集可能会产生完全不同的决策树模型。
应用:

决策树算法广泛应用于各个领域,如金融风险评估、医疗诊断、客户细分、市场营销等。在金融领域,决策树可以用于信用评分模型的构建,以评估贷款申请人的违约风险;在医疗领域,决策树可以用于辅助医生进行疾病诊断,提高诊断的准确性和效率。

综上所述,决策树是一种强大而灵活的分类与回归方法,其实现逻辑涉及节点的分裂、最优属性的选择、树的构建以及剪枝等多个步骤。通过合理选择分裂属性和剪枝策略,可以构建出既准确又易于理解的决策树模型,为实际问题的解决提供有力支持。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 培训第十三天(DNS逆向解析与主从服务、ntp时间服务器)
  • 【接口自动化_08课_Pytest+Yaml+Allure框架】
  • 从统计学、到机器学习和ChatGPT
  • 数据结构第三讲:单链表的实现
  • GitLab添加TortoiseGIT生成SSH Key
  • Java 中如何执行命令行方法
  • 初识godot游戏引擎并安装
  • JAVA基础知识4(static、继承)
  • Spring中存储Bean的相关注解及用法
  • 【C++】类和对象之继承
  • 数组算法--二分查找
  • php 做一个mqtt按钮,发布触发信号
  • Unity UGUI 之 Input Field
  • 深入浅出WebRTC—Pacer
  • elementPuls 表格反选实现
  • 【译】JS基础算法脚本:字符串结尾
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • E-HPC支持多队列管理和自动伸缩
  • extjs4学习之配置
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • spark本地环境的搭建到运行第一个spark程序
  • SpiderData 2019年2月25日 DApp数据排行榜
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • underscore源码剖析之整体架构
  • 排序算法之--选择排序
  • 悄悄地说一个bug
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 手写一个CommonJS打包工具(一)
  • 数组大概知多少
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 正则与JS中的正则
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 仓管云——企业云erp功能有哪些?
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​低代码平台的核心价值与优势
  • #100天计划# 2013年9月29日
  • #nginx配置案例
  • #pragma pack(1)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)c52学习之旅-独立按键
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)Linux Shell编程——输入输出重定向
  • (转)关于多人操作数据的处理策略
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • **PHP分步表单提交思路(分页表单提交)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net打印*三角形