概述

决策树(Decision Tree)是一种非参数的有监督学习方法,它是一种树形结构,所以叫决策树。它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。

决策树的核心有三种算法:

ID3:ID3 是最早提出的决策树算法,他就是利用信息增益来选择特征的。

C4.5:他是 ID3 的改进版,他不是直接使用信息增益,而是引入“信息增益比”指标作为特征的选择依据。

CART:这种算法即可以用于分类,也可以用于回归问题。CART 算法使用了基尼系数取代了信息熵模型。

ID3算法是本教程的重点要讲的内容,其余两种算法将会后续推出。

数据集

下面举个例子,会使用ID3算法帮助我们判断今天的天气适不适合出去打球。

进行判断之前,需要历史天气数据和打球活动数据,以下为历史数据集S。

天数 天气 气温 湿度 风力 是否打球
D1 晴朗 湿
D2 晴朗 湿
D3 大雨 湿
D4 小雨 中等 湿
D5 小雨 凉爽 正常
D6 小雨 凉爽 正常
D7 大雨 凉爽 正常
D8 晴朗 中等 湿
D9 晴朗 凉爽 正常
D10 小雨 中等 正常
D11 晴朗 中等 正常
D12 大雨 中等 湿
D13 大雨 正常
D14 小雨 中等 湿

ID3算法

ID3算法会选择当前信息增益最大的特征作为树中新的节点。计算过程如下:

步骤1

假设S为完整的数据集,数据标签(数据类别)共有n个类别,分别为C1,...,CnSi对应Ci类别下数据子集,因此,数据集S的信息熵计算如下:

\[Entropy(S)=-\sum_{i=1}^{n}p_{i}\log_{2}{p_{i}}
\]

其中,pi是数据样本为Ci的概率,因此:

\[p_i=\frac{|S_i|}{|S|}
\]

|Si|是类别Ci在数据集S中的数据数量,|S|是数据集S中的数据数量。

步骤2

假设特征Ak种不同的取值,根据特征A,一定条件下的数据集S可以分为k个子集{S1,...,Sk},因此,数据集S的信息熵可以按照如下方式计算:

\[Entropy_A(S)=\sum_{i=1}^{k}\frac{|S_i|}{|S|}Entropy(S_i)
\]

步骤3

假设数据集S根据特征A不同的取值分为众多子集,则信息增益的计算为:

\[Gain(S,A)=Entropy(S)-Entropy_A(S)
\]

计算数据集中每一个特征的信息增益,如Gain(S,B), Gain(S,C)等,选取信息增益最大的特征作为树中新的节点。

计算信息增益

天气的各个属性如上图所示,它们所有可能的值如下所示:

  • 天气:晴朗、小雨、大雨
  • 气温:热、中等、凉爽
  • 湿度:正常、湿
  • 风力:弱、强

同时,S中有14天的历史天气和活动数据,其中,打球的有9天,不打球的5天,因此数据集S的熵可以计算为:

\[Entropy(S)=-[\frac{9}{14}\times\log_{2}{\frac{9}{14}}]-[\frac{5}{14}\times\log_{2}{\frac{5}{14}}]=0.94
\]

现在我们开始计算每一列的信息增益。

对于天气列,有晴朗小雨大雨三种情况,根据三种情况划分对应的数据子集。

当天气为晴朗时,涉及到的数据如下:

天数 天气 气温 湿度 风力 是否打球
D1 晴朗 湿
D2 晴朗 湿
D8 晴朗 中等 湿
D9 晴朗 凉爽 正常
D11 晴朗 中等 正常

此时有5天的数据,出去打球的有2天,不打球的有3天,因此熵值为:

\[Entropy(S_{晴朗})=-[\frac{2}{5}\times\log_{2}{\frac{2}{5}}]-[\frac{3}{5}\times\log_{2}{\frac{3}{5}}]=0.971
\]

当天气为小雨时,涉及到的数据如下:

天数 天气 气温 湿度 风力 是否打球
D4 小雨 中等 湿
D5 小雨 凉爽 正常
D6 小雨 凉爽 正常
D10 小雨 中等 正常
D14 小雨 中等 湿

此时有5天的数据,出去打球的有3天,不打球的有2天,因此熵值为:

\[Entropy(S_{小雨})=-[\frac{3}{5}\times\log_{2}{\frac{3}{5}}]-[\frac{2}{5}\times\log_{2}{\frac{2}{5}}]=0.971
\]

当天气为大雨时间,涉及到的数据如下:

