机器学习之决策树学习-ID3 算法
原理分析与 C 语言代码实现
作者:wxh5055 保留所有版权
本文先通过一个被经常使用的实例来简单说明决策树学习中 ID3 算法的基本原理,然后
详细介绍ID3 算法以及用C语言实现的方法,文章的最后给出ID3 算法的完整的C语言代码。
该实例的训练样本数据如表 1 所示。该训练样例的目标属性是 PlayTennis(打网球),即根据各属性类型 Outlook(天气)、Temperature(温度)、Humidity(湿度)和 Wind(风强度)的属性 值判断某一天是否打网球(Yes or No)。
Day Outlook Temperature Humidity Wind PlayTennis
Dl Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
Dl0 Rain Mild Normal Weak Yes
Dl1 Sunny Mild Normal Strong Yes
Dl2 Overcast Mild High Strong Yes
Dl3 Overcast Hot Normal Weak Yes
Dl4 Rain Mild High Strong No
表 1:ID3 算法使用的训练样例
ID3 算法即是根据上面的训练样例,自顶向下构造出一棵决策树。该决策树的最终形式如图 1(Tom M. Mitchell, Machine Learning):
图 1:ID3 算法生成的决策树
现在的问题是,如何确定决策树的根结点是 Outlook,而不是其他的属性类型?这就是
本文介绍的 ID3 算法需要详细说明的问题,也是 ID3 算法的核心问题,即选择哪个属性作为
决策树的根结点。
为了确定选择哪个属性作为决策树的根结点,我们需要引入一个叫“信息增益
(information gain)”的概念,ID3 算法就是选择信息增益最大的属性作为决策树的根结点。我
们先给出信息增益的计算公式,然后再进一步说明公式中每个成员的含义:
Gain(S,A):属性A 在训练样例S中的信息增益,在表1 中A 的取值为Outlook、Temperature、
Humidity 和 Wind。
Entropy(S):训练样例的熵,稍后会进一步说明熵的计算方法。
v∈Values(A):属性 A 的所有可能取值的集合,比如表 1 中对于属性 Outlook,v 的取值
为 Sunny、Overcast 和 Rain。
|Sv|:属性 A 中属性值为 v 的样本数,比如表 1 中属性 Outlook 的属性值等于 Sunny 的样本数是 5,属性值等于 Overcast 的样本数是 4,属性值等于 Rain 的样本数是 5。
|S|:训练样例的样本总数,表 1 中|S|等于 14。
Entropy(Sv):训练样例里属性 A 中属性值为 v 的训练样本的熵,稍后会进一步详细说明
其计算方法。
现在我们介绍训练样例的熵的计算方法,还是先给出熵的计算公式,然后再进一步说明
公式中每个成员的含义:
p⊕:训练样例中目标属性为正(Yes)的样本数的比例,在表 1 中样本总数为 14,目标属
性为正(Yes)的样本数为 9,所以 p⊕等于 9/14。
pΘ:训练样例中目标属性为负(No)的样本数的比例,在表 1 中样本总数为 14,目标属性为负(No)的样本数为 5,所以 pΘ 等于 5/14。
所以该训练样例的熵 Entropy(S)=-(9/14)×log2(9/14)-(5/14)×log2(5/14)=0.940。
接下来我们详细介绍信息增益公式中 Entropy(Sv)的计算方法,以计算属性类型为
Outlook的信息增益来进行说明。
属性 Outlook 的属性值 v 的取值范围为{Sunny, Overcast, Rain},所以计算熵 Entropy(S
v)
就相当于要分别计算 Entropy(SSunny)、Entropy(SOvercase)和 Entropy(SRain),每个代表 v取不同
的值时的熵。
先介绍 v取值 Sunny时 Entropy(SSunny)的计算方法。在表 1 的训练样例中,v=Sunny的
训练