【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法

C4.5 是由 Ross Quinlan 提出的决策树算法,是对 ID3 算法的改进版本。它在 ID3 的基础上,解决了以下问题:

  1. 处理连续型数据:支持连续型特征,能够通过划分点将连续特征离散化。
  2. 处理缺失值:能够在特征值缺失的情况下继续构建决策树。
  3. 偏好多值特征的问题:采用信息增益比(Gain Ratio)替代信息增益,减少对多值特征的偏好。
  4. 生成剪枝后的树:通过后剪枝技术,降低过拟合风险。

1. 核心改进

(1) 信息增益比

C4.5 使用**信息增益比(Gain Ratio)**代替 ID3 的信息增益来选择最优特征。

  • 信息增益 IG(D, A):

IG(D, A) = H(D) - H(D|A)

  • 分裂信息 SI(A):

SI(A) = -\sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}

其中:

  • |D_v|/|D|:特征 AAA 的第 vvv 个取值的样本比例。

  • 信息增益比 GR(D, A):

GR(D, A) = \frac{IG(D, A)}{SI(A)}

分裂信息 SI(A) 是一种归一化因子,用于惩罚取值较多的特征,降低它们被优先选择的可能性。


(2) 连续型特征处理
  • 对连续特征,C4.5 会尝试在特征值的每个分割点(例如两个样本值之间的中点)进行划分。
  • 对每个划分点计算信息增益比,选择最佳划分点。

假设某连续特征 A 的值为 \{v_1, v_2, \dots, v_n\},排序后尝试以下划分点:

划分点 = \frac{v_i + v_{i+1}}{2}, \quad i = 1, 2, \dots, n-1


(3) 处理缺失值

对于缺失值,C4.5 使用以下策略:

  1. 在计算信息增益比时,只考虑特征值非缺失的样本。
  2. 当需要划分含有缺失值的样本时,将这些样本按概率分配到各个子节点。

(4) 剪枝
  • C4.5 采用**后剪枝(Post-Pruning)**技术,通过校验数据集评估剪枝后的树是否提高性能。
  • 剪枝的目标是降低过拟合风险,增强模型泛化能力。

2. C4.5 算法流程

  1. 输入:训练数据集 D、特征集 A。
  2. 递归构造树
    1. 计算当前数据集 D 的信息熵 H(D)。
    2. 对每个特征 A ∈ A:
      • 若 A 为离散特征,计算信息增益比。
      • 若 A 为连续特征,尝试每个划分点,计算信息增益比。
    3. 选择信息增益比最大的特征 A^*,作为当前节点的分裂特征。
    4. 根据 A^* 的取值(或划分点)划分数据集 D。
    5. 对每个子数据集递归构造子树。
  3. 剪枝
    • 基于校验集对生成的决策树进行剪枝,移除不显著的分支。
  4. 输出:剪枝后的决策树。

3. 示例

数据示例

假设有以下训练数据集:

天气温度湿度风力是否运动
晴天30
晴天32
阴天28
雨天24正常
雨天20正常

目标:构造决策树判断是否运动。

步骤
  1. 计算根节点的熵

    H(D) = -\frac{3}{5} \log_2 \frac{3}{5} - \frac{2}{5} \log_2 \frac{2}{5} \approx 0.971
  2. 对每个特征计算信息增益比

    • 天气(离散特征)

      • 计算天气的条件熵 H(D|\text{Weather})
      • 计算信息增益比 GR(D, \text{Weather})
    • 温度(连续特征)

      • 尝试划分点:272727、303030、333333。
      • 对每个划分点计算信息增益比,选择最佳划分点。
    • 湿度、风力

      • 按相同方法计算。
  3. 选择信息增益比最大的特征作为分裂特征,生成子节点。

  4. 对子节点递归分裂,直至满足停止条件(如样本类别纯度高或无特征可分)。

  5. 后剪枝

    • 对生成的树在校验集上进行性能评估,剪去对性能贡献较小的分支。

4. 算法特点

