①《全网最强》详解机器学习分类算法之决策树(附可视化和代码)

简介: 《全网最强》详解机器学习分类算法之决策树(附可视化和代码)

走进决策树

决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的 if/else 问题中进行学习,并得出结论。

说到决策树,那么最容易想到的就是在程序语言中的条件判断语句,if and else 可谓是是决策树的本质。


下面通过两个案例对其进行本质的剖析:


案例一

想象一下,你想要区分下面这四种动物:熊、鹰、企鹅和海豚。你的目标是通过提出尽可能少的 if/else 问题来得到正确答案。你可能首先会问:这种动物有没有羽毛,这个问题会将可能的动物减少到只有两种。如果答案是“有”,你可以问下一个问题,帮你区分鹰和企鹅。例如,你可以问这种动物会不会飞。如果这种动物没有羽毛,那么可能是海豚或熊,所以你需要问一个问题来区分这两种动物——比如问这种动物有没有鳍。


image.png


在这张图中,树的每个结点代表一个问题或一个包含答案的终结点(也叫叶结点)。树的边将问题的答案与将问的下一个问题连接起来。用机器学习的语言来说就是,为了区分四类动物(鹰、企鹅、海豚和熊),我们利用三个特征(“有没有羽毛”“会不会飞”和“有没有鳍”)来构建一个模型。我们可以利用监督学习从数据中学习模型,而无需人为构建模型。


案例二

理想总是很美好,但是现实确实很骨感。随着中国人口比例失衡,很多适龄青年都会面对一个严峻的考验,那就是“择偶”,正所谓“你在桥上看风景,看风景的人在看你”,那么多少人在进行另一半的寻找的时候,会考虑什么因素呢?下面看一张决策树的现象图:


image.png


你是否也是上述的标准呢?


灵魂的树

在编程中, if-else所依赖的判断条件是由程序员来填写,但在机器学习里,我们能做的只有两件事,第一件事是选择模型,第二件事是往模型“嘴”里塞数据,剩下的就只能坐在一旁干着急。上面这棵可以决策的树得依靠我们把判别条件填进去,它要想成为真正的决策树,就得学会怎样挑选判别条件。这是决策树算法的灵魂,也是接下来需要重点探讨的问题。


第一个要紧问题就是:判别条件从何而来呢?分类问题的数据集由许多样本构成,而每个样本数据又会有多个特征维度,譬如学生资料数据集的样本就可能包含姓名、年龄、班级、学号等特征维度,它们本身也是一个集合,我们称为特征维度集。数据样本的特征维度都可能与最终的类别存在某种关联关系,决策树的判别条件正是从这个特征维度集里产生的。


部分教材认为只有真正有助于分类的才能叫特征,原始数据里面的这些记录项目只能称为属性(Attribute),而把特征维度集称为属性集,所以在这些教材中,决策树是从称为树形集的集合中选择判别条件。这里为了保持本书用语的连贯性,我们仍然称之为“特征维度”。当然,这只是用语习惯上的不同,在算法原理上是没有任何区别的。


决策树的选择机制

活经验告诉我们:挑重要的问题先问。决策树也确实是按这个思路来选择决策条件的。思考这个问题,可以从“怎样才算是好的决策条件”开始。决策树最终是要解决分类问题,那么最理想的情况当然是选好决策条件后,一个if-else就正好把数据集按正类和负类分成两个部分。


不过,现实通常没有“一刀切”这么理想,总会有一些不识时务的样本“跑”到不属于自己的类别里,我们退而求其次,希望分类结果中这些不识时务的杂质越少越好,也就是分类结果越纯越好。


依照这个目标,决策树引入了“纯度”的概念,集合中归属同一类别的样本越多,我们就说这个集合的纯度越高。每一次使用if-else进行判别,二元分类问题的数据集都会被分成两个子集,那么怎么评价分类的效果呢?可以通过子集的纯度。子集纯度越高,说明杂质越少,分类效果就越好。


节点纯度的度量规则

