机器学习-决策树之ID3算法
概述
决策树(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,...,Cn。Si对应Ci类别下数据子集,因此,数据集S的信息熵计算如下:
\]
其中,pi是数据样本为Ci的概率,因此:
\]
|Si|是类别Ci在数据集S中的数据数量,|S|是数据集S中的数据数量。
步骤2
假设特征A有k种不同的取值,根据特征A,一定条件下的数据集S可以分为k个子集{S1,...,Sk},因此,数据集S的信息熵可以按照如下方式计算:
\]
步骤3
假设数据集S根据特征A不同的取值分为众多子集,则信息增益的计算为:
\]
计算数据集中每一个特征的信息增益,如Gain(S,B), Gain(S,C)等,选取信息增益最大的特征作为树中新的节点。
计算信息增益
天气的各个属性如上图所示,它们所有可能的值如下所示:
- 天气:晴朗、小雨、大雨
- 气温:热、中等、凉爽
- 湿度:正常、湿
- 风力:弱、强
同时,S中有14天的历史天气和活动数据,其中,打球的有9天,不打球的5天,因此数据集S的熵可以计算为:
\]
现在我们开始计算每一列的信息增益。
对于天气列,有晴朗、小雨、大雨三种情况,根据三种情况划分对应的数据子集。
当天气为晴朗时,涉及到的数据如下:
| 天数 | 天气 | 气温 | 湿度 | 风力 | 是否打球 |
|---|---|---|---|---|---|
| D1 | 晴朗 | 热 | 湿 | 弱 | 否 |
| D2 | 晴朗 | 热 | 湿 | 强 | 否 |
| D8 | 晴朗 | 中等 | 湿 | 弱 | 否 |
| D9 | 晴朗 | 凉爽 | 正常 | 弱 | 是 |
| D11 | 晴朗 | 中等 | 正常 | 强 | 是 |
此时有5天的数据,出去打球的有2天,不打球的有3天,因此熵值为:
\]
当天气为小雨时,涉及到的数据如下:
| 天数 | 天气 | 气温 | 湿度 | 风力 | 是否打球 |
|---|---|---|---|---|---|
| D4 | 小雨 | 中等 | 湿 | 弱 | 是 |
| D5 | 小雨 | 凉爽 | 正常 | 弱 | 是 |
| D6 | 小雨 | 凉爽 | 正常 | 强 | 否 |
| D10 | 小雨 | 中等 | 正常 | 弱 | 是 |
| D14 | 小雨 | 中等 | 湿 | 强 | 否 |
此时有5天的数据,出去打球的有3天,不打球的有2天,因此熵值为:
\]
当天气为大雨时间,涉及到的数据如下:
| 天数 | 天气 | 气温 | 湿度 | 风力 | 是否打球 |
|---|---|---|---|---|---|
| D3 | 大雨 | 热 | 湿 | 弱 | 是 |
| D7 | 大雨 | 凉爽 | 正常 | 强 | 是 |
| D12 | 大雨 | 中等 | 湿 | 强 | 是 |
| D13 | 大雨 | 热 | 正常 | 弱 | 是 |
此时有4天的数据,出去打球的有4天,不打球的有0天,因此熵值为:
\]
熵值为0,所有数据(标签)都处在同一类,决策树在该分支上停止生长。
由此可以计算天气这一列的信息熵:
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}
\]
其信息增益为:
Gain(S,天气)&=Entropy(S)-Entropy(S_{天气})\\
&=0.94-0.69\\
&=0.25
\end{aligned}
\]
由此可得:
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天,因此熵值为:
\]
当气温=中等时:
| 天数 | 天气 | 气温 | 湿度 | 风力 | 是否打球 |
|---|---|---|---|---|---|
| D8 | 晴朗 | 中等 | 湿 | 弱 | 否 |
| D11 | 晴朗 | 中等 | 正常 | 强 | 是 |
此时有2天的数据,出去打球的有1天,不打球的有1天,因此熵值为:
\]
当气温=热时:
| 天数 | 天气 | 气温 | 湿度 | 风力 | 是否打球 |
|---|---|---|---|---|---|
| D1 | 晴朗 | 热 | 湿 | 弱 | 否 |
| D2 | 晴朗 | 热 | 湿 | 强 | 否 |
此时有2天的数据,出去打球的有0天,不打球的有2天,因此熵值为:
\]
因此天气=晴朗时,气温列的信息增益为:
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.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次不打球,因此中等气温时的熵值为:
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次不打球,因此凉爽气温时的熵值为:
Entropy(S_{凉爽}|天气=小雨)&=-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]-[\frac{1}{2}\times\log_{2}{\frac{1}{2}}]=1.0
\end{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}
\]
同理:
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算法的更多相关文章
- 决策树之ID3算法
一.决策树之ID3算法简述 1976年-1986年,J.R.Quinlan给出ID3算法原型并进行了总结,确定了决策树学习的理论.这可以看做是决策树算法的起点.1993,Quinlan将ID3算法改进 ...
- 【Machine Learning】决策树之ID3算法 (2)
决策树之ID3算法 Content 1.ID3概念 2.信息熵 3.信息增益 Information Gain 4. ID3 bias 5. Python算法实现(待定) 一.ID3概念 ID3算法最 ...
- 【Machine Learning·机器学习】决策树之ID3算法(Iterative Dichotomiser 3)
目录 1.什么是决策树 2.如何构造一棵决策树? 2.1.基本方法 2.2.评价标准是什么/如何量化评价一个特征的好坏? 2.3.信息熵.信息增益的计算 2.4.决策树构建方法 3.算法总结 @ 1. ...
- 简单易学的机器学习算法——决策树之ID3算法
一.决策树分类算法概述 决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类.例如对于如下数据集 (数据集) 其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是 ...
- 鹅厂优文 | 决策树及ID3算法学习
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:袁明凯|腾讯IEG测试开发工程师 决策树的基础概念 决策树是一种用树形结构来辅助行为研究.决策分析以及机器学习的方式,是机器学习中的 ...
- 决策树之ID3算法实现(python)
决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ...
- 《机器学习实战》ID3算法实现
注释:之前从未接触过决策树,直接上手对着书看源码,有点难,确实有点难-- 本代码是基于ID3编写,之后的ID4.5和CART等还没学习到 一.决策树的原理 没有看网上原理,直接看源码懂得原理,下面是我 ...
- 机器学习 —— 决策树及其集成算法(Bagging、随机森林、Boosting)
本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/ 决策树--------------------------------------------- ...
- 机器学习之决策树(ID3 、C4.5算法)
声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...
随机推荐
- 红外遥控接收发射原理及ESP8266实现
红外遥控是利用近红外光进行数据传输的一种控制方式.近红外光波长0.76um~1.5um ,红外遥控收发器件波长一般为 0.8um~0.94um ,具有传输效率高,成本低,电路实现简单,抗干扰强等特点, ...
- Java蓝桥杯——逻辑推理练习题
逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...
- Java集合【3】-- iterable接口超级详细解析
目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...
- 10万级etl批量作业自动化调度工具Taskctl之轻量级Web应用版
什么是批量作业: 批量处理是银行业整个信息后台最为重要的技术形态,也是银行核心信息资产数据的分享.传输.演化的重要技术手段.有调查指出,全球70%的数据是经过批量处理得以再次使用,可见批量处理在整个信 ...
- CentOS 使用文件增加Swap空间
使用硬盘文件增加swap空间 ///创建文件 dd if=/dev/zero of=/SWAP/swapfile bs=1M count=1000 ///格式化 mkswap /SWAP/swapfi ...
- 如何使用TradingView(TV)回测数字货币交易策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...
- 第8.17节 Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析
一. 引言 记得刚开始学习Python学习字符串相关内容的时候,查了很多资料,也做了些测试,对repr和str这两个函数的返回值老猿一直没有真正理解,因为测试发现这两个函数基本上输出时一样的.到现在老 ...
- Python & PyQt学习随笔:PyQt主程序的基本框架
在完成UI设计将UI通过PyUic转成Py文件后,由于这个生成的文件每次通过PyUic生成时都会被覆盖,因此应用的主程序必须另外单独编写py文件.需要将UI生成的文件import到主程序的py文件中. ...
- Leetcode学习笔记(3)
题目1 ID88 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量 ...
- [BJDCTF 2nd]简单注入
[BJDCTF 2nd]简单注入 hint.txt出现了内容. 大概意思和国赛一道题相同. username处注入\来转义单引号,password处使用sql语句整数型注入. 例如: 传入admin\ ...