数据集为西瓜数据集2.0,如下所示:
编号,色泽,根蒂,敲声,纹理,脐部,触感,好瓜
1, 青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2, 乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3, 乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4, 青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5, 浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6, 青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7, 乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8, 乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9, 乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10, 青绿,硬挺,清脆,清晰,平坦,软粘,否
11, 浅白,硬挺,清脆,模糊,平坦,硬滑,否
12, 浅白,蜷缩,浊响,模糊,平坦,软粘,否
13, 青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14, 浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15, 乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16, 浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17, 青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否
ID3决策树算法以信息增益为准则来选择最优划分属性。
求信息熵:
python实现求信息熵函数ent,代码如下:
import math
def ent(*pk: float) -> float:
sum = 0.0
for p in pk:
if p == 0.0:
sum += 0
else:
sum += -1 * p * math.log(p, 2)
return sum
根结点信息熵:
p1 = 8/17
p2 = 9/17
Ent(D) = ent(p1, p2) = 0.9975025463691153
以色泽为划分属性的各结点信息熵:
1.色泽:青绿D1
p1 = 3/6
p2 = 3/6
Ent(D1) = ent(p1, p2) = 1.0
2.色泽:乌黑D2
p1 = 4/6
p2 = 2/6
Ent(D2) = ent(p1, p2) = 0.9182958340544896
3.色泽:浅白D3
p1 = 1/5
p2 = 4/5
Ent(D3) = ent(p1, p2) = 0.7219280948873623
以根蒂为划分属性的各结点信息熵:
......
求信息增益:
以色泽为划分属性的信息增益:
Gain(D,色泽) = Ent(D) - 6/17Ent(D1) - 6/17Ent(D2) - 5/17Ent(D3)
=0.9975025463691153-6/17*1.0-6/17*0.9182958340544896-5/17*0.7219280948873623
=0.10812516526536536
同样方法可计算其他属性的信息增益:
Gain(D,根蒂) = 0.143
Gain(D,敲声) = 0.141
Gain(D,纹理) = 0.381
Gain(D,脐部) = 0.289
Gain(D,触感) = 0.006
可以看出属性“纹理”的信息增益最大,于是它被选为最优划分属性。
此后,决策树算法对分支结点清晰、稍糊和模糊做进一步划分,方法同上,选择各个结点具有最大信息增益的属性作为最优划分属性。
最终得到决策树: