决策树(decision tree)(一)——构造决策树方法

转载自:https://blog.csdn.net/u012328159/article/details/70184415 说明:这篇博客是看周志华老师的《机器学习》(西瓜书)的笔记总结,虽然自己写了很多总结性文字包括一些算法细节,但博客中仍有部分文字摘自周老师的《机器学习》书,仅供学习交流使用。转载博客务必注明出处和作者,谢谢。

决策树系列博客:

  • 决策树(一)——构造决策树方法
  • 决策树(二)——剪枝
  • 决策树(三)——连续值处理
  • 决策树(四)缺失值处理

        决策树算法起源于E.B.Hunt等人于1966年发表的论文“experiments in Induction”,但真正让决策树成为机器学习主流算法的还是Quinlan(罗斯.昆兰)大神(2011年获得了数据挖掘领域最高奖KDD创新奖),昆兰在1979年提出了ID3算法,掀起了决策树研究的高潮。现在最常用的决策树算法是C4.5是昆兰在1993年提出的。(关于为什么叫C4.5,还有个轶事:因为昆兰提出ID3后,掀起了决策树研究的高潮,然后ID4,ID5等名字就被占用了,因此昆兰只好让讲自己对ID3的改进叫做C4.0,C4.5是C4.0的改进)。现在有了商业应用新版本是C5.0link。

一、决策树的基本概念

        顾名思义,决策树就是一棵树,一颗决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。下面直接上个图,让大家看下决策树是怎样决策的(以二元分类为例),图中红线表示给定一个样例(表中数据)决策树的决策过程:

该图为原创

二、如何生成决策树

  • 信息增益

        决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,对于二元分类而言,就是尽量使划分的样本属于同一类别,即“纯度”最高的属性。那么如何来度量特征(features)的纯度,这时候就要用到“信息熵(information entropy)”。先来看看信息熵的定义:假如当前样本集D中第k类样本所占的比例为 为类别的总数(对于二元分类来说,)。则样本集的信息熵为:

的值越小,则D的纯度越高。(这个公式也决定了信息增益的一个缺点:即信息增益对可取值数目多的特征有偏好(即该属性能取得值越多,信息增益,越偏向这个),因为特征可取的值越多,会导致“纯度”越大,即ent(D)会很小,如果一个特征的离散个数与样本数相等,那么Ent(D)值会为0)。再来看一个概念信息增益(information gain),假定离散属性  有 个可能的取值,如果使用特征  来对数据集D进行划分,则会产生V个分支结点, 其中第v(小v)个结点包含了数据集D中所有在特征  上取值为 的样本总数,记为。因此可以根据上面信息熵的公式计算出信息熵,再考虑到不同的分支结点所包含的样本数量不同,给分支节点赋予权重,即样本数越多的分支节点的影响越大,因此,能够计算出特征  对样本集D进行划分所获得的“信息增益”:

       一般而言,信息增益越大,则表示使用特征  对数据集划分所获得的“纯度提升”越大。所以信息增益可以用于决策树划分属性的选择,其实就是选择信息增益最大的属性,ID3算法就是采用的信息增益来划分属性。

下面来举个例子说明具体是怎样操作的,只贴公式没多大意义,还是有不利于大家理解。举例子用的数据集为:

    显然该数据集包含17个样本,类别为二元的,即。则,正例(类别为1的样本)占的比例为:,反例(类别为0的样本)占的比例为:。根据信息熵的公式能够计算出数据集D的信息熵为:

从数据集中能够看出特征集为:{色泽、根蒂、敲声、纹理、脐部、触感}。下面我们来计算每个特征的信息增益。先看“色泽”,它有三个可能的离值:{青绿、乌黑、浅白},若使用“色泽”对数据集D进行划分,则可得到3个子集,分别为:(色泽=青绿)、(色泽=乌黑)、(色泽=浅白)。共包含6个样本{1,4,6,10,13,17},其中正例占,反例占包含6个样本{2,3,7,8,9,15},其中正例占,反例

包含了5个样本{5,11,12,14,16},其中正例占,反例占。因此,可以计算出用“色泽”划分之后所获得的3个分支结点的信息熵为:

因此,特征“色泽”的信息增益为:

同理可以计算出其他特征的信息增益:

比较发现,特征“纹理”的信息增益最大,于是它被选为划分属性。因此可得:

第二步、继续对上图中每个分支进行划分,以上图中第一个分支结点{“纹理=清晰”}为例,对这个结点进行划分,设该结点的样本集 {1,2,3,4,5,6,8,10,15},共9个样本,可用特征集合为{色泽,根蒂,敲声,脐部,触感},因此基于  能够计算出各个特征的信息增益:

比较发现,“根蒂”、“脐部”、“触感”这3个属性均取得了最大的信息增益,可以随机选择其中之一作为划分属性(不防选择“根蒂”)。因此可得:

