【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法
C4.5 是由 Ross Quinlan 提出的决策树算法,是对 ID3 算法的改进版本。它在 ID3 的基础上,解决了以下问题:
- 处理连续型数据:支持连续型特征,能够通过划分点将连续特征离散化。
- 处理缺失值:能够在特征值缺失的情况下继续构建决策树。
- 偏好多值特征的问题:采用信息增益比(Gain Ratio)替代信息增益,减少对多值特征的偏好。
- 生成剪枝后的树:通过后剪枝技术,降低过拟合风险。
1. 核心改进
(1) 信息增益比
C4.5 使用**信息增益比(Gain Ratio)**代替 ID3 的信息增益来选择最优特征。
- 信息增益 IG(D, A):
- 分裂信息 SI(A):
其中:
-
:特征 AAA 的第 vvv 个取值的样本比例。
-
信息增益比 GR(D, A):
分裂信息 SI(A) 是一种归一化因子,用于惩罚取值较多的特征,降低它们被优先选择的可能性。
(2) 连续型特征处理
- 对连续特征,C4.5 会尝试在特征值的每个分割点(例如两个样本值之间的中点)进行划分。
- 对每个划分点计算信息增益比,选择最佳划分点。
假设某连续特征 A 的值为 ,排序后尝试以下划分点:
划分点
(3) 处理缺失值
对于缺失值,C4.5 使用以下策略:
- 在计算信息增益比时,只考虑特征值非缺失的样本。
- 当需要划分含有缺失值的样本时,将这些样本按概率分配到各个子节点。
(4) 剪枝
- C4.5 采用**后剪枝(Post-Pruning)**技术,通过校验数据集评估剪枝后的树是否提高性能。
- 剪枝的目标是降低过拟合风险,增强模型泛化能力。
2. C4.5 算法流程
- 输入:训练数据集 D、特征集 A。
- 递归构造树:
- 计算当前数据集 D 的信息熵 H(D)。
- 对每个特征 A ∈ A:
- 若 A 为离散特征,计算信息增益比。
- 若 A 为连续特征,尝试每个划分点,计算信息增益比。
- 选择信息增益比最大的特征
,作为当前节点的分裂特征。
- 根据
的取值(或划分点)划分数据集 D。
- 对每个子数据集递归构造子树。
- 剪枝:
- 基于校验集对生成的决策树进行剪枝,移除不显著的分支。
- 输出:剪枝后的决策树。
3. 示例
数据示例
假设有以下训练数据集:
| 天气 | 温度 | 湿度 | 风力 | 是否运动 |
|---|---|---|---|---|
| 晴天 | 30 | 高 | 弱 | 否 |
| 晴天 | 32 | 高 | 强 | 否 |
| 阴天 | 28 | 高 | 弱 | 是 |
| 雨天 | 24 | 正常 | 弱 | 是 |
| 雨天 | 20 | 正常 | 强 | 否 |
目标:构造决策树判断是否运动。
步骤
-
计算根节点的熵:
-
对每个特征计算信息增益比:
-
天气(离散特征):
- 计算天气的条件熵
。
- 计算信息增益比
。
- 计算天气的条件熵
-
温度(连续特征):
- 尝试划分点:272727、303030、333333。
- 对每个划分点计算信息增益比,选择最佳划分点。
-
湿度、风力:
- 按相同方法计算。
-
-
选择信息增益比最大的特征作为分裂特征,生成子节点。
-
对子节点递归分裂,直至满足停止条件(如样本类别纯度高或无特征可分)。
-
后剪枝:
- 对生成的树在校验集上进行性能评估,剪去对性能贡献较小的分支。
4. 算法特点
优点
- 支持离散和连续特征,适用范围更广。
- 减少对多值特征的偏好,提高选择的公平性。
- 能处理缺失值,增强算法的鲁棒性。
- 剪枝减少过拟合,提高泛化能力。
缺点
- 计算复杂度高,特别是连续特征的划分点尝试增加了计算量。
- 不支持大规模数据时的并行化。
- 剪枝过程可能需要额外的校验集。
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) + 1return -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 = 0conditional_entropy = 0for 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_entropyreturn 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)。
相关文章:
【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法
C4.5 是由 Ross Quinlan 提出的决策树算法,是对 ID3 算法的改进版本。它在 ID3 的基础上,解决了以下问题: 处理连续型数据:支持连续型特征,能够通过划分点将连续特征离散化。处理缺失值:能够在特征值缺失的…...
云计算vsphere 服务器上添加主机配置
这里是esxi 主机 先把主机打开 然后 先开启dns 再开启 vcenter 把每台设备桌面再vmware workstation 上显示 同上也是一样 ,因为在esxi 主机的界面可能有些东西不好操作 我们选择主机和集群 左边显示172.16.100.200...
Linux笔记---进程:进程替换
1. 进程替换的概念 进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。 这种技术通常用于在不创建新进程的情况下,改变进程的行为。 我们之前谈到过for…...
量化交易backtrader实践(五)_策略综合篇(1)_股票软件指标回测
在第三章6到9节,我们学习和实践了大部分股票软件指标,且这些指标是backtrader内置指标实践中没有讲到过的。然后,在进行策略综合之前,我们先热个身,把一些可能比较有参考意义的股票软件内置指标在backtrader里给实现了…...
4.STM32通信接口之SPI通信(含源码)---软件SPI与W25Q64存储模块通信实战《精讲》
经过研究SPI协议和W25Q64,逐步了解了SPI的通信过程,接下来,就要进行战场实战了!跟进Whappy步伐! 目标:主要实现基于软件的SPI的STM32对W25Q64存储写入和读取操作! 开胃介绍(代码基本…...
MINDAGENT:游戏交互中的新兴性设计
一、摘要 1.问题/研究背景 LLM具有在多智能体系统中执行复杂调度的能力,并可以协调这些代理以完成需要广泛合作的复杂任务。 但是,目前还没有一个标准的游戏场景和相关的测试指标来评估 LLM 在游戏中的表现以及与人类玩家的合作能力。 2.研究目标/动…...
【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)
一、包含指标: 股票代码 股票代码 股票简称 年份 所属城市 直辖市:企业所在地是否属于直辖市。1是,0否。 副省级城市:企业所在地是否属于副省级城市。1是,0否。 省会城市&a…...
C# 动态类型 Dynamic
文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...
Css动画:旋转相册动画效果实现
🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…...
Unity 基于Collider 组件在3D 物体表面放置3D 物体
实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...
Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount
目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …...
PyQt 中的无限循环后台任务
在 PyQt 中实现一个后台无限循环任务,需要确保不会阻塞主线程,否则会导致 GUI 无响应。常用的方法是利用 线程(QThread) 或 任务(QRunnable 和 QThreadPool) 来运行后台任务。以下是一些实现方式和关键点&a…...
5G CPE核心器件-基带处理器(三)
5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…...
鸿蒙next版开发:拍照实现方案(ArkTS)
文章目录 拍照功能开发步骤1. 导入相关接口2. 创建会话3. 配置会话4. 触发拍照5. 监听拍照输出流状态 结语 在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是拍照功能。本文将详细介绍如何在ArkTS中实现拍照功能,并提供代码…...
C++面试突破---C/C++基础
1.C特点 1. C在C语言基础上引入了面对对象的机制,同时也兼容C语言。 2. C有三大特性(1)封装。(2)继承。(3)多态; 3. C语言编写出的程序结构清晰、易于扩充,程序可读性好。…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...
每日算法一练:剑指offer——树篇(4)
1.计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -&…...
Nginx静态资源配置
基本配置原则 明确资源目录:为不同类型的静态资源指定不同的路径,这样可以避免路径冲突,并且便于管理。正确设置文件权限:确保 Nginx 具有读取静态资源的权限。缓存优化:为静态资源设置缓存头(如 expires&…...
困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析
当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...
D3.js 初探
文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目,由于对最终呈现的…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
