《机器学习》决策树 C4.5算法、cart算法

2024-08-23 04:44

本文主要是介绍《机器学习》决策树 C4.5算法、cart算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是C4.5算法

1、概念

        C4.5算法是一种决策树生成算法,它使用信息增益比(gain ratio)来选择最优分裂属性,它是ID3算法的改进版本。

        C4.5算法的核心思想是选择信息增益比最大的特征作为节点进行划分,以获得最好的分类能力。它使用熵来度量数据集的不确定性,通过计算特征的信息增益来评估特征对分类的贡献程度。信息增益比越大,表示该特征对分类的影响越大。

公式及定义如下:

2、具体步骤如下:(全篇log底数为2)

        1、计算所有样本的类别熵(H)。

        2、对于每一个属性,计算该属性的熵【也为自身熵】(Hi)。

        3、对于每一个属性,计算该属性对于分类所能够带来的信息增益(Gi = H - Hi)。

        4、计算每个属性的信息增益比(gain ratio = Gi / Hi),即信息增益类别自身熵的比值。

选择具有最大信息增益比的属性作为分裂属性。

3、什么是自身熵

        即不考虑标签解结果来只考虑自己本身类别的比例

例如:A集合:[1,1,1,2,2,3,3,3,3]

        其自身熵为:-3/9log(3/9) - 2/9log(2/9) - 4/9log(4/9) = 1.5304930567574826(此处使用上节课所说的熵值计算公式)

        所以集合A的自身熵为 1.5304930567574826

4、实例,依旧是上节课的文件

4.1 计算第一层节点

        在上节课中,我们在第一步就求出了每个特征的信息增益,即:

 outlook  信息增益= 标签熵值 - 总熵值 = 0.2471

        自身熵 = -5/14log(5/14) - 4/14log(4/14) - 5/14log(5/14) = 1.577

        信息增益率 = 0.2471 / 1.577 = 0.1566

• temperature 信息增益 = 0.94 - 0.91 = 0.03

        自身熵 = -4/14log(4/14) - 6/14log(6/14) - 4/14log(4/14) = 1.557

       信息增益率 = 0.03 / 1.557 = 0.0186

• humidity信息增益 = 0.94 - 0.788 = 0.152

        自身熵 = -7/14log(7/14) - 7/14log(7/14) = 1.0

        信息增益率 = 0.152 / 1.0 =0.152

• windy信息增益 = 0.94 - 0.89 = 0.05

        自身熵 = -8/14log(8/14) - 6/14log(6/14) = 0.985

        信息增益率 = 0.05 / 0.985 = 0.049

所以有信息增益率的排序:

        天气 > 湿度 > 有风  > 温度

由此可知第一个节点为天气

此时得到以下决策树图形:

4.2 计算第二层节点
4.2.1 对hot,将hot单独取出

play 标签熵值 = -2/5log(2/5) - 3/5log(3/5) = 0.97

 temperature自身熵 = -2/5log(2/5) - 1/5log(1/5) - 2/5log(2/5) = 1.52

        信息增益 = play标签熵值 - 总熵值 =0.97 -(2/5*hot熵 + 2/5 *milld熵 + 1/5 *cool熵)= 0.57

        信息增益率 = 0.57 / 1.52 = 0.375

• humidity自身熵 = -3/5log(3/5) - 2/5log(2/5) = 0.97

        信息增益 = 标签熵值 - 总熵值 = 0.97 - 0 = 0.97

        信息增益率 = 1.0

• windy自身熵 = -3/5log(3/5) - 2/5log(2/5) = 0.97

        信息增益 = 标签熵值 - 总熵值 = 0.97 - (3/5 * FALSE熵值 + 2/5 * TRUE熵值)= 0.0192

        信息增益率 = 0.0192 / 0.97 = 0.02

由此可见,humidity天气信息增益率最大

4.2.2 对hot,将rainy单独取出