天数 天气 气温 湿度 风力 是否打球
D3 大雨 湿
D7 大雨 凉爽 正常
D12 大雨 中等 湿
D13 大雨 正常

此时有4天的数据,出去打球的有4天,不打球的有0天,因此熵值为:

\[Entropy(S_{大雨})=-[\frac{4}{4}\times\log_{2}{\frac{4}{4}}]-[\frac{0}{4}\times\log_{2}{\frac{0}{4}}]=0
\]

熵值为0,所有数据(标签)都处在同一类,决策树在该分支上停止生长。

由此可以计算天气这一列的信息熵:

\[\begin{aligned}
Entropy(S_{天气})&=\frac{5}{14}\times Entropy(S_{晴朗})+\frac{5}{14}\times Entropy(S_{小雨})+\frac{4}{14}\times Entropy(S_{大雨})\\
&=\frac{5}{14}\times 0.971+\frac{5}{14}\times 0.971+0\\
&=0.69
\end{aligned}
\]

其信息增益为:

\[\begin{aligned}
Gain(S,天气)&=Entropy(S)-Entropy(S_{天气})\\
&=0.94-0.69\\
&=0.25
\end{aligned}
\]

由此可得:

\[Gain(S,气温)=Entropy(S_{天气})-Entropy(S_{气温})=0.03\\
Gain(S,湿度)=Entropy(S_{天气})-Entropy(S_{湿度})=0.15\\
Gain(S,风力)=Entropy(S_{天气})-Entropy(S_{风力})=0.05
\]

信息增益最高的是天气列,由于当前没有根节点,因此选择该列为根节点。

由上图可以看出,需要进一步划分的为`晴天`、`小雨`时的情况,因此要分别计算当`天气=晴天`以及`天气=小雨`时其他列的信息增益。
`天气=晴朗`时的数据子集如下:

天数 天气 气温 湿度 风力 是否打球
D1 晴朗 湿
D2 晴朗 湿
D8 晴朗 中等 湿
D9 晴朗 凉爽 正常
D11 晴朗 中等 正常

把它当做一个完整的数据集S,根据上一步的计算其信息熵为0.971

分别计算气温湿度风力的信息增益,首先计算气温,气温有三种可能出现的情况,即凉爽中等

气温=凉爽时:

天数 天气 气温 湿度 风力 是否打球
D9 晴朗 凉爽 正常

此时有1天的数据,出去打球的有1天,不打球的有0天,因此熵值为:

\[Entropy(S_{凉爽}|天气=晴朗)=-[\frac{1}{1}\times\log_{2}{\frac{1}{1}}]-[\frac{0}{1}\times\log_{2}{\frac{0}{1}}]=0
\]

气温=中等时:

天数 天气 气温 湿度 风力 是否打球
D8 晴朗 中等 湿
D11 晴朗 中等 正常

此时有2天的数据,出去打球的有1天,不打球的有1天,因此熵值为:

\[Entropy(S_{中等}|天气=晴朗)=-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]=1.0
\]

气温=热时:

天数 天气 气温 湿度 风力 是否打球
D1 晴朗 湿
D2 晴朗 湿

此时有2天的数据,出去打球的有0天,不打球的有2天,因此熵值为:

\[Entropy(S_{热}|天气=晴朗)=-[\frac{0}{2}\times\log_{2}{\frac{0}{2}}]-[\frac{2}{2}\times\log_{2}{\frac{2}{2}}]=0
\]

因此天气=晴朗时,气温列的信息增益为:

\[\begin{aligned}
Gain(S_{晴朗},气温)&=Entropy(S_{晴朗})-Entropy(S_{气温}|天气=晴朗)\\
&=Entropy(S_{晴朗})-\frac{1}{5}Entropy(S_{凉爽}|天气=晴朗)-\frac{2}{5}Entropy(S_{中等}|天气=晴朗)\\
&\ \ \ \ -\frac{2}{5}Entropy(S_{热}|天气=晴朗)\\
&=0.971-\frac{1}{5}\times 0-\frac{2}{5}\times 1-\frac{2}{5}\times 0\\
&=0.571
\end{aligned}
\]

同理:

\[Gain(S_{晴朗},湿度)=Entropy(S_{晴朗})-Entropy(S_{湿度}|天气=晴朗)=0.970\\
Gain(S_{晴朗},风力)=Entropy(S_{晴朗})-Entropy(S_{风力}|天气=晴朗)=0.019
\]

