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

决策树(decision tree)(一)——构造决策树方法决策树 decisiontree 说明 这篇博客是看周志华老师的 机器学习 西瓜书 的笔记总结 博客中有大段文字摘自周老师的 机器学习 书 仅供学习交流使用 转载博客务必注明出处和作者 谢谢 决策树算法起源于 E B Hunt 等人于 1966 年发表的论文 experimentsi 但真正让决策树成为机器学习主流算法的还是 Quinlan 罗斯 昆兰 大神 2011 年

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



说明:这篇博客是看周志华老师的《机器学习》(西瓜书)的笔记总结,虽然自己写了很多总结性文字包括一些算法细节,但博客中仍有部分文字摘自周老师的《机器学习》书,仅供学习交流使用。转载博客务必注明出处和作者,谢谢。
决策树系列博客:
  • 决策树(一)——构造决策树方法

  • 决策树(二)——剪枝

  • 决策树(三)——连续值处理

  • 决策树(四)缺失值处理



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


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

该图为原创


二、如何生成决策树

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


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

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

       一般而言,信息增益越大,则表示使用特征 决策树(decision tree)(一)——构造决策树方法 对数据集划分所获得的“纯度提升”越大。所以信息增益可以用于决策树划分属性的选择,其实就是选择信息增益最大的属性,ID3算法就是采用的信息增益来划分属性。
下面来举个例子说明具体是怎样操作的,只贴公式没多大意义,还是有不利于大家理解。举例子用的数据集为:
决策树(decision tree)(一)——构造决策树方法

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


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



从数据集中能够看出特征集为:{色泽、根蒂、敲声、纹理、脐部、触感}。下面我们来计算每个特征的信息增益。先看“色泽”,它有三个可能的离值:{青绿、乌黑、浅白},若使用“色泽”对数据集D进行划分,则可得到3个子集,分别为:决策树(decision tree)(一)——构造决策树方法
(色泽=青绿)、决策树(decision tree)(一)——构造决策树方法
(色泽=乌黑)、决策树(decision tree)(一)——构造决策树方法
(色泽=浅白)。决策树(decision tree)(一)——构造决策树方法
共包含6个样本{1,4,6,10,13,17}
,其中正例占决策树(decision tree)(一)——构造决策树方法
,反例占决策树(decision tree)(一)——构造决策树方法
决策树(decision tree)(一)——构造决策树方法
包含6个样本{2,3,7,8,9,15}
,其中正例占决策树(decision tree)(一)——构造决策树方法
,反例
决策树(decision tree)(一)——构造决策树方法决策树(decision tree)(一)——构造决策树方法包含了5个样本{5,11,12,14,16},其中正例占决策树(decision tree)(一)——构造决策树方法,反例占决策树(decision tree)(一)——构造决策树方法。因此,可以计算出用“色泽”划分之后所获得的3个分支结点的信息熵为:


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



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


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

同理可以计算出其他特征的信息增益:
决策树(decision tree)(一)——构造决策树方法

比较发现,特征“纹理”的信息增益最大,于是它被选为划分属性。因此可得:
决策树(decision tree)(一)——构造决策树方法

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

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



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

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

(注:该图片版权所有,转载或使用请注明作者(天泽28)和出处)
不妨选择“色泽”属性作为划分属性,则可得到:
决策树(decision tree)(一)——构造决策树方法

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

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


说了这么多,下面就来看看用决策树算法跑出来的效果,本人主要用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上,有兴趣的可以看看。
决策树(decision tree)(一)——构造决策树方法







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

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

显然是生成了一颗含有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还能够处理连续值与缺失值。剪枝与连续值和缺失值的处理在下一篇博客中再介绍。先来看看信息增益率:

  • 信息增益率

信息增益比的定义为:
决策树(decision tree)(一)——构造决策树方法

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



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

来看下混淆矩阵(Confusion Matrix)
决策树(decision tree)(一)——构造决策树方法



有两个样本被误分类了。
另外还可以用基尼指数来构造决策树,像CART就是用基尼指数来划分属性的,来看下基尼指数:

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



注:上面这个公式的推导可以写一下:
决策树(decision tree)(一)——构造决策树方法

决策树(decision tree)(一)——构造决策树方法反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,决策树(decision tree)(一)——构造决策树方法 越小,则数据集D的纯度越高。则属性 决策树(decision tree)(一)——构造决策树方法 的基尼指数定义为:
决策树(decision tree)(一)——构造决策树方法



所以在候选属性集合中国,选择那个使得划分后基尼指数最小的属性作为最优划分属性。
下面是用python的scikit-learn库中提供的CART在西瓜数据集上的测试效果:
17个样本全部拿来当做训练集:
决策树(decision tree)(一)——构造决策树方法


拿出25%的样本当做测试集:
决策树(decision tree)(一)——构造决策树方法

欢迎大家留言交流讨论。


|ps:一直觉得博客不应写的太长,不然看着很累,如果知识点确实很多,则分几篇博客介绍。所以关于决策树最最基本的先写这么多,关于剪枝(预剪枝和后剪枝)将在决策树(二)中介绍,连续属性和缺失值处理会在决策树(三)中介绍。






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219841.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:46
下一篇 2026年3月17日 下午9:46


相关推荐

  • Linux学习手册大全

    Linux学习手册大全、Linux大全1、虚拟机安装2、虚拟机网络连接方式3、安装vmtools4、虚拟机目录4.1、目录含义4.2、Linux颜色含义5、远程登录软件6、编辑命令7、用户管理8、CentOS7找回root密码9、文件目录指令pwd指令ls指令cd指令mkdir指令rmdir指令touch指令cp指令rm指令mv指令cat指令more指令less指令echo指令head指令tail指令指令>和指令>>ln指令history指令10、日期指令11、查找指令1、find指令2、locate指令3、

    2022年5月26日
    43
  • Spring通过SchedulerFactoryBean实现调度任务的配置「建议收藏」

    Spring通过SchedulerFactoryBean实现调度任务的配置「建议收藏」真是越来越懒了,半年前配置过这个东西现在又忘了。找了原来的代码看了下,现在有必要将这个东西记录下来。直接上配置:

    2022年5月23日
    189
  • android toast位置_android studio toast不显示

    android toast位置_android studio toast不显示关键词:Android,Appium,Python,Toast1、什么是toast?toast是一个浮动的显示块,在Android中主要用于提示信息,超时后退出,常用于提示一些不是那么重要的信息;如果是重要的信息,会使用notification。toast比较难定位,一来因为它时间很短,一般3秒左右;二来toast元素一般不写在XML中,代码中直接去调用。Toast.makeText(getApp…

    2025年11月8日
    6
  • grok ai怎么删除对话内容

    grok ai怎么删除对话内容

    2026年3月15日
    2
  • jenkins 邮件_acs nano投稿后有确认邮件吗

    jenkins 邮件_acs nano投稿后有确认邮件吗前言前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了。安装EmailExtensionPlugin插件jenkins首页-

    2022年7月29日
    10
  • 视频编码技术详解

    1、引言  如今我们所处的时代,是移动互联网时代,也可以说是视频时代。从快播到抖音,从“三生三世”到“延禧攻略”,我们的生活,被越来越多的视频元素所影响。    而这一切,离不开视频拍摄技术的不断升级,还有视频制作产业的日益强大。    此外,也离不开通信技术的飞速进步。试想一下,如果还是当年的56KModem拨号,或者是2G手机,你还能享受到现在动辄10…

    2022年4月7日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号