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

从决策树基础到熵与信息增益

在机器学习的分类任务中,决策树是最直观、最易理解的算法之一。它像一棵 “判断树”,通过层层分支的决策逻辑,将复杂的分类问题拆解为简单的是非判断。而支撑这棵 “树” 生长的核心,正是熵(Entropy)与信息增益(Information Gain)—— 前者衡量数据的 “混乱程度”,后者决定分支的 “最优方向”。今天,我们就结合 PPT 中的经典案例,从基础概念到实战计算,完整拆解决策树的核心原理。

一、决策树的基本结构:先搞懂 “树的语言”

在学习熵与信息增益前,我们需要先明确决策树的核心组成。以 PPT 中 “是否参加聚会” 的决策流程为例,一棵完整的决策树包含三类关键节点,它们的分工清晰且明确:

1. 根节点:决策的 “起点”

根节点是整个决策树的入口,也是第一个需要判断的核心问题。在 “是否参加聚会” 的案例中,“有没有聚会?” 就是根节点—— 它是所有后续决策的起点,没有父节点,直接开启整个判断流程。

2. 非叶子节点与分支:决策的 “中间站”

非叶子节点是决策的 “中间判断步骤”,它们会根据某个特征(如 “有没有作业要交”“是否懒惰在家”)产生分支。例如 PPT 中的 “有没有作业要交”“懒惰在家?”,就是典型的非叶子节点;而连接这些节点的 “= 是”“= 否”“= 紧急” 等判定条件,就是分支。
这些节点的作用是 “逐步缩小范围”:通过一次又一次的特征判断,将原本混乱的数据集拆分成更 “纯粹” 的子集,为最终的结果铺路。

3. 叶子节点:决策的 “终点”

叶子节点是决策的最终结果,也是分类任务的 “答案”。在案例中,“聚会”“去酒吧”“学习(紧急分支)”“看电视” 等结果,都属于叶子节点 —— 它们没有子节点,代表着一次决策的完整结束。
叶子节点的 “纯度” 是决策树的核心追求:叶子节点越纯粹(比如某个叶子节点下全是 “学习” 的结果),说明决策逻辑越精准,分类效果越好。

二、熵(Entropy):衡量数据 “混乱度” 的标尺

搞懂了决策树的结构,我们就要思考:如何判断一个节点的 “纯度”?如何知道哪个特征分支能让数据更 “有序”?这就需要引入 “熵” 的概念 —— 它是信息论中衡量随机变量不确定性(混乱度)的指标。

1. 熵的定义:混乱度越高,熵值越大

熵的公:
H(X)=−∑i=1n​pi​⋅log(pi​)

  • H(X):随机变量 X 的熵(混乱度);
  • n:随机变量 X 的类别数量(比如 “学习 / 休闲” 就是 2 类);
  • pi​:第 i 类在数据集中的占比(如 “学习” 天数占总天数的比例);
  • log:通常以 2 为底(信息论常用),也可用自然对数,核心逻辑一致。

核心规律

  • 当数据完全 “纯粹”(某一类占比 100%)时,熵 = 0(比如 10 天全是 “学习”,没有 “休闲”,不确定性为 0);
  • 当数据完全 “混乱”(各类占比均衡)时,熵最大(比如 10 天中 5 天 “学习”、5 天 “休闲”,熵 = 1,不确定性最高)。

2. 实战计算:以 14 天打球数据为例

PPT 中常以 “14 天是否打球” 的数据集讲解熵的计算,我们就以此为案例,一步步拆解计算过程:

步骤 1:统计类别数量

先逐行统计 14 天中 “打球(TRUE)” 和 “不打球(FALSE)” 的天数:

  • 打球(TRUE):6 天;
  • 不打球(FALSE):14-6=8 天。
步骤 2:计算各类别占比pi​

占比 = 类别数量 / 总数量(14 天),因此:

  • 打球占比p1​=6/14≈0.4286;
  • 不打球占比p2​=8/14≈0.5714。
步骤 3:代入公式计算熵

先计算每一项pi​⋅log2​(pi​),再求和取反:

  • 第一项:0.4286×log2​(0.4286)≈0.4286×(−1.222)≈−0.524;
  • 第二项:0.5714×log2​(0.5714)≈0.5714×(−0.792)≈−0.453;
  • 求和:−0.524+(−0.453)=−0.977;
  • 取反(公式中的负号):H(D)=−(−0.977)≈0.977。

最终,14 天打球数据的熵约为 0.977,说明数据存在一定的混乱度(既不是全打球,也不是全不打球),需要通过分支进一步降低不确定性。

三、信息增益(Information Gain):找到 “最优分支” 的关键

知道了如何衡量混乱度,接下来的问题是:面对多个特征(如 “是否有作业”“天气如何”),该选哪个特征作为分支依据?答案就是 “信息增益”—— 它衡量的是 “某个特征分支后,数据混乱度降低的程度”,信息增益越大,说明这个特征的 “分类能力越强”。

1. 信息增益的定义:混乱度的 “下降值”

