AI算法23-决策树ID3算法Iterative Dichotomiser 3 | ID3

目录

决策树ID3算法概述

决策树ID3算法简介

决策树ID3算法的原理

决策树ID3算法的核心

决策树ID3算法的本质

决策树ID3算法的基本流程

决策树ID3算法计算过程

步骤1

步骤2

步骤3

决策树ID3算法的代码实现

决策树ID3算法的优缺点

优点

缺点

决策树ID3算法的应用场景


决策树ID3算法概述

决策树ID3算法简介

ID3算法最早是由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”。1986年,Quinlan进一步发展了ID3算法,使其成为决策树学习算法的一种重要代表。ID3算法是一种自顶向下的贪婪型算法,通过递归地划分训练数据集来构建决策树,特别适用于处理离散属性的数据集。

ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。

ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。

ID3该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。

决策树ID3算法的原理

ID3算法是基于熵和信息增益的概念,通过将数据集划分为更小的子集来构建决策树。这个算法的核心思想是通过选择最能降低数据不确定性的属性来进行划分,直到所有数据都属于同一类别。

在ID3算法中,信息是指数据的不确定性。为了衡量信息的不确定性,使用了信息熵的概念。信息熵是一个度量数据集中不确定性的指标,它的值越大,表示数据集的不确定性越高。

ID3算法的具体步骤是:首先,计算每个属性的信息增益,信息增益是通过计算在给定属性的条件下,数据集的不确定性减少的程度。然后,选择具有最大信息增益的属性作为划分点,将数据集

ID3算法中,每个节点表示一个属性,每个分支表示一个属性值,每个叶节点表示一个类别。算法通过计算属性的信息增益来选择最佳属性作为节点,从而构建决策树。信息增益越大,属性对分类的贡献越大。

决策树ID3算法的核心

ID3算法核心是“信息熵”。ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。

决策树ID3算法的本质

在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法本质是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策空间。

在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性,很显然这是一种自顶向下的贪心策略。

决策树ID3算法的基本流程

ID3算法算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。

首先,ID3算法需要解决的问题是如何选择特征作为划分数据集的标准。在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。信息增益的概念将在下面介绍,通过不断的选择特征对数据集不断划分;

其次,ID3算法需要解决的问题是如何判断划分的结束。分为两种情况,第一种为划分出来的类属于同一个类,如上图中的最左端的“非鱼类”,即为数据集中的第5行和第6行数据;最右边的“鱼类”,即为数据集中的第2行和第3行数据。第二种为已经没有属性可供再分了。此时就结束了。

通过迭代的方式,我们就可以得到这样的决策树模型。

决策树ID3算法计算过程

步骤1

假设S为完整的数据集,数据标签(数据类别)共有n个类别,分别为C1,...,Cn。Si对应Ci类别下数据子集,因此,数据集S的信息熵计算如下:

其中,pi是数据样本为Ci的概率,因此:

|Si|是类别Ci在数据集S中的数据数量,|S|是数据集S中的数据数量。

步骤2

假设特征A有k种不同的取值,根据特征A,一定条件下的数据集S可以分为k个子集{S1,...,Sk},因此,数据集S的信息熵可以按照如下方式计算:

步骤3

假设数据集S根据特征A不同的取值分为众多子集,则信息增益的计算为:

计算数据集中每一个特征的信息增益,如Gain(S,B), Gain(S,C)等,选取信息增益最大的特征作为树中新的节点。

决策树ID3算法的代码实现

