决策树 (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编译生成多个.class文件的原理和作用

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

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

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

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

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

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

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

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4