深入解析ID3算法:信息熵驱动的决策树构建基石

本文来自「大千AI助手」技术实战系列,专注用真话讲技术,拒绝过度包装。

ID3(Iterative Dichotomiser 3) 是机器学习史上的里程碑算法,由Ross Quinlan于1986年提出。它首次将信息论引入决策树构建,奠定了现代决策树的理论基础。本文将深入剖析其数学本质与实现细节。


往期文章推荐:

  • 20.用Mermaid代码画ER图:AI时代的数据建模利器
  • 19.ER图:数据库设计的可视化语言 - 搞懂数据关系的基石
  • 18.决策树:被低估的规则引擎,80%可解释性需求的首选方案
  • 17.实战指南:用DataHub管理Hive元数据
  • 16.一键规范代码:pre-commit自动化检查工具实战指南
  • 15.如何数据的永久保存?将信息以加密电磁波形式发射至太空实现永久保存的可行性说明
  • 14.NLP已死?大模型时代谁在悄悄重建「语言巴别塔」
  • 13.撕掉时序图复杂度:Mermaid可视化极简实战指南
  • 12.动手实践:LangChain流图可视化全解析
  • 11.LangChain LCEL:三行代码构建AI工作流的秘密
  • 10.LangChain执行引擎揭秘:RunnableConfig配置全解析
  • 9.避坑指南:Windows下pygraphviz安装全攻略
  • 8.Python3安装MySQL-python踩坑实录:从报错到完美解决的实战指南
  • 7.Git可视化革命:3分钟学会用Mermaid+AI画专业分支图
  • 6.vscode常用快捷命令和插件
  • 5.AI制图新纪元:3分钟用Mermaid画出专业类图
  • 4.3分钟搞定数据可视化:Mermaid饼图终极指南
  • 3.5分钟玩转Swagger UI:Docker部署+静态化实战
  • 2.记录下blog的成长过程
  • 1.再说一说LangChain Runnable接口

一、核心思想:用信息增益量化特征价值

核心问题:如何选择最优划分特征?
ID3的答案:选择能使信息增益最大化的特征

信息熵(Entropy):混乱度的度量

定义系统 S S S中样本类别的混乱程度:
E n t r o p y ( S ) = − ∑ i = 1 c p i log ⁡ 2 p i Entropy(S) = -\sum_{i=1}^{c} p_i \log_2 p_i Entropy(S)=i=1cpilog2pi

  • c c c:类别总数(如二分类时c=2)
  • p i p_i pi:类别 i i i S S S中的比例

熵值解读

  • 熵=0:所有样本属于同一类(完全纯净)
  • 熵=1(二分类时):两类样本各占50%(最混乱)

示例:硬币正反面概率均为0.5时, E n t r o p y = − ( 0.5 log ⁡ 2 0.5 + 0.5 log ⁡ 2 0.5 ) = 1 Entropy = - (0.5\log_20.5 + 0.5\log_20.5) = 1 Entropy=(0.5log20.5+0.5log20.5)=1

信息增益(Information Gain)

定义特征 A A A对数据集 S S S的划分效果:
G a i n ( S , A ) = E n t r o p y ( S ) − ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ E n t r o p y ( S v ) Gain(S, A) = Entropy(S) - \sum_{v \in Values(A)} \frac{|S_v|}{|S|} Entropy(S_v) Gain(S,A)=Entropy(S)vValues(A)SSvEntropy(Sv)

  • V a l u e s ( A ) Values(A) Values(A):特征 A A A的取值集合(如“天气”的特征值={晴,雨,阴})
  • S v S_v Sv A A A取值为 v v v的子集

决策规则:选择使 G a i n ( S , A ) Gain(S, A) Gain(S,A)最大的特征作为当前节点


二、算法运作机制:步步拆解

输入与输出
  • 输入:离散型特征数据集(ID3不支持连续特征)
  • 输出:一棵多叉决策树(每个分支对应特征的一个取值)