import numpy as np
import pandas as pd
from collections import Counterclass Node:def __init__(self, feature=None, threshold=None, left=None, right=None, *, value=None):self.feature = featureself.threshold = thresholdself.left = leftself.right = rightself.value = valuedef entropy(labels):"""计算信息熵"""hist = Counter(labels)total = len(labels)entropy = 0for count in hist.values():p = count / totalentropy -= p * np.log2(p)return entropydef information_gain(dataset, labels, feature):"""计算信息增益"""gain = entropy(labels)unique_values = dataset[feature].unique()for value in unique_values:sub_dataset = dataset[dataset[feature] == value]prob = len(sub_dataset) / len(dataset)gain -= prob * entropy(sub_dataset[labels])return gaindef split_dataset(dataset, feature, value):"""根据特征值划分数据集"""left = dataset[dataset[feature] < value]right = dataset[dataset[feature] >= value]return left, rightdef build_tree(dataset, features, labels, depth=0, max_depth=None):"""递归构建决策树"""if max_depth is not None and depth >= max_depth:return Node(value=np.bincount(dataset[labels]).argmax())labels = dataset[labels]if len(labels) == 0:return Node(value=None)num_samples, num_features = dataset.shapeif num_samples <= 1:return Node(value=labels[0])best_ig = -1best_feature, best_threshold = None, Nonefor feature in features:feature_data = dataset[feature].dropna()thresholds = feature_data.unique()for threshold in thresholds:left, right = split_dataset(dataset, feature, threshold)ig = information_gain(dataset, labels, feature)if ig > best_ig:best_ig = igbest_feature = featurebest_threshold = thresholdif best_feature is None:return Node(value=np.bincount(labels).argmax())left_subtree = build_tree(dataset[dataset[best_feature] < best_threshold], features, labels, depth + 1, max_depth)right_subtree = build_tree(dataset[dataset[best_feature] >= best_threshold], features, labels, depth + 1, max_depth)return Node(best_feature, best_threshold, left_subtree, right_subtree)def predict(node, sample):"""预测样本的类别"""if node.value is not None:return node.valueif sample[node.feature] < node.threshold:return predict(node.left, sample)else:return predict(node.right, sample)# 示例数据集
data = {'age': [25, 35, 45, 60, 35, 60],'outlook': ['Sunny', 'Rainy', 'Overcast', 'Sunny', 'Rainy', 'Overcast'],'play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'Yes']
}
df = pd.DataFrame(data)
labels = 'play'# 训练决策树
features = df.columns.tolist()
features.remove(labels)
tree = build_tree(df, features, labels)# 预测
sample = {'age': 40, 'outlook': 'Sunny'}
print(predict(tree, sample))

决策树ID3算法的优缺点

优点

  1. 易于理解和解释:决策树的结构简洁,可以帮助人们更好地了解分类过程,易于理解和解释,具有良好的可解释性。
  2. 处理多分类问题:决策树可以处理多分类问题,适用于各种类型的数据。
  3. 处理离散和连续数据:虽然ID3主要处理离散数据,但通过适当的预处理,也可以处理连续数据。
  4. 自学习能力:ID3算法可以从数据集中自动学习和归纳规律,无需人为指定函数形式,体现了较强的机器学习特性。
  5. 处理缺失数据:ID3算法可以处理具有缺失属性值的数据,缺失数据不会影响特征的选取。
  6. 生成规则:易于提取出规则,可扩展性强。

缺点

  1. 倾向选择属性值多的特征:ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准,倾向于选择取值较多的属性,这可能导致选择的属性并不是最优的。
  2. 不能处理连续属性:ID3算法仅适用于离散属性,对于连续数值型数据需要预先离散化处理,否则无法直接应用。
  3. 过拟合问题:ID3算法在构建过程中容易受到噪声影响,特别是当数据集中存在大量属性时,可能会导致过拟合现象,构建出的决策树过于复杂,对训练数据拟合得过于紧密,而对未知数据的泛化能力不足。
  4. 对噪声数据敏感:ID3算法对噪声数据比较敏感,可能会产生过拟合。
  5. 计算复杂度:在处理高维数据时,可能会产生过度拟合和计算复杂度过高的问题。
  6. 划分过程可能停止:划分过程会由于子集规模过小而造成统计特征不充分而停止。
  7. 不支持增量学习:ID3算法不能增量地接受训练集,每增加一次实例就抛弃原有的决策树,重新构造新的决策树,开销很大。

决策树ID3算法的应用场景

