一文详解决策树:ID3与C4.5算法 - 详解

news/2025/9/30 13:15:47/文章来源:https://www.cnblogs.com/lxjshuju/p/19120925

1. 决策树是什么?

想象一下,你要判断一个水果是苹果、橙子还是香蕉,你可能会通过一系列问题来推理:

  1. 它是红色的吗?

    • 如果是,摸起来光滑吗?

      • 光滑 -> 可能是苹果

      • 不光滑 -> 可能是橙子(但橙子不红?这里只是举例)

    • 如果不是,它是黄色的吗?

      • 是,且是长条状 -> 可能是香蕉

      • 不是 -> 其他水果

这个过程就是一个简单的决策树。在机器学习中,决策树是一种模拟人类这种决策过程的模型,它通过一系列“如果...那么...”的规则对数据进行分类或回归。

  • 结构:树形结构,包含三种节点:

    • 根节点:包含全部数据集的顶层节点。

    • 内部节点:代表一个特征或属性上的测试。

    • 叶节点:代表最终的决策结果(类别或数值)。

2. 决策树的核心:如何选择划分特征?

构建决策树的关键在于,每一步如何从众多特征中选择一个“最佳”特征来对数据进行划分。这个“最佳”的标准是不同的,也就引出了不同的算法。ID3和C4.5算法的核心区别就在于这个选择标准的不同。

在深入算法之前,必须先理解一个至关重要的概念:信息熵

2.1 信息熵

熵源于热力学,在信息论中由香农提出,用于度量系统的不确定性

  • 定义:对于一个数据集 DD,其类别标签有 CC 种。熵的计算公式为:\operatorname{Ent}(D) = -\sum_{k=1}^{C} p_{k} \log_{2} p_{k}

  • 其中 pk 是第 k 类样本在数据集 D 中所占的比例。

  • 如何理解?

    • 熵值越高,不确定性越大。例如,一个袋子里的球红蓝各一半,你随机抽一个,猜中颜色的不确定性最高,此时熵为 -(0.5 \times \log_{2} 0.5 + 0.5 \times \log_{2} 0.5) = 1

    • 熵值越低,纯度越高。例如,袋子里全是红球,你抽一个肯定是红色,不确定性为0,此时熵为-(1 \times \log_{2} 1) = 0

我们的目标就是通过选择特征进行划分,使得划分后子集的纯度越来越高,即熵值越来越低

2.2 信息增益 - ID3算法的准则

信息增益直接衡量了使用某个特征 aa 进行划分后,数据集不确定性减少的程度。

  • 定义

    \text{Gain}(D, a) = \text{Ent}(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} \cdot \text{Ent}(D^v)

    其中:

    • D 是父节点的数据集。

    • V 是特征 aa 的取值个数(例如,“颜色”有红、黄、蓝3种取值)。

    • D^v 是 D 中在特征 a 上取值为 v 的样本子集。

    • \frac{|D^v|}{|D|} 是该子集的权重。

  • 核心思想:选择那个能带来最大信息增益的特征作为划分标准。因为增益越大,意味着不确定性降低得越多。

ID3算法的局限性
信息增益虽然直观,但存在一个明显缺陷:它倾向于选择取值数目较多的特征

  • 极端例子:如果将“样本ID”作为一个特征,那么每个ID都会划分出一个唯一的子集,这些子集的纯度极高(熵为0),这将导致信息增益最大。但用“ID”来分类是毫无意义的,因为它没有任何泛化能力,导致了过拟合

2.3 信息增益率 - C4.5算法的改进

为了克服信息增益的偏向性,C4.5算法引入了信息增益率

  • 定义

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

    其中 IV(a) 是特征 a 的固有值,其计算公式为:

    \text{IV}(a) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|} \cdot \log_2\left( \frac{|D_v|}{|D|} \right)
  • **如何理解 IV(a) **:

    • 仔细观察,IV(a) 的公式其实就是数据集 D 在特征 a 上的熵。

    • 特征 a 的取值越多,V 越大,其本身的熵 IV(a) 通常也越大。

    • 信息增益率 = 信息增益 / 特征本身的熵。这相当于对取值多的特征进行了“惩罚”。当一个特征的取值非常多时(如“ID”),其 IV(a) 会非常大,从而使得增益率变得很小,避免了被选为划分特征。

