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

news2024/12/27 11:03:43

ID3(Iterative Dichotomiser 3)是决策树的一种构造算法,由 Ross Quinlan 在 1986 年提出。它主要用于分类问题,通过信息增益选择特征来构建决策树。ID3 假设数据是离散型特征,且不支持连续型数据。


1. 核心思想

  1. 划分标准

    • 使用 信息增益(Information Gain)作为特征选择的标准。
    • 选择信息增益最大的特征进行分裂。
  2. 递归构造

    • 从根节点开始,每次根据信息增益选择特征,生成子节点。
    • 对每个子节点重复这一过程,直到满足停止条件(例如数据不可再分,或者所有样本类别相同)。

2. 信息增益

信息增益基于**信息熵(Entropy)**的概念:

信息熵的定义

信息熵衡量数据集的不确定性:

H(D) = - \sum_{i=1}^C p_i \log_2(p_i)

  • D:数据集。
  • C:类别数。
  • p_i:数据集中属于第 i 类的概率。
条件熵

划分数据集 D 后的条件熵为:

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

  • A:划分特征。
  • D_v​:特征 A 的值为 v 时的子数据集。
  • |D_v|/|D|:数据划分到 v 类的比例。
信息增益公式

信息增益是划分前后信息熵的减少:

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

  • H(D):划分前的熵。
  • H(D|A):划分后的条件熵。
  • 特征 A 的信息增益越大,说明使用 A 划分后数据集的不确定性降低越多,划分效果越好。

3. ID3 算法步骤

  1. 输入

    • 数据集 D(包含样本和对应的类别标签)。
    • 特征集 A。
  2. 步骤

    1. 计算当前数据集的熵 H(D)。
    2. 对于每个特征 A ∈ A:
      • 计算特征 A 的信息增益 IG(D, A)。
    3. 选择信息增益最大的特征 A^*,作为当前节点的分裂特征。
    4. 根据特征 A^* 的每个取值 v,划分数据集:
      • 如果子数据集 D_v​ 为空,设置叶节点为多数类别。
      • 如果子数据集 D_v​ 非空,递归构造子树。
    5. 当满足停止条件时,停止分裂。
  3. 输出

    • 决策树。

4. 算法特点

优点
  1. 简单易实现:基于熵和信息增益的数学原理,计算相对直观。
  2. 解释性强:生成的决策树规则可以直接解释分类依据。
缺点
  1. 对连续特征无直接支持:需要离散化连续特征。
  2. 易过拟合:树可能过于复杂,适应训练数据的噪声。
  3. 偏好多值特征:特征的可能取值越多,信息增益往往越高,可能导致模型偏向这些特征。

5. 示例

数据示例

假设有以下样本数据:

天气温度湿度风力是否运动
晴天
晴天
阴天
雨天
雨天正常

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


计算步骤
  1. 计算根节点的熵 H(D) 数据集中是否运动的比例为:

    • P(是) = 3/5, P(否) = 2/5。
      熵为:
    H(D) = -\frac{3}{5} \log_2 \frac{3}{5} - \frac{2}{5} \log_2 \frac{2}{5} \approx 0.971
  2. 计算每个特征的条件熵 H(D|A) 和信息增益

    • 天气(Weather)

      • H(D|\text{Sunny}) = -1 \log_2(1) = 0
      • 对所有天气取值加权计算条件熵,得到 H(D|\text{Weather})
      • 信息增益 IG(D, \text{Weather}) = H(D) - H(D|\text{Weather})
    • 温度(Temperature)

      • 类似方法计算温度的条件熵和信息增益。
    • 湿度、风力

      • 按相同方法计算。
  3. 选择信息增益最大的特征

    • A^* = \text{Weather},构造根节点。
  4. 递归分裂子数据集

    • 对子数据集重复计算,直到满足停止条件。

 6. 代码实现

Python 示例
from math import log2

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

# 计算信息增益
def information_gain(data, labels, feature_index):
    total_entropy = entropy(labels)
    feature_values = [row[feature_index] for row in data]
    unique_values = set(feature_values)
    conditional_entropy = 0
    for value in unique_values:
        subset = [labels[i] for i in range(len(data)) if data[i][feature_index] == value]
        conditional_entropy += (len(subset) / len(data)) * entropy(subset)
    return total_entropy - conditional_entropy

# 示例数据
data = [
    ["晴天", "高", "高", "弱"],
    ["晴天", "高", "高", "强"],
    ["阴天", "高", "高", "弱"],
    ["雨天", "中", "高", "弱"],
    ["雨天", "低", "正常", "弱"]
]
labels = ["否", "否", "是", "是", "是"]

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

输出结果

Feature 0, Information Gain: 0.9710
Feature 1, Information Gain: 0.4200
Feature 2, Information Gain: 0.1710
Feature 3, Information Gain: 0.3219