ID3算法是一种经典的决策树学习算法,广泛应用于各种分类和预测问题。以下是ID3算法的主要应用场景:

  1. 文本分类:ID3算法可以用于文本分类任务,通过分析文本内容的特征来预测其所属类别。这种应用在自然语言处理和信息检索中非常常见。
  2. 垃圾邮件过滤:在电子邮件系统中,ID3算法可以帮助识别和过滤垃圾邮件。通过对邮件内容和元数据的分析,算法可以预测邮件是否为垃圾邮件。
  3. 医学诊断:在医疗领域,ID3算法可以用于疾病的诊断和预测。通过分析患者的各种医学指标,算法可以帮助医生做出更准确的诊断。
  4. 金融风险评估:在金融行业,ID3算法可以用于评估客户的信用风险。通过对客户的财务和行为数据的分析,算法可以预测客户违约的可能性。
  5. 数据挖掘:ID3算法在数据挖掘中也有广泛应用,特别是在处理离散属性的数据集时。它可以从大量数据中发现有价值的模式和规则。
  6. 模式识别:在模式识别领域,ID3算法可以用于图像识别、语音识别等任务。通过分析数据的特征,算法可以识别和分类不同的模式

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

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

相关文章

ue5笔记

1 点光源 聚光源 矩形光源 参数比较好理解 &#xff08;窗口里面&#xff09;环境光混合器&#xff1a;快速创造关于环境光的组件 大气光源&#xff1a;太阳光&#xff0c;定向光源 天空大气&#xff1a;蓝色的天空和大气 高度雾&#xff1a;大气下面的高度感的雾气 体积…

【HarmonyOS】HarmonyOS NEXT学习日记:五、交互与状态管理

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;五、交互与状态管理 在之前我们已经学习了页面布局相关的知识&#xff0c;绘制静态页面已经问题不大。那么今天来学习一下如何让页面动起来、并且结合所学完成一个代码实例。 交互 如果是为移动端开发应用&#xff0c;那么交…

自主巡航,目标射击

中国机器人及人工智能大赛 参赛经验&#xff1a; 自主巡航赛道 【机器人和人工智能——自主巡航赛项】动手实践篇-CSDN博客 主要逻辑代码 #!/usr/bin/env python #coding: utf-8import rospy from geometry_msgs.msg import Point import threading import actionlib impor…

鸿蒙开发 03 封装 @ohos/axios (最新深度封装)

鸿蒙开发 03 封装 ohos/axios &#xff08;最新深度封装&#xff09; 1、安装 ohos/axios2、开始封装2.1 新建 utils 文件夹 和 api 文件夹2.2 在 utils 文件夹里新建 http.ts2.3 在 api 文件夹里新建 api.ets 3、页面调用4、打印结果 1、安装 ohos/axios ohpm install ohos/a…

linux环境交叉编译openssl库,以使Qt支持https

一.前言 Qt若需要支持https&#xff0c;则需要openssl的支撑,并且要注意&#xff0c;Qt不同版本会指定对应的openssl版本库&#xff0c;比方我用的Qt5.15.10他要求用的openssl版本是1.1.1&#xff0c;你就不能用其他版本&#xff0c;不然基本就是失败报错。 如何查看Qt对应ope…

无人机反制技术常见的有哪些?

随着无人机技术的迅速发展和广泛应用&#xff0c;无人机在民用、军事等领域都发挥着重要作用。然而&#xff0c;无人机的滥用和非法入侵也带来了严重的安全隐患。为了维护国家安全和社会稳定&#xff0c;无人机反制技术应运而生。本文将详细介绍无人机反制技术的常见类型&#…

【Git学习 | 第2篇】在IDEA中使用Git

文章目录 在IDEA中使用Git1. IDEA中配置Git2. 获取Git仓库2.1 本地初始化仓库2.2 从远程仓库克隆 3. 本地仓库操作4. 远程仓库操作5. 分支操作 在IDEA中使用Git 1. IDEA中配置Git IDEA中使用Git&#xff0c;本质上使用的本地安装的Git软件配置步骤&#xff1a; 2. 获取Git仓库…

Unity UGUI 之 RectTransform

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 Unity - Manual: Rect Transform 1.Rect Transform是什么 2.轴心与锚点的映射关系 首先…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…

