决策树之ID3算法

来源:互联网 发布:ie无法登陆淘宝 编辑:程序博客网 时间:2024/05/17 07:23

概述

ID3 算法是构建决策树算法中一种非常重要的算法,可以说它是学习决策树算法的基础吧。比如,下一篇博客要说的 C4.5 决策树,就是基于 ID3 上的一个改进算法。还有 CART、随机森林算法,都是后面要讲解的。

引言

如果你是刚刚才接触到有关决策树的相关内容,那么你可能就会有一些疑问,什么是决策树?对于什么是决策树这个话题,如果站在编程的角度来类比,我想 if … else 是最贴切的了吧。就比如下面的这样的一棵最简单的决策树。 
这里写图片描述 
这是一棵是否出门打球的决策树,而决策的特征属性就是 Weather,如果天气状态为 Sunny、Overcast 则选择出门打球;如果下雨了那就只能待在家里了。 
如果上面的这棵决策树是按照我的选择来构建的,那么你的选择又会构建成一棵什么样的决策树呢?也就是说某一棵决策树只能代表某一种情况,可是我们是想拿构建好的决策树进行预测的,所以这时,就不能再只按照某一个人的意愿来构建决策树了。我们需要收集大量的训练数据,并使用这些训练数据进行构建决策树。


基础知识

数据挖掘的基础是数学,如果数学不太好,就一定要好好补补了(我也是数学不太好的那些人当中的一个)。ID3 算法当然也不例外地涉及了一些数学知识。主要的是两块内容:信息熵与信息增益。

信息熵

信息熵简介

中学时期,我们都有学习过熵的概念,主要是在物理跟化学中。在物理学科中,熵是用来描述分子的混乱程度的,在化学学科中也是类似的,如果我没有记错的话,当时熵在化学中的应用主要是某一化合物的加热这一块,比如给水加热,会变化水蒸汽,这时熵就是增大的;还就是化合反应这一块。 
那么在本文的 ID3 算法中,或者说在数据挖掘中的信息熵要怎么理解或是怎么应用呢?这里不妨打个最简单的比方,我们说假设有两篇文章,分别为:Article_1 和 Article_2,它们的内容如下: 
Article_1

<code class="hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

Article_2

<code class="hljs mathematica has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">信息论之父 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">C</span>. <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>. Shannon 在 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1948</span> 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中, Shannon 指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

对于上面的这两篇文章,我们要怎么衡量其信息量呢?文章的字数么?显然不是的,第一篇文章的字数要比第二篇文章的字数要多,然而其包含的信息量却要小一些。于是,信息熵的概念就此被引出,结合上面对熵的描述,你也可以理解成信息熵就是信息的混乱程度。

信息熵公式

假如一个随机变量 X 的取值为 X = {x1,x1,...,xn},每一种取到的概率分别是 {p1,p1,...,pn},那么 X 的熵定义为 

H(x)=i=1npilog2pi

信息增益

信息增益简介

信息增益的功能是描述一个特征属性对于总体的重要性,怎么理解这句话呢?打个比方吧,比如我想出去打球,这里可能会受到天气、温度、心情等等的因素地影响。那么对于天气这个特征属性而言,有天气这个属性跟没有天气这个属性,总体的信息量(也就是信息熵)的变化就是信息增益了。 
可能这里还不太清楚信息增益在决策树的构建中产生了什么作用,这个问题我们留到 ID3 算法部分再详细说明。

信息增益公式

IG(S|T)=Entropy(S)value(T)|Sv|SEntropy(Sv)

其中 S 为全部样本集合,value(T) 是属性 T 所有取值的集合,v 是 T 的其中一个属性值,Sv是 S 中属性 T 的值为 v 的样例集合,|Sv| 为 Sv 中所含样例数。


ID3

决策树构建分析

ID3 是数据挖掘中的一种非常重要的决策树构建算法,它是一种监督学习式的机器学习。由于这是一种监督学习,所以必然需要有一定数量的训练数据集,而每一条训练数据所形成的决策树都不一定是完全一样的。打个比方,假设有如下三条训练数据:

DayOutLookTemperatureHumidityWindPlayTennis1SunnyHotHighWeakNo2SunnyHotHighStrongNo3RainyMildHighWeakYes

