决策树 (Decision Tree) 原理简述及相关算法(ID3,C4.5)

2024-04-01 06:38

本文主要是介绍决策树 (Decision Tree) 原理简述及相关算法(ID3,C4.5),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Decision Tree 决策树:
决策树是属于机器学习监督学习分类算法中比较简单的一种,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 
下面来看个范例,就能很快理解了。

范例:
假设,我们有以下数据,表示当天是否回去玩高尔夫:

用决策树建立起来后,能得到这样的模型:

至此可以看出,说白了,决策树就是If()语句的层层嵌套,知道最后能总结出点什么。(原谅我实在不会描述点什么,不过看了这图应该对决策树有个大致的了解了吧。)

决策树中的元素:
决策树中的元素基本和树中的差不多。
最上面的一个称为根节点,如上图的Outlook,用数据中的属性作为根节点或是节点,如Humidity,Windy等。
分支使用的是节点属性中的离散型数据,如果数据是连续型的,也需要转化成离散型数据才能在决策树中展示,如上图将Outlook属性作为根节点,sunny,overcast,rain作为该节点的三个分支。

信息熵 Entropy:
现在,问题来了,在算法中如何确定使用数据的哪个属性作为根节点或是节点。当然不能随便选,我们追求的一直都是最优解,即使是局部最优。因此我们需要引入信息熵这个概念。
1948年,香农提出了“信息熵”概念。一条信息的信息量大小和它的不确定性有直接的关系。我们对一样东西越是一无所知,想要了解它就需要越多的信息。
举个栗子,如果我随机一个1-8之间的数字,给你猜,只回答你是或否。那最好的猜测方式应该是,“是不是在1-4之间?”,如果得到否,我们就知道在5-8之间,如果得到是,我们继续猜“是否在1-2之间?”。这样的话,我们只需要猜3次就能知道这个数到底是几。转化为信息熵公式就是:

根据这公式和例子,我们能得到结果是3,这是因为我们对1-8数字可能被选取的概率一无所知,如果比如说1-8选取概率并不是均匀分布的,我们就能更快的找到相应的数字,因此信息熵也会相应的变小。
总结下,如果一个变量的不确定越大,熵值也越大。

决策树归纳算法 ID3:
Information Gain:
又称信息获取量或是信息增益,将样本的所有属性分割开,分别计算,熵之和,信息增益就是二者的差值。

简单理解就是,没有属性A时候的信息量-有A时候的信息量。

举个栗子,假设我们有以下数据,买电脑的人与不买电脑的人:


可以看出,在此数据中,总数据量14个,买电脑的人9个,不买电脑的人5个,因此,Info(D)计算方式如下:

然后,我们想计算下age属性的信息量,<30的5人,<30并买电脑的2人,不买的3人,其余31-40,>40方法同理,因此计算方式如下:


因此Gain(age) = 0.940-0.694 = 0.246
再对比下其余属性Gain(Income)=0.029,Gain(Student)=0.151,Gain(Credit_rating)=0.048,因此可以看出,age属性信息量最大,因此选择age属性作为根节点。计算节点方法同理。

C4.5算法:
ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。
C4.5算法首先定义了“分裂信息”,其定义可以表示成:

其中各符号意义与ID3算法相同,然后,增益率被定义为:

C4.5选择具有最大增益率的属性,ID3选择最大信息获取量的属性,其余没啥差别,也就不赘述了

决策树其余算法:
决策树其余算法还有C4.5,CART算法,共同点为都是贪心算法,区别为度量方式不同,就比如ID3使用了信息获取量作为度量方式,而C4.5使用最大增益率。

如果属性用完了怎么办:
如果属性全部用完,但是数据还不是纯净集怎么办,即集合内的元素不属于同一类别。就比如上述买电脑的例子中,如果age,Credit_rating,Student,Income都相等,但是有人买电脑,有人不买电脑,那决策树怎么决策?在这种情况下,由于没有更多信息可以使用了,一般对这些子集进行“多数表决”,即使用此子集中出现次数最多的类别作为此节点类别,然后将此节点作为叶子节点。

剪枝:
作为决策树中一种放置Overfitting过拟合的手段,分为预剪枝和后剪枝两种。
预剪枝:当决策树在生成时当达到该指标时就停止生长,比如小于一定的信息获取量或是一定的深度,就停止生长。
后剪枝:当决策树生成完后,再进行剪枝操作。优点是克服了“视界局限”效应,但是计算量代价较大。

决策树优点:
直观,便于理解,在相对短的时间内能够对大型数据源做出可行且效果良好的结果,能够同时处理数据型和常规型属性。

决策树缺点:
可规模性一般,连续变量需要划分成离散变量,容易过拟合。
 

伪代码:

 

这篇关于决策树 (Decision Tree) 原理简述及相关算法(ID3,C4.5)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

openCV中KNN算法的实现

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

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

springboot+dubbo实现时间轮算法

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

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、