决策树 ID3 手工推导

news2024/9/24 1:17:39

掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。

参考案例:https://cuijiahua.com/blog/2017/11/ml_2_decision_tree_1.html
机器学习实战教程(二):决策树基础篇之让我们从相亲说起

决策树 ID3 手工推导

决策树 ID3 简介

ID3作为一种经典的决策树算法,是基于信息熵来选择最佳的测试属性,其选择了当前样本集中具有最大信息增益值的属性作为测试属性

样本集的划分则依据了测试属性的取值进行,测试属性有多少种取值就能划分出多少的子样本集;同时决策树上与该样本集相应的节点长出新的叶子节点

ID3算法根据信息论理论,采用划分后样本集的不确定性作为衡量划分样本子集的好坏程度,用“信息增益值”度量不确定性——信息增益值越大,不确定性就更小,这就促使我们找到一个好的非叶子节点来进行划分

ID3 算法的基本原理以及实例分析

我们假设一个这样的数据样本集 S,其中数据样本集 S 包含了 s 个数据样本,假设类别属性具有 m 个不同的值(判断指标):\(C_i(i=1,2,3,…,m)\)

\(S_i\)\(C_i\) 中的样本数,对于一个样本集

总信息熵为:(这里信息熵的定义与其他课程中的信息熵定义一样)

\[I(S_1,S_2,……,S_m) = -\sum^m_{i = 1}P_ilog_2P_i \]

其中,\(P_i\) 表示任意样本属于 \(C_i\) 的概率,也可以用 \(\frac{s_i}{s}\) 进行估计

我们假设一个属性 A 具有 k 个不同的值 \({a_1,a_2,…,a_k}\), 利用属性 A 将数据样本 S 划分为 k 个子集 \({S_1,S_2,…, S_k}\),其中 \(S_j\) 包含了集合 S 中属性 A 取 \(a_j\) 值的样本。若是选择了属性 A 为测试属性,则这些子集就是从集合 S 的节点生长出来的新的叶子节点

\(S_{ij}\) 是子集 \(S_j\) 中类别为 \(C_i\) 的样本数,则根据属性 A 划分样本的信息熵值为:

\[E(A) = \sum^k_{j = 1}[\frac{S_{1j},S_{2j},……,S_{mj}}{S} \times I(S_{1j},S_{2j},……,S_{mj})] \]

最后,我们利用属性 A 划分样本集 S 后得到的信息熵增益为:

\[Gain(A) = I(S_1,S_2,……,S_m) - E(A) \]

决策树 ID3 的构建的准备工作

使用决策树做预测的每一步骤都很重要,数据收集不到位,将会导致没有足够的特征让我们构建错误率低的决策树。数据特征充足,但是不知道用哪些特征好,将会导致无法构建出分类效果好的决策树模型。从算法方面看,决策树的构建是我们的核心内容

决策树要如何构建呢?通常,这一过程可以概括为3个步骤:特征选择、决策树的生成和决策树的修剪

这里我们通过实例进行说明

特征选择

特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的标准是信息增益(information gain)或信息增益比,为了简单,本文使用信息增益作为选择特征的标准。那么,什么是信息增益?在讲解信息增益之前,让我们看一组实例,贷款申请样本数据表

image

希望通过所给的训练数据学习一个贷款申请的决策树,用于对未来的贷款申请进行分类,即当新的客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请

特征选择就是决定用哪个特征来划分特征空间。比如,我们通过上述数据表得到两个可能的决策树,分别由两个不同特征的根结点构成

image

图(a)所示的根结点的特征是年龄,有 3 个取值,对应于不同的取值有不同的子结点。图(b)所示的根节点的特征是工作,有 2 个取值,对应于不同的取值有不同的子结点。两个决策树都可以从此延续下去。问题是:究竟选择哪个特征更好些?这就要求确定选择特征的准则。直观上,如果一个特征具有更好的分类能力,或者说,按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征。信息增益就能够很好地表示这一直观的准则

什么是信息增益呢?在划分数据集之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择

1、香农熵

在可以评测哪个数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集合信息的度量方式称为香农熵或者简称为熵(entropy),这个名字来源于信息论之父克劳德·香农