递归构建流程
def ID3(S, features):if 所有样本属于同一类别C:return 叶节点(类别C)if 特征集为空:return 叶节点(S中最多的类别)# 核心步骤:计算每个特征的信息增益best_feature = argmax_{A ∈ features} [Gain(S, A)]创建节点Node(标注best_feature)# 遍历最佳特征的每个取值for value in values(best_feature):Sv = S中best_feature=value的子集if Sv为空:添加叶节点(标注S中最多的类别)else:子节点 = ID3(Sv, features - {best_feature})  # 递归调用Node添加分支(value → 子节点)return Node

三、实例推演:天气预报数据集

天气温度湿度风力是否打球
正常
步骤1:计算根节点熵值
  • 总样本数:5
  • 打球(是):3,不打球(否):2
  • E n t r o p y ( S ) = − ( 3 5 log ⁡ 2 3 5 + 2 5 log ⁡ 2 2 5 ) ≈ 0.971 Entropy(S) = -(\frac{3}{5}\log_2\frac{3}{5} + \frac{2}{5}\log_2\frac{2}{5}) ≈ 0.971 Entropy(S)=(53log253+52log252)0.971
步骤2:计算各特征信息增益

以“天气”为例

  • 晴:2个样本 → 全部“否” → E n t r o p y ( S 晴 ) = 0 Entropy(S_{晴}) = 0 Entropy(S)=0
  • 阴:1个样本 → 全部“是” → E n t r o p y ( S 阴 ) = 0 Entropy(S_{阴}) = 0 Entropy(S)=0
  • 雨:2个样本 → 全部“是” → E n t r o p y ( S 雨 ) = 0 Entropy(S_{雨}) = 0 Entropy(S)=0
  • G a i n ( S , 天气 ) = 0.971 − [ 2 5 × 0 + 1 5 × 0 + 2 5 × 0 ] = 0.971 Gain(S, 天气) = 0.971 - [\frac{2}{5}×0 + \frac{1}{5}×0 + \frac{2}{5}×0] = 0.971 Gain(S,天气)=0.971[52×0+51×0+52×0]=0.971

同理计算其他特征:

  • G a i n ( S , 温度 ) ≈ 0.571 Gain(S, 温度) ≈ 0.571 Gain(S,温度)0.571
  • G a i n ( S , 湿度 ) ≈ 0.971 Gain(S, 湿度) ≈ 0.971 Gain(S,湿度)0.971
  • G a i n ( S , 风力 ) ≈ 0.020 Gain(S, 风力) ≈ 0.020 Gain(S,风力)0.020

选择“天气”或“湿度”作为根节点(增益均为0.971)


四、ID3的局限性:算法缺陷深度分析

  1. 多值特征偏好问题

    • 极端案例:若用“ID编号”作为特征
    • 每个样本独占一个分支 → E n t r o p y ( S v ) = 0 Entropy(S_v)=0 Entropy(Sv)=0
    • G a i n ( S , I D ) = E n t r o p y ( S ) Gain(S, ID)=Entropy(S) Gain(S,ID)=Entropy(S)(增益最大)
      → 导致毫无泛化能力的过拟合树
  2. 连续特征处理缺失
    无法直接处理如“温度=25°C”的连续值,需先离散化

  3. 缺失值敏感
    未定义特征缺失时的处理机制

  4. 剪枝功能缺失
    原始ID3不提供防止过拟合的剪枝策略

重要结论:这些缺陷直接催生了改进算法C4.5(引入信息增益率和剪枝)


五、Python实现核心代码

