Quotes:原作:戴申 http://cos.name/old/view.php?tid=43&id=88
网络上有许多关于ID3算法的讲解,但是看来看去总是觉得一头雾水,每到想要关注细节的地方,文章便嘎然而止,一句计算 方法同理便把需要关心的内容一带而过,不得不感叹,这个世界聪明的人太多,像我这样笨人太少。说句实话,ID3的计算不是太复杂,也就是三两的公式,但是 涉及递归计算,绕来绕去就把自己给饶糊涂了,由于本人对数字不敏感,但对图形还是可以的,其实大家对图像对很敏感。于是就有了用图形形象地把ID3的计算 过程记载下来的想法,以便帮助同我一样笨的人学起来不再痛苦。在网上找了些文章,拼凑了一下就产生了本文。
属性选择
ID3 怎样决定那一个属性最好?使用一个叫做信息增益的统计特性。选择增益最大的那一个(信息对分类最有用)。为了定义增益,首先要借助信息理论的一个概念——熵。熵可以测量属性的信息量。
已知有C个结果的训练集S
Entropy(S) = -p(I) log2 p(I) ------(公式1)
这里 p(I) 是属于类I的S的比例。 是对C求和。Log2 以2为底的自然对数。
如果所有S属于相同的类,熵为0(数据分类完毕)。熵的范围是0(分类完毕)到1(完全随机)。
注意: S 不但是属性而且也是整个样本集(这一点刚开始可能有点混淆)。
Entropy(S,A) =(|Sv| / |S|) * Entropy(Sv) -----(公式2)
这里:是属性A的所有可能的值v
Sv = 属性A有v值的S子集
|Sv| = Sv中元素个数
|S| = S中元素个数
Gain(S, A) 是属性A在集S上的信息增益,定义为:
Gain(S, A) = Entropy(S) - Entropy(S,A) -----(公式3)
Gain(S, A)是指已知属性A的值后导致熵的减少。Gain(S, A)越大,说明选择测试属性A对分类提供的信息越多。
ID3的例子
假设我们希望用ID3 决定天气是否适合打垒球。在过去的两周中,收集了14天的数据帮助ID3 建立决策树。
目标分类是“我们可以去打垒球吗?”,它有两种选择,可以或不可以。
天气可以用四个属性来刻画,户外,温度,湿度和风速。它们的属性值分别为:
户外 = { 晴天, 阴天, 雨天 }
温度 = {炎热, 温柔, 凉爽 }
湿度 = { 高, 正常 }
风速 = {弱, 强 }
根节点的选择:
根节点的选择标准就是看哪一个属性的增益最大。下面是计算四个属性的增益:
我天生懒惰,对一些数来数去的工作感觉不能胜任,头发昏,于是就用软件来代替查数的工作,这样便选择了用SPSS完成计算过程的演示工作,繁琐的事情都由机器代劳了,免去我的烦恼。
使用SPSS进行计算过程的演示:
首先导入数据:
|
第一步 :计算决策属性的熵
决策属性活动有14个记录,其中9个记录活动可以进行,5个记录不适合活动,
那么使用公式1计算熵。
Entropy(活动) = - (9/14) Log2 (9/14) - (5/14) Log2 (5/14) = 0.940
声明一下,由于在SPSS中没有找到以2为底的对数函数,所以这部分计算熵的工作不得不自己动手完成,尽管十分不情愿。
如果直接计算上式,相信多数人不会有太多的印象,要是对熵的概念不是很熟悉,还真有点不好记,还是利用人类适合记忆图像的特点,将计算过程图示化。
按变量 活动对数据进行排序:
SORT CASES BY 活动 .
EXE.
观察变量 活动那一列, 9个适合活动的记录, 5个不适合活动的记录,比较醒目。
图1:略(参见附件)
第二步:计算条件属性的熵
样本集共有四个条件属性, 户外,温度,湿度和 风速。使用公式2计算条件属性的熵。
风速的熵:
计算分两个过程,首先使用公式1计算属性值的熵,即风速强和风速弱。
Entropy(S弱) = - (6/8)*log2(6/8) - (2/8)*log2(2/8) = 0.811
Entropy(S强) = - (3/6)*log2(3/6) - (3/6)*log2(3/6) = 1.00
然后使用公式2计算属性的熵。
Entropy (S,风速)=(8/14)*Entropy(S弱)+(6/14)*Entropy(S强)
= (8/14)*0.811 + (6/14)*1.00
= 0.892
图2:略(参见附件)
户外的熵:
户外有三个属性值,晴天,阴天和雨天。其熵分别为:
Entropy(S晴天) = - (2/5)*log2(2/5) - (3/5)*log2(3/5) = 0.971
Entropy(S阴天) = - (4/4)*log2(4/4) = 0 (熵为0表示这一支比较纯,没有分下去的必要)
Entropy(S雨天) = - (3/5)*log2(3/5)- (2/5)*log2(2/5) = 0.971
户外的熵:
Entropy (S,户外)=(5/14)*Entropy(S晴天)+(4/14)*Entropy(S阴天)
+5/14)* Entropy(S雨天)= (5/14)*0.971 + (4/14)*0 +(5/14)*0.971
= 0.693
为了便于比较,需要将各个变量的位置进行轮换。实现的程序如下:
|
图2:略(参见附件)
温度的熵:
温度有三个属性值,凉爽,温柔和炎热。它们的熵分别为
Entropy(S凉爽) = - (3/4)*log2(3/4) - (1/4)*log2(1/4) = 0.811
Entropy(S温柔) = - (4/6)*log2(4/6) - (2/6)*log2(2/6) = 0.918
Entropy(S炎热) = - (2/4)*log2(2/4)- (2/4)*log2(2/4) = 1
温度的熵:
Entropy (S,温度)=(4/14)*Entropy(S凉爽)+(6/14)*Entropy(S温柔)
+(4/14)* Entropy(S炎热)
= (4/14)*0.811 + (6/14)*0.918+(4/14)*1
= 0.911
位置轮换的程序为:
|
图3:略(参见附件)
湿度的熵:
变量 湿度有两个属性值,湿度正常和湿度高,它们的熵分别为
Entropy(S高) = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.985
Entropy(S正常) = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.591
湿度的熵:
Entropy (S,湿度)=(7/14)*Entropy(S高)+(7/14)*Entropy(S正常)
= (7/14)*0.985 + (7/14)*0.591
= 0.789
位置轮换的程序为:
|
图4:略(参见附件)
第三步:计算条件属性的增益
使用公式3计算条件属性的增益为:
Gain(S, 户外) = Entropy(活动) - Entropy (S,户外) = 0.94- 0.693 = 0.246
Gain(S, 温度) = Entropy(活动) - Entropy (S,温度) = 0.94- 0.911 = 0.029
Gain(S, 湿度) = Entropy(活动) - Entropy (S,湿度) = 0.94- 0.789 = 0.151
Gain(S, 风速) = Entropy(活动) - Entropy (S,风速) = 0.94- 0.892 = 0.048
条件属性 户外有最大的增益,所以它用于决策树的根节点。
如果你连数都懒得数,可以使用下列程序直接生成频数表,在里面自己挑选对应的数字。
生成计算熵的频数表程序:
|
图5:略(参见附件)
支节点的选择:
因为 户外有三种类型,根节点就有三个分支(晴天,阴天,雨天)。由于阴天的熵为0,就不用考虑它了。下面考虑晴天和雨天。
晴天支节点的选择:
接下来的问题是“在晴天支节点处应该检验什么属性?”。 因为已经使用户外为根节点,只能用剩余三个变量:温度,湿度或风速。
户外为晴天的记录有 5 个,S晴天 = {D1, D2, D8, D9, D11}
第一步:计算户外为晴天的熵,前面已经计算完成,即Entropy(S晴天) = 0.970
第二步:计算户外为晴天的条件下各属性的熵
温度的熵
温度有三个属性值,凉爽,温柔和炎热。它们的熵分别为
Entropy(S凉爽) = - (1/1)*log2(1/1) = 0 (纯洁了)
Entropy(S温柔) = - (1/2)*log2(1/2) - (1/2)*log2(1/2) = 1
Entropy(S炎热) = - (2/2)*log2(2/2) = 0 (纯洁了)
温度的熵:
Entropy (S晴天,温度)=(1/5)*Entropy(S凉爽)+(2/5)*Entropy(S温柔)
+(2/5)* Entropy(S炎热)
= (1/5)*0 + (2/5)*1+(2/5)*0
= 0.4
位置轮换的程序为:
|
图6:略(参见附件)
湿度的熵
湿度有两个属性值,湿度正常和湿度高,它们的熵分别为
Entropy(S高) = - (3/3)*log2(3/3) = 0
Entropy(S正常) = - (2/2)*log2(2/2) = 0
湿度的熵:
Entropy (S晴天,湿度)=(3/5)*Entropy(S高)+(2/5)*Entropy(S正常)
= (3/5)*0 + (2/5)*0
= 0 (纯洁了)
位置轮换的程序为:
|
图7:略(参见附件)
风速的熵
风速的属性值强和正常的熵分别为
Entropy(S弱) = - (1/3)*log2(1/3) - (2/3)*log2(2/3) = 0.918
Entropy(S强) = - (1/2)*log2(1/2) - (1/2)*log2(1/2) = 1.00
风速的熵
Entropy (S晴天,风速)=(3/5)*Entropy(S弱)+(2/5)*Entropy(S强)
= (3/5)*0.918 + (2/5)*1.00
= 0.9508
位置轮换的程序为:
|
图8:略(参见附件)
第三步:计算属性的增益
在户外为晴天的记录中,三个变量的增益分别为:
Gain(S晴天,温度)= Entropy(S晴天)- Entropy (S晴天,温度) = 0.970 – 0.4 = 0.570
Gain(S晴天,湿度) = Entropy(S晴天) - Entropy (S晴天,湿度) = 0.970 – 0 = 0.970
Gain(S晴天, 风速) = Entropy(S晴天) - Entropy (S晴天,风速) = 0.970-0.951= 0.019
湿度有最大增益;所以它用作晴天的支节点。因为Entropy (S晴天,湿度)= 0,所以这一支的分类结束。
雨天支节点的选择:
需要了解的问题是“在雨天支节点处应该检验什么属性?”。
户外为雨天的记录有5 个,S雨天 = {D4, D5, D6, D10, D14}
第一步:计算户外为雨天的熵,前面已经计算完成,即Entropy(S雨天) = 0.970
第二步:计算户外为雨天的条件下各属性的熵
温度的熵
在嵌套计算中, 温度有三个属性,凉爽,温柔和炎热。它们的熵分别为
Entropy(S凉爽) = - (1/2)*log2(1/2) - (1/2)*log2(1/2) = 1
Entropy(S温柔) = - (2/3)*log2(2/3) - (1/3)*log2(1/3) = 0.918
Entropy(S炎热) = 0 (纯洁了)
温度的熵:
Entropy (S雨天,温度)=(2/5)*Entropy(S凉爽)+(3/5)*Entropy(S温柔)
= (2/5)*1 + (2/5)*0.918
= 0.767
位置轮换的程序为:
|
图9:略(参见附件)
湿度的熵
在嵌套计算中,变量湿度有两个属性,湿度正常和湿度高,它们的熵分别为
Entropy(S高) = - (1/2)*log2(1/2) - (1/2)*log2(1/2) = 1
Entropy(S正常) = - (2/3)*log2(2/3) - (1/3)*log2(1/3) = 0.918
湿度的熵:
Entropy (S雨天,湿度)=(3/5)*Entropy(S高)+(2/5)*Entropy(S正常)
= (3/5)*1 + (2/5)*0.918
= 0.967
位置轮换的程序为:
|
图10:略(参见附件)
风速的熵
在嵌套计算中,风速的属性值强和正常的熵分别为
Entropy(S弱) = - (3/3)*log2(3/3) = 0 (纯洁了)
Entropy(S强) = - (2/2)*log2(2/2) = 0 (纯洁了)
风速的熵:
Entropy (S雨天,风速)=(3/5)*Entropy(S弱)+(2/5)*Entropy(S强)
= (3/5)*0 + (2/5)*0
= 0 (纯洁了)
位置轮换的程序为:
|
图11:略(参见附件)
第三步:计算属性的增益
在户外为雨天的记录中,三个变量的增益分别为:
Gain(S雨天,温度)= Entropy(S雨天)- Entropy (S雨天,温度) = 0.970– 0.767 = 0.203
Gain(S雨天, 湿度) = Entropy(S雨天) - Entropy (S雨天,湿度)=0.970–0.967= 0.003
Gain(S雨天, 风速) = Entropy(S雨天) - Entropy (S雨天,风速) = 0.970 – 0 = 0.970
风速有最大增益;所以它用作雨天的支节点。
因为晴天的湿度高和正常的熵为0,所以这一支划分结束。雨天的风速强和弱的熵为0,所以这一支也划分结束。
最后形成的分类树大致是这个样子:
图12:略(参见附件)
决策树也能用规则公式表示:
如果户外为 晴天并且湿度 高,那么活动 取消
如果户外为 晴天并且湿度 正常,那么活动 进行
如果户外为 阴天,那么活动 进行
如果户外为 雨天并且风 大,那么活动 取消
如果户外为 雨天并且风 弱,那么活动 进行
至此,ID3的算法就演示完毕,尽管这个算法比较土,但它是分类树的根,还是了解一下比较好。
作者联系方式:itellin@163.com