决策树是一个树形结构,类似下面这样:

上图除了根节点外,有三个叶子节点和一个非叶子节点。

在解决分类问题的决策树中,叶子节点就表示所有的分类,比如这里的分类就有3种:无聊时阅读的邮件、需及时处理的邮件、无需阅读的邮件。

使用决策树来分类某个样本数据,就是利用根节点选取的特征,将当前输入样本划分到根节点下的某个子节点上,然后再利用子节点表示的特征来将当前样本划分到该子节点下的某个子节点上,以此继续,直到到达某个叶子节点,那么这个叶子节点表示的类别就是当前决策树对该样本数据所属的类别的预测。

对于上图,因为各个节点表示的特征和各个叶子节点表示的分类都已经给出了,所以给定一个数据很容易就能预测出对应的类别,但是在实际的分类场景中,我们手上有了标注好的训练样本数据后,要如何来构建一颗能够预测新样本类别的决策树呢?换句话说就是,我们如何知道这颗决策树的各个节点选取什么特征来划分数据才最合适呢?ok,你可能听过一些算法的名字,比如ID3、C4.5、CART等,它们其实就是用来解决这个问题的。

这里我们将介绍ID3算法。

我们选取划分数据集的特征的时候,需要考虑的标准是什么特征可以更好的将数据集分开,比如判断是男人还是女人,那么【是否穿高跟鞋】要比【是否带耳钉】更容易将人群划分开,或者说更能划分出纯度高的数据子集。

然而,其实很多时候我们都无法轻易的看出哪种特征能划分出更纯的数据子集,所以就需要一种方法能够帮助我们量化每种特征划分出的数据子集的信息纯度,以便筛选出更纯的划分方式。而其中一种方法就是使用信息论,信息论是量化处理信息的分支科学,可以用来度量信息,比如度量我们刚才说的数据子集的纯度。

所以阅读下面的内容之前,建议先了解一下信息论中的相关知识,包括信息量、信息熵,可以参考这篇文章:《信息熵为什么要定义成-Σp * log(p)》。

ID3决策树使用信息熵度量数据子集的纯度,信息熵越大,数据越混乱,纯度越低。

从ID3决策树的第一层开始,如果每一层的信息熵都是按照最大化的方式递减的,才能最快划分出纯度较高的数据子集(就像我们人工做分类,一定是从最显著的特征开始划分物品,才是最大程度利用了显著特征的优势,所以以这种方式做分类最快),然后根据叶子节点划分出的数据子集中的最多出现的类别来确认对应叶子节点的所属分类,从而得到一颗完整的分类决策树。

那么如何保证每一层的信息熵以最大化的方式递减呢?这就要说到信息增益了。

在划分数据集之前之后信息发生的变化称为信息增益, 所以计算出每个特征划分数据集获得的信息增益,然后获得信息增益最高的特征就是最好的选择。

信息增益的计算方式如下:

按某个特征划分当前节点数据集将得到的信息增益 =
 当前节点数据集的信息熵    -    按该特征划分出来的各个数据子集的信息熵总和 

ok,对ID3决策树总结一下:

遍历每个特征,找出使得信息增益最大的特征,做为当前节点下数据子集的划分特征,直到所有属性遍历完毕,或者某个数据子集的所有数据都已经具有相同的分类,此时ID3决策树构建完成,可以用来预测新样本的类别了。

然而,ID3还是有缺陷的,比如会偏向选择特征值比较多的特征来划分数据子集,然而如果训练数据中符合这个特征值的数据只出现过很少,甚至是一次,那么将导致构建出的决策树对这个特征的偏见。另外,ID3无法处理含有连续型数值的特征以及处理回归问题,这类场景下,决策树需要另一种算法——CART,下一篇文章会具体介绍。

ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