import numpy as np
from collections import Counterdef entropy(y):"""计算信息熵"""hist = np.bincount(y)ps = hist / len(y)return -np.sum([p * np.log2(p) for p in ps if p > 0])def information_gain(X, y, feature_idx):"""计算指定特征的信息增益"""parent_entropy = entropy(y)# 按特征取值划分数据集unique_vals = np.unique(X[:, feature_idx])child_entropy = 0for val in unique_vals:mask = X[:, feature_idx] == valchild_y = y[mask]weight = len(child_y) / len(y)child_entropy += weight * entropy(child_y)return parent_entropy - child_entropyclass ID3Node:def __init__(self, feature=None, children=None, label=None):self.feature = feature    # 划分特征索引self.children = children  # 字典:{特征值: 子节点}self.label = label        # 叶节点的类别标签def id3(X, y, features):# 终止条件1:所有样本同类别if len(np.unique(y)) == 1:return ID3Node(label=y[0])# 终止条件2:无可用特征if len(features) == 0:majority_label = Counter(y).most_common(1)[0][0]return ID3Node(label=majority_label)# 选择最佳划分特征gains = [information_gain(X, y, feat) for feat in features]best_idx = np.argmax(gains)best_feat = features[best_idx]# 创建新节点node = ID3Node(feature=best_feat, children={})# 递归构建子树remaining_feats = [f for f in features if f != best_feat]for val in np.unique(X[:, best_feat]):mask = X[:, best_feat] == valX_sub, y_sub = X[mask], y[mask]if len(X_sub) == 0:  # 子集为空majority_label = Counter(y).most_common(1)[0][0]node.children[val] = ID3Node(label=majority_label)else:node.children[val] = id3(X_sub, y_sub, remaining_feats)return node

六、历史意义与现代应用

划时代贡献

  1. 首次将信息论引入机器学习特征选择
  2. 奠定决策树递归分割的框架范式
  3. 启发后续C4.5/CART等里程碑算法

现代应用场景

  • 医学诊断系统(症状→疾病路径清晰可解释)
  • 金融反欺诈规则提取(符合监管透明度要求)
  • 工业故障树分析(物理意义明确的决策逻辑)

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

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

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

相关文章

Java解析audio时长