所以,当天气=晴朗时,湿度的信息增益最大,本次决策树生长选择湿度为新的节点。

当`湿度=正常`时:

天数 天气 气温 湿度 风力 是否打球
D9 晴朗 凉爽 正常
D11 晴朗 中等 正常

此时有2条数据,其中打球的有2条,不打球的有0条,因此信息熵为0

湿度=湿时:

天数 天气 气温 湿度 风力 是否打球
D8 晴朗 中等 湿
D1 晴朗 湿
D2 晴朗 湿

此时有3条数据,其中打球的有0条,不打球的有3条,因此信息熵为0

显然可得,当湿度不同时,明显分成两类,因此新的决策树如下:

由上可以看出,当`天气=小雨`时不能正确分类,因此当天气为小雨时的数据子集为:

天数 天气 气温 湿度 风力 是否打球
D4 小雨 中等 湿
D5 小雨 凉爽 正常
D6 小雨 凉爽 正常
D10 小雨 中等 正常
D14 小雨 中等 湿

此时有5天的数据,出去打球的有3天,不打球的有2天,熵值为0.971。

先看气温,此时有两种情况:中等凉爽,分别划分两种情况各自对应的数据集。

气温=中等时,有3次记录,2次打球,1次不打球,因此中等气温时的熵值为:

\[\begin{aligned}
Entropy(S_{中等}|天气=小雨)&=-[\frac{2}{3}\times\log_{2}{\frac{2}{3}}]-[\frac{1}{3}\times\log_{2}{\frac{1}{3}}]=0.918
\end{aligned}
\]

气温=凉爽时,有2次记录,1次打球,1次不打球,因此凉爽气温时的熵值为:

\[\begin{aligned}
Entropy(S_{凉爽}|天气=小雨)&=-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]=1.0
\end{aligned}
\]

因此气温的信息增益为:

\[\begin{aligned}
Gain(S_{小雨},气温)&=Entropy(S_{小雨})-Entropy(S_{气温}|天气=小雨)\\
&=Entropy(S_{小雨})-\frac{3}{5}Entropy(S_{中等}|天气=小雨)-\frac{2}{5}Entropy(S_{凉爽}|天气=小雨)\\
&=0.971-\frac{3}{5}\times 0.918-\frac{2}{5}\times 1.0\\
&=0.02
\end{aligned}
\]

同理:

\[\begin{aligned}
Gain(S_{小雨},湿度)&=Entropy(S_{小雨})-Entropy(S_{湿度}|天气=小雨)\\
&=Entropy(S_{小雨})-\frac{2}{5}Entropy(S_{湿}|天气=小雨)-\frac{3}{5}Entropy(S_{正常}|天气=小雨)\\
&=0.02\\
Gain(S_{小雨},风力)&=Entropy(S_{小雨})-Entropy(S_{风力}|天气=小雨)\\
&=Entropy(S_{小雨})-\frac{2}{5}Entropy(S_{强}|天气=小雨)-\frac{3}{5}Entropy(S_{弱}|天气=小雨)\\
&=0.971
\end{aligned}
\]

因此,当天气=小雨时,信息增益最大的为风力,选择该列生长:

风力=强 的时候:

天数 天气 气温 湿度 风力 是否打球
D6 小雨 凉爽 正常
D14 小雨 中等 湿

标签结果一致,信息熵为0。

风力=弱的时候:

天数 天气 气温 湿度 风力 是否打球
D4 小雨 中等 湿
D5 小雨 凉爽 正常
D10 小雨 中等 正常

标签结果一致,信息熵为0。

引用

[1] Quinlan J R . Induction of Decision Trees[J]. Machine Learning, 1986, 1(1):81-106.

[2] University of FLORIDA.The ID3 Algorithm[EB/OL].https://www.cise.ufl.edu/~ddd/cap6635/Fall-97/Short-papers/2.htm,1997.

[3] Xiaohu W , Lele W , Nianfeng L . An Application of Decision Tree Based on ID3[J]. Physics Procedia, 2012, 25:1017-1021.

[4] Sefik Ilkin Serengil.A Step by Step ID3 Decision Tree Example[EB/OL].https://sefiks.com/2017/11/20/a-step-by-step-id3-decision-tree-example/,2017.

[5] Yaser Sakkaf.Decision Trees: ID3 Algorithm Explained[EB/OL].https://towardsdatascience.com/decision-trees-for-classification-id3-algorithm-explained-89df76e72df1,2020.

