机器学习的练功方式(七)——决策树

文章目录

    • 致谢
  • 7 决策树
    • 7.1 认识决策树
    • 7.2 决策树原理
    • 7.3 信息论
      • 7.3.1 信息熵
        • 7.3.1.1 熵
        • 7.3.1.2 信息
        • 7.3.1.3 信息熵
      • 7.3.2 信息增益
    • 7.4 决策树实现
    • 7.5 决策图
    • 7.6 后话

致谢

信息熵是什么? - 知乎 (zhihu.com)

没有免费午餐定理_百度百科 (baidu.com)

7 决策树

决策树(decision tree)是功能强大而且相当受欢迎的分类和预测算法。其属于有监督学习的一种,以树状图为基础。决策树分为预测决策树和回归决策树。其使用一系列的if-then语句来作为决策方法。在下面的讲解时,我们优先讲解分类决策树。

7.1 认识决策树

我们用下面的一个例子来讲明决策树的分类原理。

我们根据每个用户的年龄、工作情况、有无自己房子和信贷情况来判断银行是否允许该用户贷款。

image-20220309181201232

如果我们先看房子的情况、再看工作情况,那我们可以很快地判断出是否可以给该用户贷款;而如果先看年龄,信贷情况,工作这三个特征,那么判断的速度就要慢很多。决策树致力于在这些顺序中找出一个最快的顺序,并以该顺序迅速分类。

从上面的叙述中我们可以总结出:我们可以把决策树看成是一个if-then规则的集合。在决策树的每条路径中,我们可以构建对应的规则决定特征选取的先后,而叶结点则对应该规则的结论。

7.2 决策树原理

我们再引入一个例子:我们现在有一个招生办公室获取的关于学生的两项数据,也就是他们在一场考试中的考试成绩(test)和等级(grades)。我们将这些同学的数据画在散点图上,蓝点同学表示可以被录取,而红点同学表示不可以被录取,如下图所示:

image-20220309182511061

在这里我们提问,在成绩和等级之间,哪一项对学生的录取与否更具决定性?

这个问题实际上我们很难回答,但是我们可以用一条横线来划分。如果是Grades比较重要,那我们就用一条横线试图一次性将红蓝点分开。

image-20220309182933886

我们把这种在特征空间中根据某个特征来划分类别的方式叫做特征选择。体现在这个例子中,其中考试成绩为横坐标,等级为纵坐标,那么问题就变成了,在横坐标和纵坐标中,哪一项能更好地分割数据。

如果像上图一样划一道横坐标线,那么确实可以分类一部分,但是效果不是很好。有七个蓝点跑到红点群这边过来了。

如果是Test比较重要,那我们就用一条竖线试图一次性划分红蓝点。

image-20220309183132722

当竖线移到5的位置时,我们发现此时分类效果最好,只有5个点不能被分类出来。这也就意味着,分离这些数据的最佳特征是考试成绩。

我们可以把上述过程用一个决策树来表示,决策树由节点和有向边组成,内部节点表示一个特征或者属性,叶子节点表示一个分类。使用决策树进行分类时,将实例分配到叶节点的类中,该叶节点所属的类就是该节点的分类。

此刻我们开始构建决策树的第一个步骤,特征选择。

特征选择就是选取有较强分类能力的特征。如果利用某些特征进行分类的结果和随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。分类能力通过信息增益(ID3)或者信息增益比来刻画。

选择特征的标准就是找出局部最优特征作为判断进行切分,取决于切分后节点数据集合中类别的有序程度(纯度),划分后的分区数据越纯,切分规则就越合适,衡量节点数据集合的纯度有:熵、基尼系数和方差。熵和基尼系数都是针对分类的,方差是针对回归的。

上面的这段话话可能信息量太大,如果你听不懂没关系我们下面会继续谈到他。我们回到我们的例子继续看,如果我们不能一次性就把两类学生分出来,那么我们分两次呢?

image-20220309183605327

明显地,我们第一次分类考试成绩是最佳特征,而第二次分类考试等级为最佳特征。

经过上面的叙述我们可以知道这么一件事:我们构建决策树是将所有的训练样本都放于根节点。然后我们根据一个最优特征将所有训练样本分割成若干个子集,确保各个子集有最好的分类效果。如果分类效果已经达到我们的目的,那我们直接构建叶结点,并且将子集划分到对应的叶结点中。如果分类效果没有达到我们的目的,则对该子集继续划分。

7.3 信息论