如果看不明白什么是信息增益和熵,请不要着急,因为他们自诞生的那一天起,就注定会令世人十分费解。克劳德·香农写完信息论之后,约翰·冯·诺依曼建议使用"熵"这个术语,因为大家都不知道它是什么意思

熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。如果待分类的事物可能划分在多个分类之中,则符号 \(x_i\) 的信息定义为:

\[l(x_i) = -log_2p(x_i) \]

其中 \(p(x_i)\) 是选择该分类的概率。有人可能会问,信息为啥这样定义啊?答曰:前辈得出的结论。这就跟 1+1 等于 2 一样,记住并且会用即可。上述式中的对数以 2 为底,也可以 e 为底(自然对数)

通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:

\[H = -\sum^n_{i = 1}p(x_i)log_2p(x_i) \]

期中 n 是分类的数目。熵越大,随机变量的不确定性就越大

当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)。什么叫由数据估计?比如有 10 个数据,一共有两个类别,A 类和 B 类。其中有 7 个数据属于A类,则该 A 类的概率即为十分之七。其中有 3 个数据属于 B 类,则该 B 类的概率即为十分之三。浅显的解释就是,这概率是我们根据数据数出来的。我们定义贷款申请样本数据表中的数据为训练数据集 D ,则训练数据集 D 的经验熵为 H(D),|D| 表示其样本容量,及样本个数。设有 K 个类 \(C_k = 1,2,3,...,K\), \(|C_k|\) 为属于类 \(C_k\) 的样本个数,因此经验熵公式就可以写为 :

\[p(C_k) = \frac{|C_k|}{D}\\ H(D) = \sum^K_{k = 1}\frac{|C_k|}{D}log_2\frac{|C_k|}{D} \]

根据此公式计算经验熵 H(D),分析贷款申请样本数据表中的数据。最终分类结果只有两类,即放贷和不放贷。根据表中的数据统计可知,在 15 个数据中,9 个数据的结果为放贷,6 个数据的结果为不放贷。所以数据集 D 的经验熵 H(D) 为:

\[D = 15\ \ \ \ K = 2\\ H(D) = - \sum^2_{k = 1}\frac{|C_k|}{D}log_2\frac{|C_k|}{D} = - [(\frac{9}{15}log_2\frac{9}{15}) + (\frac{6}{15}log_2\frac{6}{15})] = 0.971 \]

经过计算可知,数据集 D 的经验熵 H(D) 的值为 0.971

2、信息增益

在上面,我们已经说过,如何选择特征,需要看信息增益。也就是说,信息增益是相对于特征而言的,信息增益越大,特征对最终的分类结果影响也就越大,我们就应该选择对最终分类结果影响最大的那个特征作为我们的分类特征

在讲解信息增益定义之前,我们还需要明确一个概念,条件熵

熵我们知道是什么,条件熵又是个什么鬼?条件熵 \(H(\frac{Y}{X})\) 表示在已知随机变量 X 的条件下随机变量 Y 的不确定性,随机变量 X 给定的条件下随机变量 Y 的条件熵(conditional entropy) \(H(\frac{Y}{X})\) ,定义为 X 给定条件下 Y 的条件概率分布的熵对 X 的数学期望:

\[H(\frac{Y}{X}) = \sum^n_{i = 1}p_iH(\frac{Y}{X = x_i}) = \sum^n_{i = 1}p(\frac{Y}{X})log_2p(\frac{Y}{X}) = H(X,Y) - H(X)\\ H(X,Y) = H(X) + H(\frac{Y}{X}) \]

这里:

\[p_i = P(X = x_i),\ \ i = 1,2,……,n \]

同理,当条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的条件熵称为条件经验熵(empirical conditional entropy)

明确了条件熵和经验条件熵的概念。接下来,让我们说说信息增益。前面也提到了,信息增益是相对于特征而言的。所以,特征A对训练数据集D的信息增益 g(D,A) ,定义为集合D的经验熵 H(D) 与特征 A 给定条件下 D 的经验条件熵 \(H(\frac{D}{A})\) 之差,即:

\[g(D,A) = H(D) - H(\frac{D}{A}) \]

一般地,熵H(D)与条件熵H(D|A)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息