C4.5的具体操作
C4.5并非直接选择增益率最大的特征,而是先找出信息增益高于平均水平的特征,然后再从这些特征中选择信息增益率最高的那个。这是一种启发式方法,在避免偏向性和保留有效信息之间取得平衡。

3. 算法流程与对比
ID3算法流程
  1. 从根节点开始,计算当前数据集中所有特征的信息增益。

  2. 选择信息增益最大的特征作为当前节点的划分特征。

  3. 根据该特征的每个取值,建立分支,并将数据集划分到对应的子节点中。

  4. 对每个子节点递归地重复步骤1-3,直到满足终止条件(如:所有样本属于同一类别、没有剩余特征可用、或节点样本数过少)。

    算法:ID3(数据集 D, 特征集 A)
    输入:训练数据集 D,特征集合 A
    输出:决策树 T
    1. 创建节点 node
    2. IF D 中所有样本属于同一类别 C THEN
    3.     将 node 标记为 C 类叶节点
    4.     RETURN node
    5. END IF
    6. IF A = ∅ OR D 中样本在 A 上取值相同 THEN
    7.     将 node 标记为 D 中样本数最多的类叶节点
    8.     RETURN node
    9. END IF
    10. // 选择最优划分特征
    11. FOR EACH 特征 a ∈ A DO
    12.     计算信息增益 Gain(D, a)
    13. END FOR
    14. 选择信息增益最大的特征 a_best = argmaxₐ(Gain(D, a))
    15. // 以 a_best 创建分支
    16. FOR EACH a_best 的取值 v DO
    17.     为 node 生成一个分支,令 D_v 表示 D 中在 a_best 上取值为 v 的子集
    18.     IF D_v = ∅ THEN
    19.         将分支节点标记为 D 中样本最多的类叶节点
    20.     ELSE
    21.         以 ID3(D_v, A \ {a_best}) 为分支节点 // 递归调用,移除已用特征
    22.     END IF
    23. END FOR
    24. RETURN 以 node 为根的决策树
C4.5算法流程

C4.5的流程与ID3完全一致,唯一的区别在于第2步:
2. 选择信息增益率最大(采用先筛选后选择的方法)的特征作为当前节点的划分特征。

4. C4.5的其他重要改进