决策树根据不同的分类依据可以分为不同的决策树,常见的决策树有ID3(信息增益)、C4.5(信息增益比)、CART(基尼系数)。在下面的小节中,我会着重介绍分类依据的原理,让我们接着看下去吧!

7.3.1 信息熵

7.3.1.1 熵

熵是一个物理学概念,第一次初见可能是在高中物理课本的热力学那一部分。但是在信息学中,熵就是另外一个意思了。别急,让我们接着往下看。

我们来看下面关于液态水结构的三张图。由于冰中的粒子活动空间较小,其结构比较坚固,粒子大多数都固定不动,液态水的结构坚固程度次之,粒子有一定的活动空间,而水蒸气的结构则处于另外一个极端,一个粒子的去向有多种可能性,可经常移动。

image-20220310092505825

说白了熵其实就是描述粒子的无序性,冰很有序很稳定,所以熵最小。

7.3.1.2 信息

让我们来看看信息是什么。假如现在小明说了一句话:我今年19岁。那么这句话已经表明了小明今年19岁,所以我们说小明的话是一条信息。假设在小明说完之后,小刚说了一句:小明明年就20岁了。那么这完全是一个废话,它在之前确定的信息的基础上又重复了一遍,所以我们说小刚的话不是信息。

从上面的例子揭示了一件事。信息是不能重复的。

现在小明又说了一句话:我可能有女朋友。这就意味着情况多变,小明有可能有女朋友也有可能没女朋友;换而言之,小明这句话信息量很大,不确定性很多。

从上面的例子揭示了一件事,信息量的大小和不确定性有关。

现在我们需要思考一个问题:信息是否可被量化?在这里我直接告诉你结论,信息是可以被量化的,量化的大小就是用信息熵。从上面的例子来看,消除熵意味着获取信息。

7.3.1.3 信息熵

信息熵的公式怎么推断呢?

  • 我觉得信息熵肯定不是一个负数。不然说句话就反偷别人的信息,那别人都懵逼了不是?你说句话把我银行卡密码的信息给偷了。
  • 信息应该和不确定性有关,如果可能的结果越大,则信息就越多。

我们来看下面一个例子:

熵可以用概率来解释。一些桶里装了小球,不同的桶中装了不同的球。如果现在要我们猜想这些球是怎么摆放的,那么第一个桶里毋庸置疑的肯定是四个红。

在第二个桶中装了三红一蓝,这就意味着要我们摆放有多种可能,根据我们上面提到的,这个桶中的信息熵就比较大了。同样地,第三个桶包含的信息熵比第二个桶还要大。

image-20220310094318389

当我们把球作放回抽取,则每次抽取都是独立重复事件,也就是说,我们抽到在第一个桶抽到四个红球的概率是1,当我们在第二个桶抽三红一蓝的概率,这时候是大约百分之十,在第三个桶抽二红二蓝的概率大约是百分之六。如下图所示:

image-20220310094704720

然而,这些结果可能会因为我们的两个问题而感到费解。

第一,假如我们有一千个球,那么我们得到一千个球的积,这个积总位于零和一之间,有可能非常小5;第二就是,稍微如果改变其中一个因素,可能就会对最后的积产生极大的影响,如上面第一个桶抽到四颗红球概率为1,而第二个桶抽三红一篮概率却突然变为0.105。

为此,我们需要更可控的因素。还有什么比积更好呢?

答案是和,但是我们如何将积的运算转为和的运算呢?答案是对数,因为积的对数等于各自对数之和。

基于信息理论与概率统计,我们采用底数为2或用底数为e(自然对数)的对数函数。而又由于前面提到的防止信息熵变负,而在这里我们的P<=1,对数为负,所以我们在前面填个负号。

在此,我们正式给出信息熵的公式,其用于度量随机变量的不确定性:
H(X)=−∑i=1nP(xi)logbP(xi)H(X)= -\sum^n_{i=1}P(x_i)log_bP(x_i) H(X)=i=1nP(xi)logbP(xi)
其单位为比特。我们看看小球的例子怎么应用这个公式,如下图所示:

image-20220310095535232

掌握了公式了,让我们试着解决7.1例子中的熵问题。

image-20220309181201232

假如我们要求这个数据中的总熵,设训练数据集为D,则H(D)=−(615∗log2615+915∗log2915)=0.971H(D) = -(\frac{6}{15}*log_2{\frac{6}{15}}+\frac{9}{15}*log_2\frac{9}{15}) = 0.971H(D)=(156log2156+159log2159)=0.971。其中615\frac{6}{15}156为不可以贷款的用户概率,915\frac{9}{15}159为可以贷款的用户概率。