阿里开源的音频模型_原理与实操

英文名称: FunAudioLLM: Voice Understanding and Generation Foundation Models for Natural Interaction Between Humans and LLMs 中文名称: FunAudioLLM: 人与LLMs之间自然互动的语音理解和生成基础模型 论文地址: http://arxiv.org/abs/2407.04051v3 相关论文&#xff1a;…

人话讲下如何用github actions编译flutter应用-以编译windows为例

actions的脚本看下这个&#xff0c;有简单的说明&#xff0c;有关于编译个平台的脚本&#xff1a; https://github.com/marketplace/actions/flutter-action 打开你要编译的项目点击那个Actions按钮 然后随便点击一个脚本会跳到白框编辑界面 打开上文提到的网址随便抄下就ok …

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm 文章目录 达梦数据库(一)mysql2dm一、安装篇ForWindows二、数据库初始化篇三、数据迁移篇出现的问题找不到对应表或者视图 注意字符集模式迁移出错大小写敏感解决方案 四、 代码修改篇group_concatGROUP BY方法一方法二(最笨)方法补充 多表联查更新参考…

1.17、基于竞争层的竞争学习(matlab)

1、基于竞争层的竞争学习简介及原理 竞争学习是一种无监督学习方法&#xff0c;其中的竞争层神经元之间互相竞争以学习输入模式的表示。竞争学习的一个经典模型是竞争神经网络&#xff08;Competitive Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;其核心部分是…

Linux复习02

一、什么是操作系统 操作系统是一款做软硬件管理的软件&#xff01; 一个好的操作系统&#xff0c;衡量的指标是&#xff1a;稳定、快、安全 操作系统的核心工作&#xff1a; 通过对下管理好软硬件资源的手段&#xff0c;达到对上提供良好的&#xff08;稳定&#xff0c;快…

什么是单例模式,有哪些应用?

目录 一、定义 二、应用场景 三、6种实现方式 1、懒汉式&#xff0c;线程不安全。 2、懒汉式&#xff0c;线程安全 3、双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09; 4、静态内部类方式-------只适用于静态域 5、饿汉式 6、枚举…

嵌入式C++、STM32、树莓派4B、OpenCV、TensorFlow/Keras深度学习:基于边缘计算的实时异常行为识别

1. 项目概述 随着物联网和人工智能技术的发展,智能家居安全系统越来越受到人们的关注。本项目旨在设计并实现一套基于边缘计算的智能家居安全系统,利用STM32微控制器和树莓派等边缘设备,实时分析摄像头数据,识别异常行为(如入侵、跌倒等),并及时发出警报,提高家庭安全性。 系…

英福康INFICON RGAs for the AMAT Endura 5500 课件PPT

英福康INFICON RGAs for the AMAT Endura 5500 课件PPT

uniapp+vue3实现音乐播放器,包含上一首、下一首、暂停、播放、下载音频、下载视频、进度条拖拽、歌词等

uni-app中实现音乐播放器 1、主要利用的是uni-app中提供的uni.createInnerAudioContext()来进行实现&#xff1b; 2、代码示例 &#xff08;1&#xff09;主页面代码展示 <template><view class"songDetailContainer"><view class"bg&quo…

记录uni-app横屏项目:自定义弹出框

目录 前言&#xff1a; 正文&#xff1a; 前言&#xff1a;横屏的尺寸问题 最近使用了uniapp写了一个横屏的微信小程序和H5的项目&#xff0c;也是本人首次写的横屏项目&#xff0c;多少是有点踩坑不太适应。。。 先说最让我一脸懵的点&#xff0c;尺寸大小&#xff0c;下面一…

vxe-弹窗初始化激活选中Vxe-Table表格中第一行input输入框

1.实现效果 2.Modal弹窗的渲染过程 一、Vue组件的生命周期 Vue组件从创建到销毁会经历一系列的生命周期钩子&#xff0c;这些钩子为开发者提供了在不同阶段插入自定义逻辑的机会。在Modal弹窗的上下文中&#xff0c;这些生命周期钩子同样适用。 beforeCreate&#xff1a;组件…