设特征A有n个不同的取值{a1,a2,···,an},根据特征A的取值将D划分为n个子集{D1,D2,···,Dn},|Di|为Di的样本个数。记子集Di中属于Ck的样本的集合为Dik,即Dik = Di ∩ Ck,|Dik|为Dik的样本个数。于是经验条件熵的公式可以些为:

\[H(\frac{D}{A}) = \sum^n_{i = 1}\frac{|D_i|}{D}H(D_i) = -\sum^n_{i = 1}\frac{|D_i|}{D}\sum^K_{k = 1}\frac{|D_{ik}|}{D_i}log_2\frac{|D_{ik}|}{D_i} \]

说了这么多概念性的东西,没有听懂也没有关系,举几个例子,再回来看一下概念,就懂了

以贷款申请样本数据表为例进行说明。看下年龄这一列的数据,也就是特征 \(A_1\),一共有三个类别,分别是:青年、中年和老年。我们只看年龄是青年的数据,年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现的概率是十五分之五,也就是三分之一。同理,年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是青年的数据的最终得到贷款的概率为五分之二,因为在五个数据中,只有两个数据显示拿到了最终的贷款,同理,年龄是中年和老年的数据最终得到贷款的概率分别为五分之三、五分之四。所以计算年龄的信息增益,过程如下:

\[\begin{aligned} g(D,A_1) &= H(D) - [\frac{5}{15}H(D_1) + \frac{5}{15}H(D_2) + \frac{5}{15}H(D_3)]\\ &= 0.971 - [\frac{5}{15}(-\frac{2}{5}log_2\frac{2}{5} - \frac{3}{5}log_2\frac{3}{5}) + \frac{5}{15}(-\frac{3}{5}log_2\frac{3}{5} - \frac{2}{5}log_2\frac{2}{5}) + \frac{5}{15}(-\frac{4}{5}log_2\frac{4}{5} - \frac{1}{5}log_2\frac{1}{5})]\\ &= 0.971 - 0.888\\ &= 0.083 \end{aligned} \]

同理,计算其余特征的信息增益 \(g(D,A_2)、g(D,A_3)\)\(g(D,A_4)\) 。分别为:

\[\begin{aligned} g(D,A_2) &= H(D) - [\frac{5}{15}H(D_1) + \frac{10}{15}H(D_2)]\\ &= 0.971 - [\frac{5}{15}\times 0 + \frac{10}{15}(-\frac{4}{10}log_2\frac{4}{10} - \frac{6}{10}log_2\frac{6}{10})]\\ &= 0.971 - 0.647\\ &= 0.324\\ g(D,A_3) &= H(D) - [\frac{6}{15}H(D_1) + \frac{9}{15}H(D_2)]\\ &= 0.971 - [\frac{6}{15}\times 0 + \frac{9}{15}(-\frac{3}{9}log_2\frac{3}{9} - \frac{6}{9}log_2\frac{6}{9})]\\ &= 0.971 - 0.551\\ &= 0.420\\ g(D,A_4) &= H(D) - [\frac{4}{15}H(D_1) + \frac{6}{15}H(D_2) + \frac{5}{15}H(D_3)]\\ &= 0.971 - [\frac{4}{15}\times 0 + \frac{6}{15}(-\frac{2}{6}log_2\frac{2}{6} - \frac{4}{6}log_2\frac{4}{6}) + \frac{5}{15}(-\frac{4}{5}log_2\frac{4}{5} - \frac{1}{5}log_2\frac{1}{5})]\\ &= 0.971 - 0.608\\ &= 0.363 \end{aligned} \]

最后,比较特征的信息增益,由于特征 \(A_3\) (有自己的房子)的信息增益值最大,所以选择 \(A_3\) 作为最优特征

决策树生成和修剪

我们已经学习了从数据集构造决策树算法所需要的子功能模块,包括经验熵的计算和最优特征的选择,其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。第一次划分之后,数据集被向下传递到树的分支的下一个结点。在这个结点上,我们可以再次划分数据。因此我们可以采用递归的原则处理数据集。

构建决策树的算法有很多,比如 C4.5、ID3 和 CART,这些算法在运行时并不总是在每次划分数据分组时都会消耗特征。由于特征数目并不是每次划分数据分组时都减少,因此这些算法在实际使用时可能引起一定的问题。目前我们并不需要考虑这个问题,只需要在算法开始运行前计算列的数目,查看算法是否使用了所有属性即可