7.3.2 信息增益

信息增益就没法用朴素的例子讲了,我们直接给出简短定义:特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)于特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:g(D,A)=H(D)−H(D∣A)g(D,A) = H(D) - H(D|A)g(D,A)=H(D)H(DA)

可能讲到这里大家都会很懵,我们为什么要讲信息增益,我们不是要对某一个关键特征动手来尽可能地划分数据吗?实际上,信息增益刻画的是由于特征A而使得对数据集D的分类的不确定性减少的程度,当不确定性程度最大化,则信息增益最大化,则分类后的数据确定性高,分类较完美。所以我们的目的是构建决策树选择信息增益大的特征来划分数据集。

H(D)H(D)H(D)我们是知道怎么求的,那H(D∣A)H(D|A)H(DA),也就是所谓的条件熵怎么求。

在这里我们给出条件熵的公式:
H(D∣A)=∑i=1n∣Di∣DH(Di)H(D|A) = \sum^n_{i=1} \frac{|D_i|}{D} H(D_i) H(DA)=i=1nDDiH(Di)
拿上例的银行贷款作说明。当我们以A1、A2、A3、A4代表年龄、工作、房子有无情况、贷款情况,然后计算对应的条件概率,在通过这些计算信息增益,最终选择信息增益大的对应那个特征即为关键特征。然后按照我们在7.2讲的方法那样循环即可。

7.4 决策树实现

说完了原理,我们来看一下如何实现一个决策树。

sklearn.tree.DecisionTreeClassifier(criterion = ‘gini’, splitter = ‘best’, max_depth = None,random_state = None)

  • criterion:默认是’gini’(基尼)系数,你也可以改成其他判别依据
  • splitter:指定切分方式,'best’为选择最优切分,'random’为随机切分
  • max_depth:树的深度大小
  • random_state:随机数种子

我们来使用上述的API来实现我们的鸢尾花分类吧!

# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifierdef load_data():"""获取数据集"""iris = load_iris()x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=4)return x_train, x_test, y_train, y_testdef decision_iris():"""决策树算法"""# 1 获取数据集x_train, x_test, y_train, y_test = load_data()# 2 预估器实例化estimator = DecisionTreeClassifier(criterion="entropy")# 3 训练数据集estimator.fit(x_train, y_train)# 4 模型评估score = estimator.score(x_test, y_test)print("准确率为:\n", score)decision_iris()

7.5 决策图

当训练完一颗决策树时,我们是可以通过tree包下的方法来对决策的整个树状过程进行打印输出的。其方法如下所示:

sklearn.tree.export_graphviz((estimator, out_file=“iris_tree.dot”, feature_names=iris.feature_names))

  • estimator:预估器
  • out_file:输入文件,后缀名必须得为dot
  • feature_name:指定输出的特征名

需要注意的是,通过输出后的文件为dot字符文件,如果想要转成可视化,需要用到Graphviz工具

这里要求安装Graphviz程序。Graphviz是贝尔实验室开发的一个开源的工具包,用于绘制结构化的图形网络,支持多种格式输出,如常用的图片格式、SVG、PDF格式等,且支持Linux/Window操作系统。

我们来对上一节鸢尾花的分类绘制决策图吧。

# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphvizdef decision_iris():"""决策树算法"""# 1 获取数据集iris = load_iris()x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=4)# 2 预估器实例化estimator = DecisionTreeClassifier(criterion="entropy")# 3 训练数据集estimator.fit(x_train, y_train)# 4 模型评估score = estimator.score(x_test, y_test)print("准确率为:\n", score)# 5 决策树可视化export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)decision_iris()

当启动代码后,一份名为iris_tree.dot的文件会出现在项目文件夹中。我们可以使用Graphviz进行转换。

这里我们有两种转换方式:

一种是直接打开Webgraphviz这个在线工具包,把dot文件内容复制完粘贴绘制即可。但是我后来试了一下这个网站好像坏了,你们也可以试试。

第二种是使用Graphviz工具包,步骤如下:

  • 使用conda install Graphviz指令在cmd或者Anaconda prompt进行下载
  • 下载完成后用dot -version查看是否下载成功
  • 利用cd命令进入dot文件所在位置
  • 使用dot -Tpdf iris_tree.dot -o iris_tree.pdf进行转换
  • 查看桌面pdf文件

效果如下:

image-20220310175343666

7.6 后话