第三步,继续对上图中的每个分支结点递归的进行划分,以上图中的结点{“根蒂=蜷缩”}为例,设该结点的样本集为{1,2,3,4,5},共5个样本,但这5个样本的class label均为“好瓜”,因此当前结点包含的样本全部属于同一类别无需划分,将当前结点标记为C类(在这个例子中为“好瓜”)叶节点,递归返回。因此上图变为:

第四步,接下来对上图中结点{“根蒂=稍蜷”}进行划分,该点的样本集为 {6,8,15},共有三个样本。可用特征集为{色泽,敲声,脐部,触感},同样可以基于 计算出各个特征的信息增益,计算过程如下(写的比较详细,方便大家弄懂):

(注:该图片版权所有,转载或使用请注明作者(天泽28)和出处)

不妨选择“色泽”属性作为划分属性,则可得到:

继续递归的进行,看“色泽=青绿”这个节点,只包含一个样本,无需再划分了,直接把当前结点标记为叶节点,类别为当前样本的类别,即好瓜。递归返回。然后对递归的对“色泽=乌黑”这个节点进行划分,就不再累述了。说下“色泽=浅白”这个节点,等到递归的深度处理完“色泽=乌黑”分支后,返回来处理“色泽=浅白”这个节点,因为当前结点包含的样本集为空集,不能划分,对应的处理措施为:将其设置为叶节点,类别为设置为其父节点(根蒂=稍蜷)所含样本最多的类别,“根蒂=稍蜷”包含{6,8,15}三个样本,6,8为正样本,15为负样本,因此“色泽=浅白”结点的类别为正(好瓜)。最终,得到的决策树如下图所示:

注:上图红色框起来的部分,是西瓜书印刷错误,上图已改正。周老师在他的勘误网站也有说明,详见勘误网站

说了这么多,下面就来看看用决策树算法跑出来的效果,本人主要用weka的ID3算法(使用的信息增益),以供大家参看,后面还会放出自己实现的版本,后面再说。(之所以不要sklearn库里的决策树,是因为sklearn库里的决策树提供的是使用Gini指数优化后的CART,并不提供ID3和C4.5算法)。

由于新版本weka里已经不再提供ID3算法了,只能下载另外的安装包,把下载方法也贴出来吧,打开weka的Tools->package manager在里面找到包simpleEducationalLearningSchemes安装即可。安装好后就可以把西瓜数据集2.0来测试了,不过要想在weka中构建模型,还要先把.txt格式转换为.arff格式,转换的代码以及转换好的数据集,详见github。另外simpleEducationalLearningSchemes提供的ID3并不像J48那样支持可视化,因此参考链接基于以前weka老版本写的可视化,但该代码在新版本中无法使用,我修改了下整合到ID3上了,现在可以支持可视化了,测试西瓜数据集,生成的可视化树如下,具体代码也放到了github上,有兴趣的可以看看。

但信息增益有个缺点就是对可取数值多的属性有偏好,举个例子讲,还是考虑西瓜数据集,如果我们把“编号”这一列当做属性也考虑在内,那么可以计算出它的信息增益为0.998,远远大于其他的候选属性,因为“编号”有17个可取的数值,产生17个分支,每个分支结点仅包含一个样本,显然这些分支结点的纯度最大。但是,这样的决策树不具有任何泛化能力。还是拿西瓜数据集2.0来测试下,如果考虑编号这一属性,看看ID3算法会生成一颗什么样的决策树:

显然是生成了一颗含有17个结点的树,这棵树没有任何的泛化能力,这也是ID3算法的一个缺点。另外补充一下ID3算法的详细情况:

  • Class for constructing anunpruned decision tree based on the ID3 algorithm.
  • Can only deal with nominal attributes. No missing values allowed.
  • Empty leaves may result in unclassified instances. For more information see: R. Quinlan (1986). Induction of decision trees. Machine Learning. 1(1):81-106.

由于ID3算法的缺点,Quinlan后来又提出了对ID3算法的改进C4.5算法(在weka中为J48),C4.5使用了信息增益率来构造决策树,此外C4.5为了避免过拟合,还提供了剪枝的功能。C4.5还能够处理连续值与缺失值。剪枝与连续值和缺失值的处理在下一篇博客中再介绍。先来看看信息增益率:

  • 信息增益率

信息增益比的定义为:

其中:

 称为属性  的“固有值”,属性  的可能取值数目越多(即V越大),则的值通常会越大。例如还是对西瓜数据集,IV(触感)=0.874(v=2),IV(色泽)=1.580(V=3),IV(编号)=4.088(V=17)。但增益率也可能产生一个问题就是,对可取数值数目较少的属性有所偏好。因此,C4.5算法并不是直接选择使用增益率最大的候选划分属性,而是使用了一个启发式算法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。来看看C4.5在西瓜数据集上构造的决策树:

来看下混淆矩阵(Confusion Matrix)

有两个样本被误分类了。