决策树生成算法递归地产生决策树,直到不能继续下去未为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化

实例实战

一天,老师问了个问题,只根据头发和声音怎么判断一位同学的性别。

为了解决这个问题,同学们马上简单的统计了8位同学的相关特征,数据如下:

image

首先这里有两个属性用来判断性别:头发长短和声音粗细

\[\begin{aligned} H(D) &= -\sum^n_{i = 1}p_ilog_2p_i\\ H(D) &= -(\frac{3}{8}log_2\frac{3}{8} + \frac{5}{8}log_2\frac{5}{8})\\ &= 0.9544\\ g(D,A_1) &= H(D) - [\frac{1}{2}H(D_1) + \frac{1}{2}H(D_2)]\\ &= 0.9544 - [\frac{1}{2}(- \frac{1}{4}log_2\frac{1}{4} - \frac{3}{4}log_2\frac{3}{4}) + \frac{1}{2}(- \frac{1}{2}log_2\frac{1}{2} - \frac{1}{2}log_2\frac{1}{2})]\\ &= 0.9544 - 0.9057\\ &= 0.0487\\ 同理\\ g(D,A_2) &= H(D) - [\frac{2}{8}H(D_1) + \frac{6}{8}H(D_2)]\\ &= 0.9544 - [\frac{2}{8}\times 0 + \frac{6}{8}(- \frac{1}{2}log_2\frac{1}{2} - \frac{1}{2}log_2\frac{1}{2})]\\ &= 0.9544 - 0.75\\ &= 0.2087\\ \end{aligned} \]

这里最优特征为 A_2

参考资料

决策树——ID3算法

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

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

相关文章

【剑指offer专项突破版】二叉树篇——“C“

文章目录 前言一、二叉树剪枝题目分析思路分析代码 二、序列化与反序列化二叉树题目分析思路分析代码 三、从根节点到叶节点的路径数字之和题目分析思路分析代码 四、 向下的路径节点之和题目分析思路分析思路①代码思路②代码 五、节点之和最大的路径题目分析思路分析代码 六、…

Linux--查看Linux的体系结构以及内核版本:uname

语法: uname 选项功能: uname用来获取电脑和操作系统的相关信息。 选项: -a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型&a…

【2023比惨大会】测试惨吗?舍我其谁!

2023年,流行“比惨”。 作为一个测试员,惨吗?! 看后不要太现实 自学软件测试三个月,然 简历石沉大海 2022年度的绩效,2023年都要过完了 辞职大半年了,至今没找到合适的工作 昨天还在流泪加班&…

《阿里大数据之路》研读笔记(2)

前面的笔记地址: 《阿里大数据之路》研读笔记(1)_后季暖的博客-CSDN博客 规范化和反规范化总结就是 规范化让总的单一维度变成多个维度 然后每个维度就是一张表这样 适合OLTP 可以参考三范式 这样是为了减少冗余 比如一个商品有多个类目&…

这些接口测试工具你一定要知道

接口测试工具 接口测试工具如图: 1.Fiddler 首先,这是一个HTTP协议调试代理工具,说白了就是一个抓http包的工具。web测试和手机测试都能用到这个工具。既然是http协议,这个工具也能支持接口测试。 2.PostMan Postman一款非常流行…

【已解决】Spring boot项目获取到resource目录下文件完整路径怎么获取 ?

在实际开发过程中,可能有时候,我们将文件放在resource下,在程序中需要获取到文件路径然后操作。比如,将公钥放到resource文件夹下,在程序中需要获取到这个公钥的完整路径。怎么操作? 需要访问的文件位置 获…

数据库课程设计(教室设备故障报修系统)

题目:教室设备故障报修系统 内容与要求: 完成需求分析,写出功能需求和数据需求描述;在需求分析的基础上,完成数据库概念结构设计、逻辑结构设计、物理结构设计和数据库创建;完成视图、存储过程设计&#xf…

使用阿里云实现短信验证码

首先去阿里云中开启短信服务 然后申请自己的签名,发送的短信模板,之后点击右上角的头像,点击AccessKey,选第一个就行,然后保存这两个对应的值。 在等待签名和发送模板通过审核之后就可以配置我们的发送方法&#xff0c…