优点
  1. 支持离散和连续特征,适用范围更广。
  2. 减少对多值特征的偏好,提高选择的公平性。
  3. 能处理缺失值,增强算法的鲁棒性。
  4. 剪枝减少过拟合,提高泛化能力。
缺点
  1. 计算复杂度高,特别是连续特征的划分点尝试增加了计算量。
  2. 不支持大规模数据时的并行化。
  3. 剪枝过程可能需要额外的校验集。

5. 代码实现

以下是一个简单的 Python 实现,用于计算信息增益比并构造 C4.5 决策树:

import numpy as np

# 计算熵
def entropy(labels):
    total = len(labels)
    counts = {}
    for label in labels:
        counts[label] = counts.get(label, 0) + 1
    return -sum((count / total) * np.log2(count / total) for count in counts.values())

# 计算信息增益比
def information_gain_ratio(data, labels, feature_index):
    total_entropy = entropy(labels)
    feature_values = [row[feature_index] for row in data]
    unique_values = set(feature_values)
    split_info = 0
    conditional_entropy = 0
    for value in unique_values:
        subset = [labels[i] for i in range(len(data)) if data[i][feature_index] == value]
        proportion = len(subset) / len(data)
        conditional_entropy += proportion * entropy(subset)
        split_info -= proportion * np.log2(proportion)
    info_gain = total_entropy - conditional_entropy
    return info_gain / split_info if split_info != 0 else 0

# 示例数据
data = [
    ["晴天", 30, "高", "弱"],
    ["晴天", 32, "高", "强"],
    ["阴天", 28, "高", "弱"],
    ["雨天", 24, "正常", "弱"],
    ["雨天", 20, "正常", "强"]
]
labels = ["否", "否", "是", "是", "否"]

# 特征索引(天气、温度、湿度、风力)
for i in range(4):
    print(f"Feature {i}, Gain Ratio: {information_gain_ratio(data, labels, i):.4f}")

输出结果 

Feature 0, Gain Ratio: 0.3751
Feature 1, Gain Ratio: 0.4182
Feature 2, Gain Ratio: 0.0206
Feature 3, Gain Ratio: 0.4325

6. 总结

C4.5 是 ID3 的改进版本,针对实际问题的需求(连续特征、缺失值、多值特征偏好等)做了多项优化。尽管计算复杂度高,但其广泛用于分类问题,成为现代决策树算法的基础之一(如 CART)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring和SpringBoot的关系和区别?

大家好,我是锋哥。今天分享关于【Spring和SpringBoot的关系和区别?】面试题。希望对大家有帮助; Spring和SpringBoot的关系和区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring和Spring Boot是两种相关但有所…

Scrapy 中的配置笔记

概述 scrapy在命令启动之前,先设置好了各种配置文件。其中包括系统自带的默认配置文件,还有用户自定义的settings.py。其中还有一个日常开发中不怎么用的scrapy.cfg文件,这个文件是用来告诉scrapy用户自定义的settings.py文件在哪里的 关键…

代码随想录算法训练营day49|动态规划part11

最长公共子序列 这个与上篇笔记最大的不同就是子序列里的数可以不相邻,那么只需加入一个dp[i][j]的上和左的更新方向即可 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<…

Python知识分享第十九天-网络编程

网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…

CAN接口设计

CAN总线的拓扑结构 CAN总线的拓扑结构有点像485总线,都是差分的传输方式,总线上都可以支持多个设备,端接匹配电阻都是120Ω。 485和CAN通信方面最大的区别:网络特性。485是一主多从的通讯方式,CAN是多主通讯,多个设备都可以做主机。那多个设备都相要控制总线呢?…

Latex转word(docx)或者说PDF转word 一个相对靠谱的方式

0. 前言 投文章过程中总会有各种各样的要求&#xff0c;其中提供word格式的手稿往往是令我头疼的一件事。尤其在多公式的文章中&#xff0c;其中公式转换是一个头疼的地方&#xff0c;还有很多图表&#xff0c;格式等等&#xff0c;想想就让人头疼欲裂。实践中摸索出一条相对靠…