7. 扩展

  1. C4.5 算法

    • 使用信息增益比替代信息增益,解决偏好多值特征问题。
    • 支持连续型特征。
  2. CART 算法

    • 支持分类与回归,使用基尼指数或均方误差。

ID3 是决策树的早期版本,适用于简单的分类问题,但由于其限制(如无法处理连续型特征、易过拟合),后续算法(如 C4.5 和 CART)进一步改进了 ID3。 

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

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

相关文章

Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务

Spring Boot 3.0 MySQL 8.0 kkFileView 实现完整文件服务 背景:比较常见的需求,做成公共的服务,后期维护比较简单,可扩展多个存储介质,上传逻辑简单,上传后提供一个文件id,后期可直接通过此i…

泷羽sec:shell编程(9)不同脚本的互相调用和重定向操作

声明: 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求&#xf…

IDEA的service窗口中启动类是灰色且容易消失

大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…

【JMX JVM监控】Prometheus读取Trino的JMX数据到Grafana展示

trino运行拥有自己的UI来监控资源使用率,但领导需要更好的展示做些图表出来放到PPT里面,选择了用prometheus收集数据和grafana来展示图表。本文就trino的数据采集和展示做记录,对于prometheus和grafana的安装不做介绍。 首先要采集trino的数据…

【NIPS2024】Unique3D:从单张图像高效生成高质量的3D网格

背景(现有方法的不足): 基于Score Distillation Sampling (SDS)的方法:从大型二维扩散模型中提取3D知识,生成多样化的3D结果,但存在每个案例长时间优化问题/不一致问题。 目前通过微…

雨晨 26100.2454 Windows 11 24H2 专业工作站 极简纯净版

文件: 雨晨 26100.2454 Windows 11 24H2 专业工作站极简 install.esd 大小: 1947043502 字节 修改时间: 2024年12月6日, 星期五, 16:38:37 MD5: 339B7FDCA0130D432A0E98957738A9DD SHA1: 2978AE0CEAF02E52EC4135200D4BDBC861E07BE8 CRC32: 8C329C89 简述: 由YCDIS…

IDE如何安装插件实现Go to Definition

项目背景 框架:Cucumber Cypress 语言:Javascript IDE:vscode 需求 项目根目录cypress-automation的cypress/integration是测试用例的存放路径,按照不同模块不同功能创建了很多子目录,cucumber测试用例.feature文…

pyqtgraph绘制实时更新数据的图

PyQtGraph是一个基于PyQt和NumPy的Python库,它专为实时数据可视化而设计。以绘制0~2π范围的ysin(x)为例,基本用法的代码如下: # codingutf-8import pyqtgraph as pg from pyqtgraph.Qt import QtGui, QtCore import numpy as np# pyqtgraph…

容器运行应用及Docker命令

文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级

在现代工业自动化领域,通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT(Ethernet for Control Automation Technology)作为一种实时以太网解决方案,因其高性能及成本效益高等特点,在众多…

网络编程(UDP\TCP回显服务器)

目录 套接字socket TCP和UDP特点比较 特点 比较 UDP回显服务器/客户端的编写 UDP的socket api 回显服务器 客户端 TCP回显服务器/客户端的编写 TCP的socket api 回显服务器 客户端 优化服务器 1.关闭服务器创建的socket对象 2.引入线程池,为多个客户…

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化,传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念,如Trace和Span,并讨论了其基本原理。接着,文章介绍了SkyWa…

burp常用机漏洞测试理论

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

docker学习笔记(四)--DockerFile

文章目录 一、什么是Dockerfile二、docker build命令三、dockerfile指令3.1 FROM3.2 ENV3.3 WORKDIR3.4 RUN3.5 CMD3.6 ENTRYPOINT3.7 EXPOSE3.8 ARG3.9 ADD3.10 COPY3.11 VOLUME 四、dockerfile示例 一、什么是Dockerfile Dockerfile 是用于构建 Docker 镜像的脚本文件&#…

创造未来:The Sandbox 创作者训练营如何赋能全球创造者

创作者训练营让创造者有能力打造下一代数字体验。通过促进合作和提供尖端工具,The Sandbox 计划确保今天的元宇宙是由一个个创造者共同打造。 2024 年 5 月,The Sandbox 推出了「创作者训练营」系列,旨在重新定义数字创作。「创作者训练营」系…

基于Pyhton的人脸识别(Python 3.12+face_recognition库)

使用Python进行人脸编码和比较 简介 在这个教程中,我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码,并比较两个人脸是否相似。face_recognition库是一个强大的工具,它基于dlib的深度学习模型,可以轻松实…

抽象工厂模式的理解和实践

在软件开发中,设计模式是解决常见问题的最佳实践。抽象工厂模式是一种创建型设计模式,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。本文将详细解释抽象工厂模式的概念、结构、优点、缺点,并通过Java代…

Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署

文章目录 前言一、Hbase伪分布式部署(手动部署)1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.jar…

【css】基础(二)

本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:css专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &a…