机器学习算法系列python
此次,咱们来看下决策树算法算法
决策树是一种常见的机器学习方法,它是从根节点开始,一步一步决策,直到走到叶子节点。
最终,全部的样本数据都会落到叶子节点,显然,决策过程的最终结论对应了咱们所但愿的断定结果 。
它便可以作分类问题,也能够作回归问题。机器学习
通常,一棵决策树包含一个根节点,若干个内部节点(非叶子节点)和若干个叶子节点。post
如何从给点定的训练集中去构造一棵决策树呢? 其实,决策树的构建就是一个递归过程,从根节点开始,根据选择的特征,将原始数据集切分为几个分支,而后依次遍历每一个分支,在剩下的特征集中继续选择一个特征,进行对应划分,就是这个流程,一直递归下去,直到不可再分。
那么,什么状况下会不可再分呢?有三种状况:性能
具体的算法流程,这块贴下周志华大佬的《机器学习》中的一个图,你们能够看下学习
咱们能够发现,上述算法中,最重要的一点,就是在每一个节点上,选择最优的划分特征,也就说,每次在节点处划分时,咱们都须要考虑,选择剩余特征集中的哪一个属性进行划分,能够更好的划分数据呢?这个,也就是决策树算法的核心3d
经过上述,咱们直到,决策树算法的核心是,如何选择最优的划分特征,咱们但愿随着划分的进行,咱们通过每次划分后的分支节点所包含的样本尽量的属于同一类别,也就是节点中所包含的样本纯度愈来愈高。从而,咱们引入信息熵这个衡量标准cdn
信息熵表示的是随机变量不肯定性的度量,熵越大,不肯定性越强,也就是说纯度越低;
熵越小,不肯定性越弱,纯度越高blog
设置样本集合D中总共有类样本,其中第
类样本所占的比例为
,则
的信息熵定义为:排序
对于一个二分类问题,咱们能够画出信息熵的图像看看
那么,经过信息熵,咱们如何进行决策树划分选择的衡量呢,咱们引入信息增益这个概念
咱们假设特征集中有一个离散特征,它有
个可能的取值
,
若是使用特征a来对样本进行划分,那么会产
个分支节点,其中第
个分支节点中包含的样本集。咱们记为
。
因而,可计算出特征a对样本集D进行划分所得到的信息增益为:
解释下上面公式,其实特征a对样本集D进行划分所得到的信息增益 即为 样本集D的信息熵 减去 通过划分后,各个分支的信息熵之和。因为每一个分支节点,所包含的样本数不一样,全部在计算每一个分支的信息熵时,须要乘上对应权重,即样本数越多的分支节点对应的影响越大
下面,咱们具体看个栗子
上那个那个是某人在某月的1到14号的打球记录,咱们看下,对应特征有四个,分别为天气(outlook,咱们就认为是天气吧- -),温度,湿度,是否有风。输出值为是否打球
显然,咱们的样本总类, ,其中,正例占比
,负例占比
首先,咱们看下,根节点所包含的样本集D对应的信息熵为:
而后,咱们须要计算当前特征集合(天气,温度,湿度,风级)中每一个特征的信息增益。
以天气这个特征为例,若是以天气划分,则可将数据集D划分为三个子集,分别标记为:,
而后,咱们能够算出,特征outlook(天气)对应的信息增益是:
一样的,咱们能够依次算出其余特征所对应的信息增益,而后判断哪一个信息增益最大,则就以此特征来做为当前节点的划分。
假设最后算得,采用outlook来进行当前根节点的划分,则对于生成的三个节点分支,依次再对应每一个分支节点进行上述流程(算在此分支节点的数据集上,剩余的特征集合中哪一个信息增益最大,做为当前分支节点的分割特征,一直递归下去)
这其实就是ID3算法,以信息增益做为准则来进行划分特征
咱们思考下,上面说的以信息增益做为准则来进行划分属性,有什么缺点没?
假设对于上面的数据集,咱们增长一列特征,为 data(日期),针对上面的14个样本数据,对应的值为,根据上式可计算出,data(日期)所对应的的信息增益为:
,
咱们发现,它所对应的信息增益远大于其余特征,因此咱们要以data特征,做为第一个节点的划分依据吗?这样划分的话,将产生14个分支,每一个分支对应只包含一个样本,能够看到,每一个分支节点的纯度已达到最大,也就是说每一个分支节点的结果都很是肯定。可是,这样的决策树,确定不是咱们想要的,由于它根本不具有任何泛化能力。
这就是ID3算法,也就是信息增益准则的一个缺点,它在选择最优划分特征时,对可取数目比较多的特征有所偏好,如何避免这个问题呢,咱们引入增益率这个概念,改成使用增益率来做为最优划分特征的标准,一样,选择增益率最大的那个特征来做为最优划分特征,这也就是C4.5决策树算法
一样假设有数据集D,以及特征a,它有个可能的取值
,
若是数据集在以特征
做为划分特征时,增益率定义为:
其中
咱们来看下上述增益率公式,其实 就是特征a自己的信息熵,也就说对应根据特征a的可能取值,所对应求得的信息熵,
举个栗子,对于outlook这个特征,总共有三个类别(sunny,overcast,rainy),所对应类别的数据的个数为为(5,4,5) 则outlook自己的信息熵为:
特征a的对应种类越多,也就是说越大,则
的值一般会越大,从而增益率越小。这样,就能够避免信息增益中对可取数目比较多的特征有所偏好的缺点
那直接以信息增益率做为划分的衡量标准,有没有什么缺点呢,其实也有,增益率准则通常对可取数目较少的属性有所偏好。
因此,C4.5中的作法是:先从当前全部特征中找出信息增益高于平均值的的部分特征,再从中选择增益率最高的做为最优划分特征
还有一种决策树算法,称为CART决策树,它是使用基尼值来做为衡量标准的。具体流程其实和信息增益的衡量标准相似,只是将信息熵,改成了基尼值
反映了从数据集D中随机抽取两个样本,其类别标记不同的几率,因此,
越小。则数据集的纯度越高
前面咱们所讲的都是基于离散型特征进行划分生成决策树,那对于连续性特征,咱们须要怎么来处理呢?这个时候就须要用到连续型特征离散化的方法。最简单的即为二分法。下面咱们来具体看下
给定样本集和连续特征
, 假设特征
在样本集中总共有
个不一样的取值。
咱们想一想,若是咱们不加限制,最后训练出来的决策树,每一个叶子节点的数据都会分红纯净的,这样真的好吗?要知道,咱们是但愿训练出的决策树模型,对于新给的数据,可以准确预测出对应结果。
因此,决策树,很是容易出现过拟合问题。为了不这个问题,提供决策树的泛化能力,咱们须要进行剪枝操做。通常有两种剪枝操做,“预剪枝”和“后剪枝”
预剪枝便是指在决策树的构造过程当中,对每一个节点在划分前须要根据不一样的指标进行估计,若是已经知足对应指标了,则再也不进行划分,不然继续划分。
那么,具体指标都有哪些呢?
因为预剪枝是在构建决策树的同时进行剪枝处理,因此其训练时间开销较少,同时能够有效的下降过拟合的风险
可是,预剪枝有一个问题,会给决策树带来欠拟合的风险,1,2,3,4指标,不用过多解释,对于5指标来讲,
虽然,当前划分不能致使性能提升,可是,或许在此基础上的后续划分,却能使性能显著提升呢?
后剪枝则是先根据训练集生成一颗完整的决策树,而后根据相关方法进行剪枝。
经常使用的一种方法是,自底向上,对非叶子节点进行考察,一样拿验证集中的数据,来根据精度进行考察。看该节点划分前和划分后,精度是否有提升,若是划分后精度没有提升,则剪掉此子树,将其替换为叶子节点。
相对于预剪枝来讲,后剪枝的欠拟合风险很小,同时,泛化能力每每要优于预剪枝,可是,由于后剪枝先要生成整个决策树后,而后才自底向上依次考察每一个非叶子节点,因此训练时间长。
以上,就是决策树算法的基本原理,下一篇文章,咱们将经过python来具体实现一个决策树算法
欢迎关注个人我的公众号 AI计算机视觉工坊,本公众号不按期推送机器学习,深度学习,计算机视觉等相关文章,欢迎你们和我一块儿学习,交流。