使用决策树这套框架的分类算法有很多,其中最著名的决策树算法一共有三种,分别是ID3、C4.5和CART,这三种决策树算法分别采用了信息增益、增益率和基尼指数这三种不同的指标作为决策条件的选择依据。

虽然三种决策树算法分别选择了三种不同的数学指标,但这些指标都有一个共同的目的:提高分支下的节点纯度(Purity)。

决策树算法中使用了大量二叉树进行判别,在一次判别后,最理想的情况就是二叉树的一个分支纯粹是正类,另一个分支纯粹是负类,这样就意味着完整和准确地完成了一次分类。但大多数的判别结果都没有这么理性,所以一个分支下会既包含正类又包含负类,不过我们希望看到的是一个分支包含的样本尽可能地都属于同一个类,也就是希望这个分支下面的样本类别越纯越好,所以用了“纯度”来进行描述。纯度有三点需要记住:


   当一个分支下的所有样本都属于同一个类时,纯度达到最高值。

   当一个分支下样本所属的类别一半是正类一半是负类时,纯度取得最低值。

   纯度考察的是同一个类的占比,并不在乎该类究竟是正类还是负类,譬如某个分支下无论是正类占70%,还是负类占70%,纯度的度量值都是一样的。


纯度的度量方法

我们的任务就是要找到一种满足纯度达到最大值和最小值条件的纯度度量函数,它既要满足这三点需求,又要能作为量化方法。

现在让我们把这三点要求作成图像(可视化的图像有助于更直观地理解),同时,如果我们能够找到一款函数符合这个图像,就等于找到了符合条件的函数。我们约定所作图像的横轴表示某个类的占比,纵轴表示纯度值,首先来分析极值点的位置。

根据第一点要求,某个类占比分别达到最大值和最小值时,纯度达到最高值。最大值好理解,为什么最小值也能令纯度达到最高?可以反过来想,这个类取得最小值时,另一个类就取得了最大值,所以纯度也就最高。根据分析,我们知道了纯度将在横坐标的头尾两个位置达到最大值。

根据第二点要求,纯度的最小值出现在某个类占比为50%的时候。换句话说,当横坐标为0.5时,纯度取得最低值。

现在可以作出图像了。根据上述分析的纯度最高值和最低值随类占比的变化情况,我们用一条平滑的曲线连接起这三个点,则所作出来的图像应该类似一条微笑曲线


image.png


不过我们在机器学习中更喜欢计算的是“损失值”,那么对纯度度量函数的要求正好与纯度函数的要求相反,因为纯度值越低意味着损失值越高,反之则越低。所以纯度度量函数所作出来的图像正好相反


image.png


决策树算法背景介绍

最早的决策树算法是由Hunt等人于1966年提出的CLS。后来的决策树算法基本都是基于Hunt算法框架的改进。


当前最有影响力的决策树算法是Quinlan于1986年提出的ID3和1993年提出的C4.5(现在已经进化到C5.0),以及BFOS(Breiman、Friedman、Olshen、Stone)四位学者于1984年提出的CART算法。


image.png


追溯其原理,决策树的算法原理就是如此的清晰 ,建立决策树的关键,即在当前状态下选择哪个属性作为分类依据


image.png


信息(Information)和信息的量化

假设:X为某随机变量,xi表示X的某个取值,p(xi) 指当X=xi的概率,I(X=xi)表示X=xi的信息量


image.png

该函数满足: 当一个事件发生的概率越大(确定性越大), 它所携带的信息量就越小, 反之, 当一个事件发生的概率越小(确定性越小), 它所携带的信息量就越大。


1. 当小概率事件发生时, 我们才会感觉’信息量大’


2. 当大概率事件发生时, 我们会感觉’理所应当’, ‘信息量小-正常操作’


也就是越容易发生的事件,那么它所携带的信息量就越小,因为不需要去寻找这些多因素


信息熵(Information Entropy)

熵(Entropy): 事件不确定性的度量

信息熵: 实质上就是对事件的不确定性程度的度量,也可以理解为一个事件集的平均信息量