这一讲就到这里吧,虽然,没有讲到决策回归树,但是我相信我们与它还会见面的,而这么做的目的是,一口气吃成一个胖子是不现实的。在这一讲中,实际上API里面很多其他的参数我都没说,这是因为要考虑我们是初学者的缘故,当你学懂这一讲的时候,你可以看一些偏向于机器学习代码实现的书,它们讲的都比我全。

至于决策树我们可以看到,其分类的准确率和KNN的准确率是不太一样的。实际上,这正是业界内经常谈到的——没有免费午餐定理。不同的算法在同一个训练过程中的表现是不一样的。如果我们不对特征空间有先验假设,则所有算法的平均表现是一样的。

也就是说,没有所谓的世界上最好的算法,只有公认的好方法(支持向量机、决策树、神经网络等)。在进行分类或回归时,我们可以采用不同的算法和调参去提高准确率。

在下一讲中,我们会补全这一讲没有谈到的随机森林和剪枝,如果我还有精力的话,我会再说说其他决策树算法。感谢您的观看。

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

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

相关文章

机器学习的练功方式(八)——随机森林

文章目录致谢8 随机森林8.1 引入8.2 决策森林8.2.1 集成学习方法8.2.2 什么是随机森林8.2.3 无偏估计8.2.4 决策森林原理过程8.2.5 决策森林算法实现8.3 总结致谢 如何理解无偏估计&#xff1f;无偏估计有什么用&#xff1f;什么是无偏估计&#xff1f;_司南牧|知乎|博客|易懂教…

并行计算(一)——并行计算机系统及结构模型

致谢 SMP、COW、PVP、MPP计算机相关_神.秘.人的博客-CSDN博客_并行向量处理机 1 并行计算机系统及结构模型 1.1 并行计算 在下面的讲解之前&#xff0c;我们先看一下并行计算的量纲。 1.1.1 并行计算和计算机科学 随着计算机和计算机学科的发展&#xff0c;所有的学科都转向…

【机器学习实战】极大似然法

2019独角兽企业重金招聘Python工程师标准>>> http://baike.baidu.com/link?url3Ej1VIItwWd35sXeoRWRhcJkJLCFvzPzNIoTkAfai8ZIS4Ppcch4_maQ25FjNCU1Eplsp4k3oPKLyv6VIsPhsq 一、 最大似然法是一种具有理论性的点估计法&#xff0c;基本思想是&#xff0c;当从模型…

机器学习的练功方式(九)——线性回归

文章目录致谢9 线性回归再相遇9.1 再遇9.1.1 概述9.1.2 矩阵和向量9.1.3 矩阵加减乘除9.1.3.1 矩阵——矩阵加减9.1.3.2 矩阵——标量加减乘9.1.3.3 矩阵——向量相乘9.1.3.4 矩阵——矩阵相乘9.1.3.5 矩阵的逆9.1.3.6 矩阵的转置9.1.4 向量化9.1.5 广义线性模型9.2 正规方程9.…

12个月份统计分组

