概述

决策树(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. IDEA创建web工程,不用Archetype(超简单)

    Idea不用Archetype创建Web项目 以新建模块为例. 新建Maven项目 不勾选[Create from artchetype],直接Next pom中添加一句话: <artifact ...

  2. C++基础知识篇:C++ 存储类

    存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern m ...

  3. GitHub 访问不顺怎么办?在线等,急

    在日常的工作生活学习中 经常会遇到无法访问 GitHub.访问不稳定等等突发情况 这不,今天群里的朋友们又双叒叕遇到了问题-- 为方便用户从 GitHub 快速备份开源仓库,稳定访问,CODING 现 ...

  4. 冲刺随笔——Day_Ten

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  5. C#.NET 强大的LINQ

    LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的 ...

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

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

  7. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  8. 第15.47节、PyQt显示部件:QGraphicsView图形视图和QGraphicsScene图形场景简介及应用案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Graphics V ...

  9. 问题:PyCharm调试方法Force Step over与step over的区别

    Force Step over与step over的差别是,后者在执行到函数时,如果函数中设置了断点,会在该函数断点处暂停,等待进一步调试指令,而Force Step over不论函数中是否有断点,都 ...

  10. Python Flask后端异步处理(三)

    前一篇博文我们已经将基础知识和环境配置进行了介绍:https://www.cnblogs.com/Cl0ud/p/13192925.html,本篇博文在实际应用场景中使用Celery,对Flask后端 ...