数据结构——单调队列

这篇博客我们来讨论一下单调队列的问题&#xff0c;其实和之前学的单调栈都是一种上通过改变操作来解决问题的一种数据结构 我们先来回忆一下单调栈的内容&#xff0c;这样方便将其和单调队列做区分 单调栈&#xff1a;(单调性从栈底到栈顶&#xff09; 1.单调栈是一种栈数据…

解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204

&#x1f6e0;️ 解决 Maven 部署中的 Artifact 覆盖问题&#xff1a;实战经验分享 &#x1f4cc; 引言 在软件开发过程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具&#xff0…

[go-redis]客户端的创建与配置说明

创建redis client 使用go-redis库进行创建redis客户端比较简单&#xff0c;只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…

Solving the Makefile Missing Separator Stop Error in VSCode

1. 打开 Makefile 并转换缩进 步骤 1: 在 VSCode 中打开 Makefile 打开 VSCode。使用文件浏览器或 Ctrl O&#xff08;在 Mac 上是 Cmd O&#xff09;打开你的 Makefile。 步骤 2: 打开命令面板 按 Ctrl Shift P&#xff08;在 Mac 上是 Cmd Shift P&#xff09;&…

交换机四大镜像(端口镜像、流镜像、VLAN镜像、MAC镜像)应用场景、配置实例及区别对比

在网络管理中&#xff0c;端口镜像、流镜像、VLAN镜像和MAC镜像都是用于监控和分析网络流量的重要技术。 端口镜像&#xff08;Port Mirroring&#xff09; 定义&#xff1a;端口镜像是将一个或多个源端口的流量复制到一个目标端口&#xff0c;以便于网络管理员能够监控和分析…

Unity数据持久化

二进制数据持久化的好处&#xff1a;安全、效率高、利于网络通信 文章目录 补充文件夹相关EditorResourcesSteammingAsset 序列化和反序列化序列化反序列化 二进制数据持久化转换为字节数据文件操作写入字节&#xff1a;读取字节安全关闭文件夹操作操作文件夹目录信息和文件信息…

【机器学习】机器学习的基本分类-监督学习-随机森林(Random Forest)

随机森林是一种基于集成学习&#xff08;Ensemble Learning&#xff09;思想的算法&#xff0c;由多个决策树构成。它通过结合多棵决策树的预测结果来提升模型的泛化能力和准确性&#xff0c;同时减少过拟合的风险。 1. 随机森林的核心思想 多样性&#xff1a; 随机森林通过引…

中国矿业大学《2024年868自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …

生产看板到底在看什么?

说起生产看板&#xff0c;可能很多人脑海里冒出来的画面是&#xff1a;车间里一块挂在墙上的大板子&#xff0c;上面贴满了各式各样的卡片、表格&#xff0c;甚至还有几个闪闪发光的指示灯。但是&#xff0c;无论是精益生产方式代表——丰田&#xff0c;还是当下以“智能制造”…

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…

第四届全国过程模拟与仿真大会召开,积鼎科技相伴大会6年成长

第四届全国过程模拟与仿真学术会议于2024年11月29日-12月2日在广州圆满召开。积鼎科技&#xff0c;作为自主流体仿真软件研发的领航企业&#xff0c;与大会相伴四年&#xff0c;自首届以来一直积极参与其中&#xff0c;见证了大会从初创到逐渐壮大的全过程。每一次参会&#xf…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程&#xff08;RDMA read and write with IB verbs&#xff09; &#xff08;本文讲解的示例代码在&#xff1a;RDMA read and write with IB verbs | The Geek in the Corner&#xff09; 将 RDMA 与verbs一起使用非常简单&#xff1a;首先注册内存块&#xff0c…

JAVAWeb之CSS学习

前引 CSS&#xff0c;层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有网页对象和模型样式编辑的能力&#xff0c;简单来说&#xff0c;美化页面。…