另外还可以用基尼指数来构造决策树,像CART就是用基尼指数来划分属性的,来看下基尼指数:

  • 基尼指数

        基尼指数(Gini index)也可以用于选择划分特征,像CART(classification and regression tree)决策树(分类和回归都可以用)就是使用基尼指数来选择划分特征。基尼值可表示为:

注:上面这个公式的推导可以写一下:

反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此, 越小,则数据集D的纯度越高。则属性  的基尼指数定义为:

所以在候选属性集合中国,选择那个使得划分后基尼指数最小的属性作为最优划分属性。

下面是用python的scikit-learn库中提供的CART在西瓜数据集上的测试效果:

17个样本全部拿来当做训练集:

拿出25%的样本当做测试集:

欢迎大家留言交流讨论。

决策树构造方法详细过程相关推荐

  1. ORACLE11G 将dataguard的rman备份恢复到测试环境的单机oracle中的详细过程

    2019独角兽企业重金招聘Python工程师标准>>> ORACLE11G 将dataguard的rman备份恢复到测试环境的单机oracle中的详细过程 原创 2015年08月21 ...

  2. HBase 1.2.6 完全分布式集群安装部署详细过程

    2019独角兽企业重金招聘Python工程师标准>>> Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Big ...

  3. VS调试dll详细过程记录

    VS调试dll详细过程记录 还可以参考博客: https://blog.csdn.net/u014738665/article/details/79779632 在我们写的程序中有时候调用dll,并且 ...

  4. 在 Mac OSX 版的 LispBox 环境上安装配置 SBCL 详细过程

    2019独角兽企业重金招聘Python工程师标准>>> 在 Mac OSX 版的 LispBox 环境上安装配置 SBCL 详细过程 今天在OSX版的 LispBox(使用CCL) ...

  5. STM32F0xx_EXIT中断配置详细过程

    Ⅰ.概述 EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种.因此,EXIT在实际项目开发中也是比较常见的一种. STM32F0中外部中断EXIT属于中断和事件的 ...

  6. Navicat 使用sql命令建数据库和表详细过程_2

    /** *@author blovedr *功能: Navicat 使用sql命令建数据库和表详细过程_2 *日期: 2018年7月24日   10:39 *注释: 学习数据库MySQL的点点记录, ...

  7. 【Linux】【服务器】 CentOS7下安装MySQL(版本8.0)详细过程步骤

    一.检查是否安装过mysql [Linux][服务器]CentOS7下卸载MySQL详细过程步骤 二.下载Linux下的Mysql包,打开Mysql官网 1.MySQL官网 2.滑到最后,点击MySQ ...

  8. Win7安装64位CentOS 6.4双系统详细过程

    原文连接Win7安装64位CentOS 6.4双系统详细过程 本文是在两篇文章整合而成.分别是: Mr.Johness的 最清晰细致的教程!一步步教你打造Win7+CentOS双系统 和 cjh326 ...

  9. System之Ubuntu:VMware虚拟机 Ubuntu安装详细过程(图文教程,最强攻略,步骤详细,建议收藏)

    System之Ubuntu:VMware虚拟机 Ubuntu安装详细过程(图文教程,最强攻略,步骤详细,建议收藏) 导读         不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服 ...

最新文章

  1. 移动端geolocation插件+百度地图js获取地址
  2. 启用nginx status状态详解
  3. 破解MS Word 的只读密码限制
  4. 双胞胎被麻省理工全奖录取,他们成功的秘诀,跟你想的不一样……
  5. 使用XStream进行对象和xml的转换,极度舒适
  6. 洪水填充算法_洪水填充(Flood fill)算法
  7. “校园知网”5月8日冲刺计划书
  8. 2017级C语言大作业 - 奇怪的大冒险
  9. vue elementui表单的坑
  10. 基于python的计算基因组_【ROSALIND】【练Python,学生信】05 计算DNA序列GC含量
  11. OSChina 周五乱弹 ——大叔我还小,放过我吧
  12. win7升级win10正式版_最新win7如何升级win10操作教程,你还在用win7吗?
  13. Redis一主二从Sentinel监控配置
  14. 北漂IT男返乡2年的三线楼市观察(宜昌夷陵篇)-原创
  15. nodejs常用的黑窗口命令
  16. 用搜狗输入法原样输出10的若干次方
  17. 支付宝支付成功之后的接口_继支付宝微信之后,51信用卡还款也开始收费了,手续费再创新高...
  18. gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
  19. 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  20. pywin32处理Excel

热门文章

  1. 一份超经典SpringBoot启动脚本
  2. [BZOJ 2820] YY的GCD
  3. Topaz Gigapixel AI 中文汉化版是一款由Topaz Labs公司开发的图片无损放大软件
  4. 设计原则之一:开放封闭原则
  5. java replaceAll的分组用法
  6. 哈夫曼编码(文件编码与解码)
  7. 传阿里巴巴战略投资新浪微博
  8. java不用系统函数String转int
  9. mental ray 相关
  10. 9个冷门但有趣的网站,每一个都不想错过