那么对于 OutLook 这一特征属性而言,就有两种不同的状态值:Sunny 和 Rainy。就算是对于同一个 OutLook 状态值时,其结果分类也是一样的,这样我们构建的决策的标准是什么呢?

训练数据集

假设我们如下训练数据集

DayOutLookTemperatureHumidityWindPlayTennis1SunnyHotHighWeakNo2SunnyHotHighStrongNo3OvercastHotHighWeakYes4RainyMildHighWeakYes5RainyCoolNormalWeakYes6RainyCoolNormalStrongNo7OvercastCoolNormalStrongYes8SunnyMildHighWeakNo9SunnyCoolNormalWeakYes10RainyMildNormalWeakYes11SunnyMildNormalStrongYes12OvercastMildHighStrongYes13OvercastHotNormalWeakYes14RainyMildHighStrongNo

决策树构建过程

下面是我根据 ID3 构建决策树的算法步骤,绘制的决策树构建过程图。因为 ID3 其实是一个迭代的算法,这里我只绘制了一次迭代的过程,所以是一个局部示图。 
这里写图片描述 
当上面的局部过程中的最后一步计算出了最大信息增益之后,我们要将这个最大信息增益对应的特征属性进行移除,并将数据集切分成 N 个部分(其中 N 为分支状态数)。 
现在假设我们计算出当选择特征属性为 OutLook 的时候,其信息增益最大,那么原始数据就会被切分成如下 3 份:
part_sunny

DayTemperatureHumidityWindPlayTennis1HotHighWeakNo2HotHighStrongNo3MildHighWeakNo4CoolNormalWeakYes5MildNormalStrongYes

part_overcast

DayTemperatureHumidityWindPlayTennis1HotHighWeakYes2CoolNormalStrongYes3MildHighStrongYes4HotNormalWeakYes

part_rainy

DayTemperatureHumidityWindPlayTennis1MildHighWeakYes2CoolNormalWeakYes3CoolNormalStrongNo4MildNormalWeakYes5MildHighStrongNo

这样再把这 3 份数据分别当成上图中的 data 代入计算。通过这样循环地迭代,直到数据被全部计算完成。

计算步骤

如果上面信息熵跟信息增益的计算公式,让你看得有一些不是很懂,没关系。这里我会通过几个示例来分析一下计算过程,这样你就会更懂一些了。 
1. Entropy(S) 
2. Entropy(Ti
3. Entropy(S|T) 
4. IG(T)

Entropy(S)

对于最初始的 14 条记录,我们统计了结果分类,其中,Yes = 9,No = 5. 
这时当前信息的信息熵计算过程如下: 
Entropy(S)=914log2914514log2514=0.940286

Entropy(Ti)

假设这时我们需要计算最初始的 14 条记录中,特征属性为 OutLook 的分支状态信息熵。首先需要做的是,统计 OutLook 特征属性下的结果分类分布。

 SunnyOvercastRainyYes243No302

各个特征属性下的分支状态信息熵计算过程如下: 
Entropy(Sunny)=25log22535log235=0.970951 
Entropy(Overcast)=44log24404log204=0 
Entropy(Rainy)=35log23525log225=0.970951

Entropy(S|T)

统计完各个分支状态的信息熵之后,就需求合并,也就是某一特征属性的信息熵了。 
Entropy(S|OutLook)=514Entropy(Sunny)+414Entropy(Overcast)+514Entropy(Rainy)=0.693536

IG(T)

我们还是拿上面的数据进行计算。也就是计算 IG(OutLook). 
IG(OutLook)=Entropy(S)Entropy(S|OutLook)=0.9402860.693536=0.24675

决策树构建结果

通过上面的训练数据集及 ID3 构建算法,我们构建了一棵如下的 ID3 决策树。 
这里写图片描述

Ref

  • http://blog.csdn.net/acdreamers/article/details/44661149
  • http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html

GitHub download

此处为本文的算法实现,采用的编程语言为 Java。算法也是在不断重构及优化,如果你对此感兴趣,欢迎 star. 
- https://github.com/MachineLeanring/MachineLearningID3

0 0
原创粉丝点击