信息增益的公式同样简洁,PPT 中明确为:
IG(D,a)=H(D)−H(D∣a)

  • IG(D,a):特征 a 对数据集 D 的信息增益;
  • H(D):数据集 D 的 “经验熵”(分支前的混乱度);
  • H(D∣a):数据集 D 按特征 a 分支后的 “条件熵”(分支后的平均混乱度)。

核心逻辑:信息增益 =“分支前的混乱度” - “分支后的平均混乱度”。差值越大,说明分支后数据的不确定性降低越多,这个特征就越适合作为当前节点的分支依据。

2. 实战计算:以 “是否有作业” 特征为例

我们继续用 “14 天打球数据”,假设新增 “是否有作业” 的特征,计算该特征的信息增益,判断它是否适合作为分支:

步骤 1:计算分支前的经验熵H(D)

根据前文计算,14 天打球数据的经验熵H(D)≈0.977(分支前的混乱度)。

步骤 2:按 “是否有作业” 分支,统计子集数据

将 14 天按 “有作业”“无作业” 拆分为两个子集D1​和D2​:

  • 子集D1​(有作业):共 4 天,其中 “学习(不打球)”3 天,“休闲(打球)”1 天;
  • 子集D2​(无作业):共 10 天,其中 “学习(不打球)”2 天,“休闲(打球)”8 天。
步骤 3:计算每个子集的熵H(D1​)和H(D2​)
  • 计算H(D1​)(有作业子集):
    p1​=3/4=0.75(不打球),p2​=1/4=0.25(打球);
    H(D1​)=−[0.75×log2​(0.75)+0.25×log2​(0.25)]≈−[0.75×(−0.415)+0.25×(−2)]≈0.811。

  • 计算H(D2​)(无作业子集):
    p1​=2/10=0.2(不打球),p2​=8/10=0.8(打球);
    H(D2​)=−[0.2×log2​(0.2)+0.8×log2​(0.8)]≈−[0.2×(−2.322)+0.8×(−0.322)]≈0.722。

步骤 4:计算条件熵H(D∣a)

条件熵是 “子集熵的加权平均”,权重为子集占总数据的比例:

  • D1​占比:4/14 ≈ 0.2857;
  • D2​占比:10/14 ≈ 0.7143;
  • H(D∣a)=0.2857×0.811+0.7143×0.722≈0.745。
步骤 5:计算信息增益IG(D,a)

代入公式:
IG(D,a)=H(D)−H(D∣a)≈0.977−0.745≈0.232。

这意味着,用 “是否有作业” 作为分支特征后,数据的混乱度降低了 0.232—— 如果后续还有 “天气”“是否有课” 等特征,我们只需重复上述步骤,选择信息增益最大的特征,就是当前节点的 “最优分支”。

四、决策树的核心逻辑:从 “混乱” 到 “有序” 的迭代

通过熵与信息增益的计算,我们终于能理解决策树的生长逻辑:

  1. 以 “根节点”(如 “是否打球”)为起点,计算所有候选特征的信息增益;
  2. 选择信息增益最大的特征作为当前节点的分支依据,将数据拆分为多个子集;
  3. 对每个子集重复步骤 1-2(递归),直到子集的熵为 0(完全纯粹)或没有新特征可分支;
  4. 最终形成的 “叶子节点”,就是分类任务的最终答案。

这种 “从混乱到有序” 的迭代过程,让决策树既具备清晰的可解释性(每一步分支都能对应实际业务逻辑),又能高效解决分类问题 —— 这也是它在金融风控、医疗诊断、用户分层等场景中广泛应用的核心原因。

http://www.xdnf.cn/news/18277.html

相关文章:

  • PYTHON让繁琐的工作自动化-函数
  • 【DL学习笔记】交叉熵损失函数详解
  • 人工智能包括哪些方面内容?
  • minio安装和配置
  • 大数据时代时序数据库选型指南:深度解析与 Apache IoTDB 实践
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例
  • MiniMax Agent 上线 Market Place ,AI一键复制克隆网站
  • 如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true
  • MySQL的锁:
  • Image and Video Tokenization with Binary Spherical Quantization 论文阅读
  • 【网络运维】Playbook项目实战:基于 Ansible Playbook 一键部署 LNMP 架构服务器
  • WPF---数据模版
  • 突破成长瓶颈:产品运营能力体系化提升技巧
  • CentOS 7更换国内镜像源
  • Golang context
  • 广州曼顿智能断路器:让用电更聪明,生活更安心!
  • 【案例分享】AI使用分享|如何运用 GPT完成小任务并提升效率 —— Prompt 与案例整理
  • P2404 自然数的拆分问题(典型的dfs)
  • 【运维进阶】实施任务控制
  • 【计算机网络面试】键入网址到网页显示期间,发生了什么?
  • MySQL定时任务详解 - Event Scheduler 事件调度器从基础到实战
  • 第三十九天(WebPack构建打包Mode映射DevTool源码泄漏识别还原)
  • 数据结构:二叉搜索树(Binary Search Tree)
  • Android Studio中创建Git分支
  • 高级堆结构
  • 编排之神-Kubernetes存储专题--ConfigMap演练
  • 网络编程3(网络层,数据链路层)
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • 从零开始:SpringBoot与KingbaseES的完美融合实践
  • JavaScript性能优化实战(三):DOM操作性能优化