Android Framework的重要性及其对行业前景的影响~

随着智能手机和移动应用的兴起,Android操作系统成为全球最大的移动操作系统,而Android Framework作为其核心组件之一,扮演着至关重要的角色。Android Framework提供了众多的API和工具,为开发者提供了构建功能丰富、高效稳定的Andr…

大厂月入3w+,失业焦虑折磨着我

大家好,这里是程序员晚枫,小红书也叫这个名字。 周末和一位老朋友聚会,聊了聊一个很现实的收入问题,巧合的是:他的焦虑,竟然和月薪5k的我一模一样。 今天给大家分享一下。 1、外人看来,让人羡…

Scrpay框架之MongoDB--Index

目录 MongoDB-Index 概念 索引类型 创建索引 注意 样例 索引的查看 删除索引 语法 样例 检测索引的速度优势 Mongo-Unique Index And Compound Index 唯一索引(Unique Index) 添加唯一索引的语法 利用唯一索引进行数据去重 复合索引&a…

zkSync的ZK Stack:Hyperchains和Hyperbridges

1. 引言 ZK Stack有2个关键特性: sovereignty 主权:作为创建者,可对自己的链有完全的自由和权利来定制链的每一个方面。 Hyperchains独立运行,依赖以太坊L1来提供安全性和活性。 seamless connectivity 无缝连接。 Hyperbridges…

SolidWorks全球认证报名简章

SolidWorks CSWP专业认证考试 一、CSWP的起源 CSWP全名为Certified SolidWorks Professional ,为SolidWorks原厂认证;在全球非常具有公信力。是健全与完整的3D CAD认证,相较于一般宣称是3D CAD认证,但是却没有投入完整的团队与完…

Barplot | 平平无奇的环形Barplot你掌握了吗!?~(附完整代码)

1写在前面 最近天天下雨,真是下得我没脾气啊,动不动就淋成狗。😭 下雨也就算了,还特别热。🤒 不知道是不是人到中年了,事情也特别的多,能静下心来思考的时间越来越少了。😞 也越来越…

SparkSQL与Hive整合(Spark On Hive)

1. Hive的元数据服务 hive metastore元数据服务用来存储元数据,所谓元数据,即hive中库、表、字段、字段所属表、表所属库、表的数据所在目录及数据分区信息。元数据默认存储在hive自带的Derby数据库。在内嵌模式和本地模式下,metastore嵌入在…

安装一个新虚拟环境——就叫它newtorch吧!

文章目录 1 新建一个虚拟环境newtorch2 安装pytorch1.7.1依赖包3 安装matplotlib2.2.34 安装torchsummary5 现在开始测试一下代码6 安装pandas 1 新建一个虚拟环境newtorch 打开anaconda prompt,输入: conda create -n newtorch python3.7.4// newtorc…

idea多模块测试——暂时不启动某个有问题的模块,之后再加载回来

文章目录 遇到问题解决方案暂时卸载然后还原 遇到问题 某个模块出了问题,运行不了项目 解决方案 暂时卸载 然后还原

云原生之深入解析Dapr安全性之访问控制策略

一、服务调用范围访问策略 ① 跨命名空间的服务调用 Dapr 通过服务调用 API 提供端到端的安全性,能够使用 Dapr 对应用程序进行身份验证并设置端点访问策略: Dapr 应用程序可以被限定在特定的命名空间,以实现部署和安全,当然仍然…

计算机基础知识学习笔记

目录 1.计算机奠基人—冯•诺依曼1.冯诺依曼结构2.冯诺依曼结构的特点 2.计算机的发展 感觉自己的计算机基础知识还很薄弱,工作之余补习一下。1.计算机奠基人—冯•诺依曼 1.冯诺依曼结构 冯诺依曼结构也称作普林斯顿结构,是一种将程序(指令…

【C语言】大小端介绍以及判断大小端的两种方式

前言 🎈大家好,我是何小侠🎈 🍃大家可以叫我小何或者小侠🍃 💐希望能通过写博客加深自己对于学习内容的理解💐 🌸也能帮助更多人理解和学习🌸 花繁柳密处,拨…