除了用信息增益率替代信息增益,C4.5还针对ID3的其他不足进行了重要改进:

  1. 处理连续特征

    • ID3只能处理离散型特征。

    • C4.5通过二分法处理连续特征。它会将连续特征的所有取值排序,然后尝试所有可能的分割点(如相邻取值的中间值),计算以每个分割点划分数据后的信息增益率,并选择最佳分割点。这样,连续特征就被离散化了。

  2. 处理缺失值

    • ID3无法处理有缺失值的数据。

    • C4.5允许数据中存在缺失值。在计算信息增益(率)时,它只使用该特征上没有缺失的样本。同时,在划分样本时,会将有缺失值的样本同时划分到所有子节点,并赋予不同的权重(例如,根据各子节点样本数量的比例)。在预测时,也会类似地处理。

  3. 剪枝

    • ID3没有剪枝步骤,容易过拟合。

    • C4.5引入了悲观剪枝,在树构建完成后,自底向上地评估子树是否可以被叶节点替代,以避免过拟合,提升模型的泛化能力。

      算法:C4.5(数据集 D, 特征集 A)
      输入:训练数据集 D,特征集合 A
      输出:决策树 T
      1. 创建节点 node
      2. IF D 中所有样本属于同一类别 C THEN
      3.     将 node 标记为 C 类叶节点
      4.     RETURN node
      5. END IF
      6. IF A = ∅ OR D 中样本在 A 上取值相同 THEN
      7.     将 node 标记为 D 中样本数最多的类叶节点
      8.     RETURN node
      9. END IF
      10. // 选择最优划分特征
      11. 初始化候选特征集合 candidate_features = ∅
      12. 初始化 avg_gain = 0
      13.
      14. // 步骤1:计算所有特征的信息增益,并找出平均信息增益
      15. FOR EACH 特征 a ∈ A DO
      16.     gain[a] = Gain(D, a)
      17.     avg_gain = avg_gain + gain[a]
      18. END FOR
      19. avg_gain = avg_gain / |A|
      20.
      21. // 步骤2:筛选信息增益高于平均值的特征
      22. FOR EACH 特征 a ∈ A DO
      23.     IF gain[a] ≥ avg_gain THEN
      24.         将 a 加入 candidate_features
      25.     END IF
      26. END FOR
      27.
      28. // 步骤3:从候选特征中选择信息增益率最大的
      29. FOR EACH 特征 a ∈ candidate_features DO
      30.     计算固有值 IV(a) = -Σ(|Dᵥ|/|D| * log₂(|Dᵥ|/|D|))
      31.     计算信息增益率 Gain_ratio(D, a) = gain[a] / IV(a)
      32. END FOR
      33. 选择信息增益率最大的特征 a_best = argmaxₐ(Gain_ratio(D, a))
      34. // 处理连续特征(如果是连续特征)
      35. IF a_best 是连续特征 THEN
      36.     找到最佳分割点 split_point
      37.     将 D 划分为 D_left (a_best ≤ split_point) 和 D_right (a_best > split_point)
      38.     // 为两个子集递归构建子树
      39. ELSE
      40.     // 离散特征:按取值创建分支
      41.     FOR EACH a_best 的取值 v DO
      42.         为 node 生成一个分支,令 D_v 表示 D 中在 a_best 上取值为 v 的子集
      43.         IF D_v = ∅ THEN
      44.             将分支节点标记为 D 中样本最多的类叶节点
      45.         ELSE
      46.             以 C4.5(D_v, A \ {a_best}) 为分支节点
      47.         END IF
      48.     END FOR
      49. END IF
      50. RETURN 以 node 为根的决策树

5. 总结与对比
特性ID3算法C4.5算法
划分准则信息增益信息增益率
对多值特征的偏向,倾向于选择取值多的特征克服了此偏向
处理连续特征不支持支持,通过二分法
处理缺失值不支持支持
剪枝,悲观剪枝
核心贡献奠定了用信息论构建决策树的基础是ID3的全面升级版,更实用、更强大
6. 结语

ID3和C4.5是决策树发展史上里程碑式的算法。ID3提出了利用信息熵来量化决策过程的思想,而C4.5则在继承这一思想的基础上,通过引入信息增益率、支持连续值和缺失值处理以及剪枝技术,极大地完善了决策树模型,使其成为一个真正强大且实用的机器学习工具。

尽管如今像CART(Classification and Regression Trees)和集成学习(如随机森林、XGBoost)更为流行,但理解ID3和C4.5是深入理解决策树家族乃至整个树模型世界的坚实基础。

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

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

相关文章

玳瑁的嵌入式日记---0928(ARM--I2C) - 教程

玳瑁的嵌入式日记---0928(ARM--I2C) - 教程2025-09-30 13:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

三更app下载网站铺铺旺网站做多久了

设备坐标通俗的讲就是我们看到的我们的视图坐标,它包含屏幕坐标、窗体坐标和客户区坐标,他们都是以窗体的左上角为准的坐标,并且是从左到右,从上到下的坐标 简单总结一下他的特点:x坐标是从左到右,y坐标是从…

关于处理大批量数据下载和查询时,怎么进行限流和熔断处理(AI)