前提需要电脑上先安装后ffmpeg public long parseDuration(String audioPath) {long durationMs -1;try {Process process Runtime.getRuntime().exec("ffprobe " audioPath);// InputStream is process.getInputStream();InputStream is process.getErrorStrea…

python学智能算法(十五)|机器学习朴素贝叶斯方法进阶-CountVectorizer多文本处理

【1】引言 前序学习进程中,已经学习CountVectorizer文本处理的简单技巧,先相关文章链接为: python学智能算法(十四)|机器学习朴素贝叶斯方法进阶-CountVectorizer文本处理简单测试-CSDN博客 此次继续深入&#xff0…

AiPy 监控视频智能监察:人像一键抽取+可反复执行程序落地

兄弟们,不知道你们有没有过查监控的经历,虽然现在监控摄像头是越来越多,硬盘越塞越满,但真出了事儿,回放查录像堪比大海捞针!纯人工一帧帧的去找,能把眼睛盯瞎还是人影都找不到。不过我最近搞了…

期货反向跟单-终止盘手合作原则(二)

在期货反向跟单的领域中,数据就是实打实的真金白银,是策略能否持续盈利的核心价值所在。然而,许多团队在实际运营过程中,都遭遇了相似的困境:期初策略运转良好,可随着时间推移,数据表现却每况愈…

【Unity】MiniGame编辑器小游戏(三)马赛克【Mosaic】

更新日期:2025年6月17日。 项目源码:后续章节发布 索引 马赛克【Mosaic】一、游戏最终效果二、玩法简介三、正式开始1.定义游戏窗口类2.规划游戏窗口、视口区域3.地图方块阵列①.定义方块结构体②.生成方块阵列③.计算九宫格黑色方块数量④.排除任意九宫…

基于深度学习的智能图像质量评估系统:技术与实践

前言 在数字图像处理和计算机视觉领域,图像质量评估(Image Quality Assessment, IQA)是一个重要的研究方向。图像质量评估的目标是通过算法自动评估图像的质量,包括清晰度、对比度、噪声水平等。传统的图像质量评估方法主要依赖于…

【Golang面试题】Go语言实现请求频率限制

Go语言实现请求频率限制:从计数器到令牌桶的完整指南 在实际开发中,接口被恶意刷请求是常见问题。本文将深入探讨Go语言中四种主流的请求限流方案,从简单到复杂逐步深入,助你构建高可用服务。 一、基础方案:计数器法…

11Labs 增长负责人分享:企业级市场将从消费级或开发者切入丨Voice Agent 学习笔记

本文摘自 Founder Park AI 产品如何做增长,ElevenLabs的案例很值得学习。 专注于 AI 语音生成的独角兽企业 ElevenLabs 可以说一直在高速增长。在今年 1 月完成 1.8 亿美元 C 轮融资后,ElevenLabs 的估值突破 30 亿,直指 33 亿美元。2024 年…

Linux 命令:grep

概述 在Linux系统里,grep是一款十分实用的命令行工具,它主要用于在文件或者输入流中搜索符合特定模式的文本。下面为你详细介绍它的用法。资料已经分类整理好:https://pan.quark.cn/s/26d73f7dd8a7 基本语法 grep [选项] 搜索模式 [文件..…

Java八股文——MySQL「架构篇」

MySQL主从复制了解吗 面试官您好,我了解MySQL的主从复制。它是构建高可用、高可扩展数据库架构的核心基石。 1. 主从复制的核心原理与流程 整个主从复制的过程,就是一场围绕 binlog(二进制日志) 的“接力赛”。这个过程主要可以…

ubuntu下python版本升级导致pyqt不能正常运行解决

最终解决方案 ubuntu下多python版本pyqt兼容性问题解决 python3.9 -m pip install --upgrade --force-reinstall --prefer-binary pyqt5)尝试解决方案一(失败) 系统默认python版本可以,其他版本不行 sudo apt install pyqt5-dev-tools尝试解决方案二(失败) 一直…

AIGC工具平台-VideoRetalking音频对口型数字人

唇形合成技术正逐渐成为AIGC内容生产领域的重要工具,能够实现音视频数据的高度融合。基于VideoRetalking模块的可视化界面降低了技术门槛,使非技术背景的用户也能便捷体验唇形驱动数字人合成的流程。 本文重点解析该模块的使用方式及开发流程&#xff0…

前端项目如何部署为https

如何为项目部署设置HTTPS 设置HTTPS是保护网站数据传输安全的重要步骤。以下是设置HTTPS的主要方法: 1. 获取SSL/TLS证书 免费证书选项 Let’s Encrypt:最流行的免费证书颁发机构Cloudflare:提供免费SSL和CDN服务ZeroSSL:另一…

nginx 配置 系统升级页面

默认80端口配置如下: server {listen 80; # 指定端口号server_name 192.168.2.96; # 替换为实际域名或IP# 全局重定向到升级页面(排除自身防循环)if ($request_uri !~* "/upgrade.html") {return 307 /upgrade.html; # 临时重定…

计算机基础(一)——设计模式

一、设计模式 设计模式(Design Patterns)是软件开发中反复出现问题的解决方案的通用描述。 它是经过总结、提炼的高效代码结构和设计方案,帮助开发者写出更灵活、可维护和可扩展的代码。 优点注意点规范代码结构,提高开发效率设…

Mac电脑 磁盘检测和监控工具 DriveDx

DriveDx Mac 一款不监视驱动器的内置S.M.A.R.T.状态的先进驱动器运行状况诊断和监测工具。 还分析了所有驱动器健康密切相关的指标, SSD或硬盘驱动器故障(像SSD磨损 /耐久性,坏扇区重新分配,离线坏道,未定扇形区&…

频繁操作Json嵌套数据PostgreSQL配合JSON操作工具类+sql

文章目录 1.工具类2.依赖3.sql 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 背景:因为频繁操作json嵌套数据 PostgreSQL得…

京东云 centos vim有操作混乱的问题

centos云服务器 安装micro编辑器可以解决 yum install micro

限流系列之二:TDMQ CKafka 版限流方案详解及最佳实践

导语 在当今大数据和实时通信的时代,消息队列在分布式系统中扮演着至关重要的角色。CKafka 作为一种高性能、高可靠的消息中间件,被广泛应用于各种业务场景中。然而,随着业务的增长和数据流量的增加,CKafka 在生产者和消费者以极…

消息队列的基本概念

文章目录 为什么需要消息队列?🤔🎯 核心价值📋 使用场景 🏗️ 架构层面的基本概念整体架构图📦 核心组件详解1. Broker(消息代理)2. Topic(主题)3. Partition…