play 标签熵值 = -2/5log(2/5) - 3/5log(3/5) = 0.97

 temperature自身熵 = -3/5log(3/5) - 2/5log(2/5) = 0.97

        信息增益 = 0.97 - (3/5 * mild熵 + 2/5 * cool熵)= 0.0192

        信息增益率 = 0.0192 / 0.97 = 0.02

• humidity自身熵 = -3/5log(3/5) - 2/5log(2/5) = 0.97

        信息增益 = 标签熵值 - 总熵值 = 0.97 -(3/5 * normal熵 + 2/5 * high熵)= 0.0192

        信息增益率 = 0.0192 / 0.97 = 0.02

• windy自身熵 = -3/5log(3/5) - 2/5log(2/5) = 0.97  

        信息增益 = 标签熵值 - 总熵值 = 0.97 - 0 = 0.97

        信息增益率 = 1

所以由此可见,windy有风信息增益率最大

4.2.3 所以可得当前决策树图:

二、什么是CART算法

1、概念

        在分类问题中,CART算法通过构建一棵二叉决策树,将数据集划分为多个子集,使得每个子集内的样本属于同一类别。它通过对特征进行划分,选择最优的切分点来构建决策树。

        在回归问题中,CART算法同样构建一棵二叉决策树,但是目标是预测一个连续的数值。它通过对特征进行划分,选择最优的切分点来构建决策树。

        CART算法的优点包括简单易于实现、具有较好的解释性、对非线性关系的建模能力强等。它在实际应用中被广泛应用于分类和回归问题的解决。

2、衡量标准

        基尼指数,GINI,其公式及定义如下:

3、实例,有如下贷款申请数据表

        首先计算各特征值的基尼系数,选择最优特征以及其最优切分点,选择最优特征以及以A1,A2,A3,A4表示有年龄、有工作、有自己的房子和信贷情况4个特征,并以1,2,3表示年龄的值为青年、中年、和老年,以1,2表示有工作和有自己房子的值为是和否,以1,2,3表示信贷情况的值为非常好、好、一般。

1)此时计算特征值为A1=1(青年)的基尼指数:
        • 首先计算青年的基尼系数(5个青年,2个贷款)

                青年的基尼系数为:2/5 *(1-2/5)+ 3/5 *(1-3/5)= 0.48

        注意:如果是二分类,这里的基尼系数可以直接为:2p*(1-p) = 2*2/5(1-2/5) = 0.48

                非青年的基尼系数为:2 * (3/10) * (1-3/10) = 0.42

        注意:这里的非青年为中年和老年

        所以,此时的总基尼指数为:5/15 * 0.48 + 10/15 * 0.42 = 0.44

2) 此时计算特征值为A1=2(中年)的基尼指数:

直接看总公式:

3) 此时计算特征值为A1=3(老年)的基尼指数:

因为老年和青年一样最小,所以都可以作为最优切分点

4)计算所有特征的基尼指数

分别计算A2(有工作)、A3(有自己房子)、A4(信贷情况)的基尼指数

同样通过上一步得到

A2=1(有工作):基尼系数为 0

A2=0(没有工作):基尼系数为 2 * 6/10 * (1 - 6/10) = 0.48

所以A2总基尼指数为:0.48 * 10/15 = 0.32

同理:A3(有自己房子)基尼指数为 0.27

A4总基尼指数为 :

A4=3(一般)基尼指数最小,为最优切分点

        所以,在A1,A2,A3,A4几个特征中,Gini(D,A3=1)=0.27最小,所以选择特征A3为最优特征A3=1为其最优切分点,于是根结点生成两个子结点,一个是叶结点,对另一个结点继续使用以上方法在A1,A2,A4中选择最优特征及其最优切分点,结果是A2=1,依此计算得知,所得结点都是叶结点.
        对于本问题,按照 CART算法所生成的决策树与按照 ID3算法所生成的决策树完全一致.

有上述结果可以画决策树如下所示:

        剩下的方法和上述基本一致,即切分出有房子的和没有房子的两组,分别对有房子和没房子对应的整个数据求基尼指数,最后即可得到下一步,切分结果如下所示:

这篇关于《机器学习》决策树 C4.5算法、cart算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098387

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1