理解ID3决策树的更多相关文章

  1. Python3实现机器学习经典算法(三)ID3决策树

    一.ID3决策树概述 ID3决策树是另一种非常重要的用来处理分类问题的结构,它形似一个嵌套N层的IF…ELSE结构,但是它的判断标准不再是一个关系表达式,而是对应的模块的信息增益.它通过信息增益的大小 ...

  2. ID3决策树预测的java实现

    刚才写了ID3决策树的建立,这个是通过决策树来进行预测.这里主要用到的就是XML的遍历解析,比较简单. 关于xml的解析,参考了: http://blog.csdn.net/soszou/articl ...

  3. python ID3决策树实现

    环境:ubuntu 16.04 python 3.6 数据来源:UCI wine_data(比较经典的酒数据) 决策树要点: 1. 如何确定分裂点(CART ID3 C4.5算法有着对应的分裂计算方式 ...

  4. 理解CART决策树

    CART算法 原理 CART全称为Classification and Regression Tree. 回归树 相比ID3,CART遍历所有的特征和特征值,然后使用二元切分法划分数据子集,也就是每个 ...

  5. ID3决策树的Java实现

    package DecisionTree; import java.io.*; import java.util.*; public class ID3 { //节点类 public class DT ...

  6. ID3决策树

    决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺少不敏感,可以处理不相关特征数据 缺点:过拟合 决策树的构造 熵:混乱程度,信息的期望值 其中p(xi)是选择分类的概率 熵就是计算所有类别 ...

  7. ID3决策树---Java

    1)熵与信息增益: 2)以下是实现代码: //import java.awt.color.ICC_ColorSpace; import java.io.*; import java.util.Arra ...

  8. java编写ID3决策树

    说明:每个样本都会装入Data样本对象,决策树生成算法接收的是一个Array<Data>样本列表,所以构建测试数据时也要符合格式,最后生成的决策树是树的根节点,通过里面提供的showTre ...

  9. 决策树-ID3

    id3:无法直接处理数值型数据,可以通过量化方法将数值型数据处理成标称型数据,但涉及太多特征划分,不建议 决策树:的最大优点在于可以给出数据的内在含义,数据形式非常容易理解: 决策树介绍:决策树分类器 ...

  10. 决策树模型 ID3/C4.5/CART算法比较

    决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归.虽然将多棵弱决策树的Bagging.Random Forest.Boosting等tree ensembel 模型更为常见,但是“完 ...

随机推荐

  1. JAVA WEB和Tomcat各组件概念

    概述 本篇文章是https://juejin.cn/post/7055306172265414663,这篇文章的再总结,剔除了与Java安全研究没太大关系的内容,对JAVAWEB中的Servlet.F ...

  2. 【ElementPlus】el-form使用技巧:动态切换校验规则的最佳实践

    喵~ 今天分享一篇在 ElementPlus 中使用 el-form 动态切换校验规则 的实用方法. 一.问题概述 作为前端开发人员,在开发项目中,特别是后台管理系统,表单的使用是必不可少的.当业务需 ...

  3. MySQL底层概述—9.ACID与事务

    大纲 1.ACID之原子性 2.ACID之持久性 3.ACID之隔离性 4.ACID之一致性 5.ACID的关系 6.事务控制演进之排队 7.事务控制演进之排它锁 8.事务控制演进之读写锁 9.事务控 ...

  4. VTK 正交投影 透视投影

    VTK默认透视投影(近大远小),如果想改成正交投影(平行投影,远近一样): 1.调用vtkCamera的ParallelProjectionOn函数开启 2.通过vtkCamera的SetParall ...

  5. 【Amadeus原创】Docker容器的备份与还原

    主要作用: 就是让配置好的容器,可以得到复用,后面用到得的时候就不需要重新配置. 其中涉及到的命令有: docker commit 将容器保存为镜像 docker save -o 将镜像备份为tar文 ...

  6. 3.MySQL常用函数

    常用命令 ● alter add alter table add <table_name> add <column_name> <data_type> [约束类型] ...

  7. go编译可以指定os和arch

    是的,Go 编译器支持通过环境变量来指定目标操作系统(OS)和架构(Arch).这允许你为不同的平台交叉编译 Go 程序.你可以使用 GOOS 和 GOARCH 环境变量来指定目标系统. 例如,如果你 ...

  8. 微服务之调用链(Feign+SpringCloud)

    终于到了我们的重点,微服务了. 与使用OkHttp3来实现的客户端类似,Feign接口本来也就是一个Http调用,依然可以使用Http头传值的方式,将 Trace 往下传. 本文更多的是关于 Spri ...

  9. Qt音视频开发18-不同视频打开无缝切换

    一.前言 在轮询视频的时候,通常都是需要将之前的视频全部关闭,然后打开下一组视频,在这个切换的过程中,如果是按照常规的做法,比如先关闭再打开新的视频,肯定会出现空白黑屏之类的过度空白区间,如何避免这个 ...

  10. 关于Qt高分屏缩放几个知识点

    在windows上经常遇到高分屏缩放的问题,很头疼,貌似这东西就是windows首发的. 在Qt4时代的程序遇到高分屏缩放,不作任何处理,毕竟Qt4时代(2010年以前)出来的时候几乎还没高分屏缩放这 ...