摘要:限流和熔断是保障大批量数据场景下系统稳定的关键策略。限流通过固定窗口、滑动窗口、漏桶/令牌桶等算法控制请求速率,防止系统过载,需结合分布式实现(如Redis)和动态调整策略。熔断则通过状态机(关闭/打开…

docker服务器运维

使用docker的目的:避免python环境被污染,也避免本项目的包版本影响其他服务。起到隔离的作用。以python docker为例目录结构:your—project/    |---- app/        |---- main.py        |----…

详细介绍:Java数据结构第二十七期:布隆过滤器,用 “模糊” 换高效的查重黑科技

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Nginx 反向代理与负载均衡核心内容总结 - 实践

Nginx 反向代理与负载均衡核心内容总结 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

没有网站的域名佛山网站搜索排名

Servlet是运行在Web服务器或应用服务器上的java程序,它是一个中间层,负责连接来自web浏览器或其他HTTP客户程序和[HTTP服务器]上应用程序 Servlet执行下面的任务: 1)读取客户发送的显示数据。 2)读取由浏览器发送的隐式请求数据。…

自己注册了个域名想做一个网站网站建设属于服务还是货物

模块简介: requests 库是一个 python中比较有名的 http请求的库,能处理 get,post,put,delete 等 restful请求,能设置 header,cookie,session 等操作,也是作为爬虫的基础库,它目前还不能异步请求,如果要支持…

海口 做网站百度搜一下

一、GoLand显示环境如下 修改环境变量 新建系统变量 GOROOT: D:\ENSPACE\golandsdk\1.23.1\go1.23.1新建系统变量 GOPATH:工作目录(在下面目录下新建目录:src,项目工程目录都要建在src下如:demo1 demo2) D…

这款免费Windows优化神器!只有5M电脑绿色工具!ZyperWin++下载安装教程

软件介绍 今天给大家安利一款我最近发现的宝藏软件,ZyperWinOptimize(ZyperWin++)是一款开源的 Windows 优化工具,基于 .NET + SunnyUI 的开源、轻量级 Windows 系统优化工具,适用于 Windows 7 至 Windows 11 系统…

完整教程:Clustering|聚类

完整教程:Clustering|聚类pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

网站制作可以询价么找建筑类工作哪个网站好

感受好久没写中文技术文章了。说实话,学东西都是基于英文,或者 别人从英文翻译成中文 咱们再捡二手货学习。因此用中文写技术文章怎么都感受是在骗人,怎么都以为很别扭。编程可是这一次的主角是百度。框架虽然认真来说,全部编程语…

深入解析:DAY 04 CSS文本,字体属性以及选择器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

原核蛋白表达与真核蛋白表达的差异选择

原核蛋白表达与真核蛋白表达的差异选择 重组蛋白表达是现代分子生物学、结构生物学和生物制药研究中的核心技术。不同蛋白(尤其是真核来源的蛋白)在异源表达时可能面临折叠、修饰、毒性、可溶性、活性保持等挑战。常…

网站开发找哪家好产品做网站推广

题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全部元素的和可以被3整除,问有多少种方法构建出该数组。答案模1000000007 例 输…

企业网站应该找谁做seo排名教程技术

1、位存储 只有0和1两种状态! Bitmap 位图:数据结构,都是操作二进制位来进行记录 登录/未登录 活跃/不活跃 打卡 两个状态的都可以使用Bitmap! 2、常用命令 2.1、用Bitmap来记录 周一到周日的登陆情况 127.0.0.1:6379> …

【MacOS】彻底卸载Navicat

sudo rm -Rf /Applications/Navicat\ Premium.appsudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlistsudo rm -Rf ~/Library/Caches/com.apple.hel…

SpringAI 实战:解除 Netty 超时难题,优化 OpenAiApi 配置

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

泛型类型参数

泛型类型参数在Java泛型中,"T" 是一个类型参数的占位符,代表"Type"。它是一个约定俗成的命名方式:T:Type(类型)E:Element(元素)K:Key(键)V:Value(值)N:Number(数字)

哪些网站可以做一些任务挣钱网站前台做哪些工作

动态路由协议/静态路由协议 静态路由协议和动态路由协议的区别: 静态路由协议的缺点: 配置繁琐 针对拓扑的变化不能够自动收敛 只适用于小型网络 静态路由协议优点: 占用资源少 安全 稳定 动态路由协议的优点: 配置简单 针对拓…