概述

决策树(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. 红外遥控接收发射原理及ESP8266实现

    红外遥控是利用近红外光进行数据传输的一种控制方式.近红外光波长0.76um~1.5um ,红外遥控收发器件波长一般为 0.8um~0.94um ,具有传输效率高,成本低,电路实现简单,抗干扰强等特点, ...

  2. Java蓝桥杯——逻辑推理练习题

    逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...

  3. Java集合【3】-- iterable接口超级详细解析

    目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...

  4. 10万级etl批量作业自动化调度工具Taskctl之轻量级Web应用版

    什么是批量作业: 批量处理是银行业整个信息后台最为重要的技术形态,也是银行核心信息资产数据的分享.传输.演化的重要技术手段.有调查指出,全球70%的数据是经过批量处理得以再次使用,可见批量处理在整个信 ...

  5. CentOS 使用文件增加Swap空间

    使用硬盘文件增加swap空间 ///创建文件 dd if=/dev/zero of=/SWAP/swapfile bs=1M count=1000 ///格式化 mkswap /SWAP/swapfi ...

  6. 如何使用TradingView(TV)回测数字货币交易策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...

  7. 第8.17节 Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析

    一. 引言 记得刚开始学习Python学习字符串相关内容的时候,查了很多资料,也做了些测试,对repr和str这两个函数的返回值老猿一直没有真正理解,因为测试发现这两个函数基本上输出时一样的.到现在老 ...

  8. Python & PyQt学习随笔:PyQt主程序的基本框架

    在完成UI设计将UI通过PyUic转成Py文件后,由于这个生成的文件每次通过PyUic生成时都会被覆盖,因此应用的主程序必须另外单独编写py文件.需要将UI生成的文件import到主程序的py文件中. ...

  9. Leetcode学习笔记(3)

    题目1 ID88 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量 ...

  10. [BJDCTF 2nd]简单注入

    [BJDCTF 2nd]简单注入 hint.txt出现了内容. 大概意思和国赛一道题相同. username处注入\来转义单引号,password处使用sql语句整数型注入. 例如: 传入admin\ ...