image.png


例如:已知小明及格的概率为0.2, 不及格的概率为0.8, 那么小明成绩的不确定性如何度量呢?


H(小明成绩)=−0.2∗(log20.2)+(−0.8∗(log20.8))=0.7219


这就是信息熵的公式,那么假如小明的及格的概率是:0.5,不及格的概率也是:0.5,那么它的信息熵就是:1


条件熵(Conditional Entropy)

条件熵:是为解释信息增益而引入的概念,即在给定条件X的情况下Y的信息熵。以下是公式定义:


image.png


image.png




这是一个典型的二分类问题:是否为鱼


信息熵:H(是否为鱼)=-P(是鱼)*log2P(是鱼)-P(不是鱼)*log2P(不是鱼)=-2/5*log22/5-3/5*log23/5=0.971


条件熵:H(是否为鱼|是否用鳃呼吸)=P(用鳃呼吸)*H(是否为鱼|用鳃呼吸)+P(不用鳃呼吸)*H(是否为鱼|不用鳃呼吸)=3/5*(-2/3*log22/3-1/3*log21/3)+2/5(0-1log21)=0.551


H(是否为鱼|是否有鳍)=P(有鳍)*H(是否为鱼|有鳍)+P(没有鳍)*H(是否为鱼|没有鳍)=4/5*(-1/2*log21/2-1/2*log21/2)+1/5(0-1log21)=0.8


信息增益(Information Gain,ID3算法使用)

信息增益: 事件中某一影响因素的不确定性度量对事件信息不确定性减少的程度,即得知特征X的信息而使得类Y的信息不确定性减少的程度。

如果H(D)为集合D的信息熵,H(D|A)为集合D在特征A下的条件熵,则信息增益可表述为如下数学公式:


image.png


即集合D的信息熵H(D)与D在特征A下的条件熵H(D|A)之差


ID3算法中选取最优分裂属性的策略


首先计算未分裂前当前集合D的信息熵H(D)

然后计算当前集合D对所包含的所有属性A的条件熵H(D|A)

然后计算每个属性的信息增益IG(D|A):

             IG (D|A)=H(D)−H(D|A)  

选取信息增益最大的属性AIG=max作为决策树进行分裂的属性


信息增益总结

优点:

1)考虑了特征出现与不出现的两种情况,比较全面。

2)使用了所有样例的统计属性,减小了对噪声的敏感度。

3)容易理解,计算简单。

缺点:

1)信息增益考察的是特征对整个系统的贡献,没有到具体的类别上,所以一般只能用来做全局的特征选择,而没法针对单个类别做特征选择

2)算法天生偏向选择分支多的属性,容易导致过拟合(overfitting)

极端的例子:如果ID被当成一个属性,那么ID属性的信息增益会最大。因为按照ID划分数据集合可以得到最纯的子集,即每一个ID所在样例都会归属于单一类别,故其条件熵为0。


信息增益率: 因为信息增益会倾向于取值最多的属性,会导致过拟合问题,所以需要引入一个惩罚参数,即数据集D以特征A作为随机变量的信息熵的倒数:


image.png


存在与信息增益相反的缺点,即偏向于取值最少的属性,因为属性A取值越少,H(A)也越小,导致IGA(D|A)越大。


基尼指数(Gini Index,CART算法使用)

基尼指数: 是一种与信息熵类似的做特征选择的指标,可以用来表征数据的不纯度。其计算公式为:

image.png



1、Pk表示选中的样本属于k类别的概率,不属于K类别的概率则为(1− Pk)


2、样本集合中有K个类别,一个随机选中的样本可以属于这k个类别中的任意一个,因而对类别就加和


3、当为二分类时,Gini(p)=2p(1−p)


基尼指数解读


基尼指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之集合越不纯。即:基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率


样本集合D的Gini指数:假设集合中有K个类别,则:

image.png



基于特征A划分样本集合D之后的基尼指数:

image.png




相关文章
|
6天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
21 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
18天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
14天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
11天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
10天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。