机器学习-决策树之ID3算法的更多相关文章

  1. 决策树之ID3算法

    一.决策树之ID3算法简述 1976年-1986年,J.R.Quinlan给出ID3算法原型并进行了总结,确定了决策树学习的理论.这可以看做是决策树算法的起点.1993,Quinlan将ID3算法改进 ...

  2. 【Machine Learning】决策树之ID3算法 (2)

    决策树之ID3算法 Content 1.ID3概念 2.信息熵 3.信息增益 Information Gain 4. ID3 bias 5. Python算法实现(待定) 一.ID3概念 ID3算法最 ...

  3. 【Machine Learning·机器学习】决策树之ID3算法(Iterative Dichotomiser 3)

    目录 1.什么是决策树 2.如何构造一棵决策树? 2.1.基本方法 2.2.评价标准是什么/如何量化评价一个特征的好坏? 2.3.信息熵.信息增益的计算 2.4.决策树构建方法 3.算法总结 @ 1. ...

  4. 简单易学的机器学习算法——决策树之ID3算法

    一.决策树分类算法概述     决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类.例如对于如下数据集 (数据集) 其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是 ...

  5. 鹅厂优文 | 决策树及ID3算法学习

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:袁明凯|腾讯IEG测试开发工程师 决策树的基础概念 决策树是一种用树形结构来辅助行为研究.决策分析以及机器学习的方式,是机器学习中的 ...

  6. 决策树之ID3算法实现(python)

    决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ...

  7. 《机器学习实战》ID3算法实现

    注释:之前从未接触过决策树,直接上手对着书看源码,有点难,确实有点难-- 本代码是基于ID3编写,之后的ID4.5和CART等还没学习到 一.决策树的原理 没有看网上原理,直接看源码懂得原理,下面是我 ...

  8. 机器学习 —— 决策树及其集成算法(Bagging、随机森林、Boosting)

    本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/ 决策树--------------------------------------------- ...

  9. 机器学习之决策树(ID3 、C4.5算法)

    声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...

随机推荐

  1. C语言讲义——变量(variable)

    变量(variable) 变量用于存放数据 变量是供程序操作的存储区的名字 变量有类型,该类型决定了变量占用内存的大小 字节→ C语言有以下6种简单变量类型: 类型细分: 变量在内存中需要占据空间,内 ...

  2. 通过Consul Raft库打造自己的分布式系统

    通用的CP系统有etcd和consul, 通用的对立面就是专用系统. 所以在某些场合是有这种需求的. 然而etcd embed的可用性极差, Windows上面跑会出现各种问题, 而且不能定制协议, ...

  3. ios真机使用fixed定位页面滚动时fixed定位的元素也会跟着滚动

    到了ios真机APP中,页面向下滚动,fixed的元素也跟着滚,虽然最后它还是到了它该在的地方,但是它跟着滚动也很影响页面的流畅性和交互性好伐.

  4. 06_Intent和IntentFilter

    Intent是同一个或不同的应用中的组件之间的消息传递的媒介,是一个将要执行动作的抽象描述,一般来说是作为参数来使用. Intent描述要启动的基本组件: IntentFilter对组件进行过滤. 下 ...

  5. 对象不支持“assign”属性或方法

    1. 报错信息 vue项目打包部署后,ie11报错内容如下: 看到报错信息肯定是语法兼容问题了,经测试 Edge 无此情况,部分ie9也有此类问题. 2. 尝试方法 安装 create-react-a ...

  6. JZOJ8月5日提高组反思

    JZOJ8月5日提高组反思 再次炸了 虽然不是爆0 但也没差多少-- T1 想的DP 然后就打了 一开始是只能拿60的 后来想到了用前缀和优化 然后打完交了 最后一分钟测了一下空间 爆了 就赶紧把数组 ...

  7. IDEA2020.2.4最新激活教程,有效期到2089

    前言 昨天又有好多粉丝反馈Idea失效过期,也有群里的小伙伴私聊问我,最新的Idea2020.2.4 版本要如何激活? 于是自己在网上搜罗了各种注册码.激活码,均以失败告终,有的虽然当时成功了,当时很 ...

  8. 雪花算法 Java 版

    雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0 41 bit: 时间差,我们 ...

  9. 4、Spring Cloud Eureka

    1.Eureka简介 (1).CAP简介 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition toleran ...

  10. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget提供的currentItem当前项操作访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 当前项是指当前鼠标和键盘焦点所在项,在项可以进行选择操作时,当前项可以是选中状态,也可以是未选中状态 ...