/** 根据月份来统计trade里面的入账&#xff0c;支出&#xff0c;总盈利*/public function countMonth(){$in array();$out array();$res array();$year date("Y",time());$in_sql SELECT SUM(money) AS mon, FROM_UNIXTIME(cdate, "%m") AS m FR…

idea 调试技巧1

1 多线程调试 开发过多线程应用的朋友应该有体会&#xff0c;有些时候&#xff0c;为了观察多个线程间变量的不同状态&#xff0c;以及锁的获取等&#xff0c;就会想到在代码里加个断点debug一下。 在IDE里断点停下来的时候&#xff0c;可以切换到另外的线程中&#xff0c;跑其…

SQL server 复习一

第一天 下面我们从最基础的开始&#xff1a; 在运行里面输入:services.msc 一、启动服务 二、数据库登录的两种身份验证方式 另外一种身份验证方式就是SQL Server身份验证. sa不能使用的时候可以这样的操作&#xff1a; 1.用windows登录&#xff0c;然后在“实例”右键“属性”…

[分享]iOS开发-实现view底部控件随着键盘的弹出而上移的效果

首先说一下思路&#xff1a;想要达到底部控件随着键盘的弹出而上移的效果&#xff0c;那么我们必然需要的到键盘在弹出时的高度&#xff0c;以及原点坐标。说白了我们的大致思路就是&#xff0c;用view的高度&#xff0d;键盘弹出时的高度&#xff0c;得到的值就是底部控件与vi…

深度学习修炼(二)——数据集的加载

文章目录致谢2 数据集的加载2.1 框架数据集的加载2.2 自定义数据集2.3 准备数据以进行数据加载器训练致谢 Pytorch自带数据集介绍_godblesstao的博客-CSDN博客_pytorch自带数据集 2 数据集的加载 与sklearn中的datasets自带数据集类似&#xff0c;pytorch框架也为我们提供了数…

Css3之基础-5 Css 背景、渐变属性

一、CSS 背景概述背景属性的作用- 背景样式可以控制 HTML 元素的背景颜色、背景图像等 - 背景色- 设置单一的颜色作为背景- 背景图像- 以图片作为背景- 可以设置图像的位置、平铺、尺寸等二、CSS 背景属性背景色 background-color - 属性用于为元素设置背景色- 接受任何合法的颜…

机器学习的练功方式(十)——岭回归

文章目录十 岭回归10.1 岭回归的接口10.2 岭回归处理房价预测十 岭回归 岭回归是线性回归的改进&#xff0c;有时候迫不得已我们的参数确实不能少&#xff0c;这时候过拟合的现象就可能发生。为了避免过拟合现象的发生&#xff0c;既然不能从减少参数上面下手&#xff0c;那我…

OpenCV修养(一)——引入

文章目录1 引入1.1 OpenCV是啥1.2 OpenCV——Python1 引入 1.1 OpenCV是啥 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高…

被解放的姜戈08 远走高飞

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 转载请先与我联系。 之前在单机上实现了一个Django服务器&#xff08;被解放的姜戈07 马不停蹄&#xff09;&#xff0c;现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 看着复仇的火焰…

OpenCV修养(二)——OpenCV基本操作

文章目录2 OpenCV基本操作2.1 IO操作2.2 图像基本操作2.2.1 图像绘制2.2.1.1 绘制直线2.2.1.2 绘制圆形2.2.1.3 绘制矩形2.2.1.4 添加文字2.2.1.5 试手2.2.2 获取/修改图像的像素点2.2.3 获取图像属性2.2.4 图像通道拆分/合并2.2.5 色彩空间改变2.2.6 边界填充2.3图像算数操作2…

ylbtech-LanguageSamples-Porperties(属性)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Porperties(属性)1.A&#xff0c;示例(Sample) 返回顶部“属性”示例 本示例演示属性为何是 C# 编程语言必不可少的一个组成部分。它演示了如何声明和使用属性。有关更多信息&#xff0c;请参见属性&#xff08;C# 编…

Altium Designer敷铜的规则设定

InPolygon 这个词是铺铜对其他网络的设置,铺铜要离其他网络远点,因为腐蚀不干净会对 电路板有影响... 问题一:: 如下图所示&#xff0c;现在想让敷铜与板子边界也就是keepoutlayer的间距小一点&#xff0c;比如0.2MM。而与走线的间距比较大&#xff0c;比如0.8mm。要怎么设置规…

OpenCV修养(三)——图像处理(上)

文章目录致谢3 图像处理&#xff08;上&#xff09;3.1 几何变换3.1.1 图像缩放3.1.2 图像平移3.1.3 图像旋转3.1.4 仿射变换3.2 图像阈值3.3 图像平滑3.3.1 图像噪声3.3.1.1 椒盐噪声3.3.1.2 高斯噪声3.3.2 均值滤波3.3.3 方框滤波3.3.4 高斯滤波3.3.5 中值滤波3.3.6 小结3.4 …

机器学习的练功方式(十一)——逻辑回归

文章目录致谢11 逻辑回归11.1 引入11.2 激活函数11.3 损失函数11.4 梯度下降11.5 案例&#xff1a;癌症分类预测致谢 逻辑回归为什么用Sigmoid&#xff1f; - 知乎 (zhihu.com) 逻辑回归中的损失函数的解释_yidiLi的博客-CSDN博客_逻辑回归损失函数 11 逻辑回归 逻辑回归也被称…

【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈

【百度地图API】如何制作一张魔兽地图&#xff01;&#xff01;——CS地图也可以&#xff0c;哈哈哈 原文:【百度地图API】如何制作一张魔兽地图&#xff01;&#xff01;——CS地图也可以&#xff0c;哈哈哈摘要&#xff1a; 你玩魔兽不&#xff1f;你知道如何做一张魔兽地图不…

linux系统分两种更普遍的包,rpm和tar,这两种安装包如何解压与安装

2019独角兽企业重金招聘Python工程师标准>>> RPM软件包管理器&#xff1a;一种用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。rpm -ivh xxxx.rpm <-安装rpm包 -i install的意思 -v view 查看更详细的…