决策树建树原理之ID3建树原理(一)
信息熵
在ID3算法之中,建树的时候,是根据信息增益挑选最具有解释能力的变量,在了解信息增益之前需要先了解信息熵和条件熵。
对于一个变量
A
A
A,变量
A
A
A中有
n
1
n_1
n1个水平个数,则信息熵的数学表达式如下:
E
n
t
r
o
p
y
(
A
)
=
−
∑
i
=
1
n
1
p
i
l
o
g
(
p
i
)
Entropy(A)=-\sum_{i=1}^{n_1}p_ilog(p_i)
Entropy(A)=−i=1∑n1pilog(pi)
其中,
p
i
p_i
pi是变量
A
A
A的每个水平对应的概率,例如
A
A
A有10个观测值,有3个水平,分别是
a
1
a_1
a1,
a
2
a_2
a2,
a
3
a_3
a3,对应的个数分别是2个,3个,5个。则
p
a
1
p_{a_1}
pa1=2/10,
p
a
2
p_{a_2}
pa2=3/10,
p
a
3
p_{a_3}
pa3=5/10。信息熵越小,表示包含的信息越小,变量
A
A
A的水平越少,即
A
A
A的纯度越高。以上为信息熵的简单概念介绍。
对于
l
o
g
log
log的底数取值:
l
o
g
log
log函数基的选择是任意的(信息论中基常常选择为2,因为计算机中每个bit为0/1。而机器学习中基常常选择为自然常数,因此单位常常被称为nats)。
条件熵
假设新加入一个变量
B
B
B,变量
B
B
B中有
n
2
n_2
n2个水平个数,则变量
A
A
A的水平被变量
B
B
B的各个水平所分割,则可以通过计算变量
B
B
B的各个水平下变量
A
A
A的信息熵加权,从而得到在加入变量
B
B
B后,变量
A
A
A的纯度。条件熵的数学表达式如下:
E
n
t
r
o
p
y
B
(
A
)
=
∑
j
=
1
n
2
∣
A
j
A
∣
E
n
t
r
o
p
y
(
A
j
)
Entropy_B(A)=\sum_{j=1}^{n_2}\left|\frac{A_j}{A}\right|Entropy(A_j)
EntropyB(A)=j=1∑n2∣∣∣∣AAj∣∣∣∣Entropy(Aj)
其中,
A
j
A_j
Aj是变量
A
A
A被变量
B
B
B的水平所分割的观测数,
A
A
A是变量的观测数量,
E
n
t
r
o
p
y
(
A
j
)
Entropy(A_j)
Entropy(Aj)被称为变量
A
A
A在变量
B
B
B的水平分割下的信息熵。
信息增益
信息增益就是利用原来的信息熵减去条件熵,表示原有的变量
A
A
A加入变量
B
B
B之后,变量
A
A
A的纯度的变化。信息增益的数学表达式如下:
G
a
i
n
(
A
,
B
)
=
E
n
t
r
o
p
y
(
A
)
−
E
n
t
r
o
p
y
B
(
A
)
Gain\left(A,B\right)=Entropy(A)-Entropy_B(A)
Gain(A,B)=Entropy(A)−EntropyB(A)
G
a
i
n
(
A
,
B
)
Gain\left(A,B\right)
Gain(A,B)即为信息增益,当加入的变量
B
B
B对变量
A
A
A的影响越大时,信息增益的变化也就越大。
案例计算
为了能够牢记,深入理解信息熵、条件熵、信息增益的定义,选取最为经典的西瓜数据集,手动计算这几个指标。
index | 色泽 | 根蒂 | 声音 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
在西瓜数据集中,目标变量是“好瓜”,首先计算“好瓜”的信息熵,目标变量“好瓜”的观测数量为17个,拥有两个水平个数,其中
P
是
=
8
17
P_是=\frac{8}{17}
P是=178,
P
否
=
9
17
P_否=\frac{9}{17}
P否=179,这里的
l
o
g
log
log底数取2,计算过程如下:
E
n
t
r
o
p
y
(
好
瓜
)
=
−
(
P
是
l
o
g
2
P
是
+
P
否
l
o
g
2
P
否
)
=
−
(
8
17
l
o
g
2
8
17
+
9
17
l
o
g
2
9
17
)
=
0.998
Entropy(好瓜) =-\left(P_是log_2P_是+P_否log_2P_否\right)\\ =-\left(\frac{8}{17}log_2\frac{8}{17}+\frac{9}{17}log_2\frac{9}{17}\right) =0.998
Entropy(好瓜)=−(P是log2P是+P否log2P否)=−(178log2178+179log2179)=0.998
假设加入了“色泽”这个自变量,接下来计算“好瓜”的条件熵,“色泽”有水平个数有三个,计算过程如下:
E
n
t
r
o
p
y
B
(
A
)
=
6
17
×
−
(
3
6
l
o
g
2
3
6
+
(
3
6
l
o
g
2
3
6
)
)
+
6
17
×
−
(
4
6
l
o
g
2
4
6
+
2
6
l
o
g
2
2
6
)
+
5
17
×
−
(
1
5
l
o
g
2
1
5
+
4
5
l
o
g
2
4
5
)
=
0.889
Entropy_B(A)=\frac{6}{17}\times-\left(\frac{3}{6}log_2\frac{3}{6}+\left(\frac{3}{6}log_2\frac{3}{6}\right)\right)\\+\frac{6}{17}\times-\left(\frac{4}{6}log_2\frac{4}{6}+\frac{2}{6}log_2\frac{2}{6}\right)\\+\frac{5}{17}\times-\left(\frac{1}{5}log_2\frac{1}{5}+\frac{4}{5}log_2\frac{4}{5}\right)\\=0.889
EntropyB(A)=176×−(63log263+(63log263))+176×−(64log264+62log262)+175×−(51log251+54log254)=0.889
则对于变量“好瓜”而言,“色泽”的信息增益为:
G
a
i
n
(
好
瓜
,
色
泽
)
=
E
n
t
r
o
p
y
(
好
瓜
)
−
E
n
t
r
o
p
y
B
(
A
)
=
0.109
Gain(好瓜,色泽)=Entropy(好瓜)-Entropy_B(A)=0.109
Gain(好瓜,色泽)=Entropy(好瓜)−EntropyB(A)=0.109
同样的,根据以上相应的式子,分别计算其他几个变量的信息增益,如下:
G
a
i
n
(
好
瓜
,
根
蒂
)
=
0.143
G
a
i
n
(
好
瓜
,
声
音
)
=
0.141
G
a
i
n
(
好
瓜
,
纹
理
)
=
0.381
G
a
i
n
(
好
瓜
,
脐
部
)
=
0.289
G
a
i
n
(
好
瓜
,
触
感
)
=
0.006
Gain(好瓜,根蒂)=0.143\\ Gain(好瓜,声音)=0.141\\ Gain(好瓜,纹理)=0.381\\ Gain(好瓜,脐部)=0.289\\ Gain(好瓜,触感)=0.006\\
Gain(好瓜,根蒂)=0.143Gain(好瓜,声音)=0.141Gain(好瓜,纹理)=0.381Gain(好瓜,脐部)=0.289Gain(好瓜,触感)=0.006
可知,“纹理”对目标变量的信息增益是最大的,其次是脐部。即纹理是最重要的变量。
代码
再次,附上信息熵,条件熵,信息增益的Python求解代码,前面这两个代码,是我找了一些别的博客的代码参考,然后前后花了四个钟左右把存在的BUG给改过来了。不过我的代码还不是最好的,毕竟我不是纯IT,望谅解。
信息熵代码
#计算信息熵
def Entropy_y(y):
y=list(y)
x_value = set(y)
ent1=0.0
for i in x_value:
ent1=y.count(i)/len(y)*(-1)*np.log2(y.count(i)/len(y))+ent1
return ent1
条件熵
#计算条件熵
import numpy as np
def Entropy_x_y(y,x):
x_value = set(x)
ent=0.0
k=1
x=np.array(x)
y=np.array(y)
for i in x_value:
if k>=2:
x=np.array(x)
y=np.array(y)
sub_y=(y[x==i])
temp_ent=Entropy_y(list(sub_y))
x=list(x)
y=list(y)
ent=(temp_ent*(x.count(i))/(len(y)))+ent
k=k+1
return ent
信息增益代码
#计算信息增益
def Gain_ent(x,y):
ent_y = Entropy_y(y)
ent_x_y = Entropy_x_y(y,x)
ent_gain = ent_y - ent_x_y
return ent_gain
节点划分
根据各个变量的信息增益计算结果,“纹理”的信息增益是最大的,因此“纹理”作为首要变量,建立起决策树的第一层,而且“纹理”有三个水平,分别为“模糊”、“清晰”、“稍糊”。建树的第一层如下图
在第一层决策树的基础之上,再重新计算各个变量的信息增益,进而建立第二层决策树
例如,当纹理为“稍糊”的时候。其余变量的信息增益为:
G
a
i
n
(
好
瓜
,
根
蒂
)
=
0.073
G
a
i
n
(
好
瓜
,
声
音
)
=
0.322
G
a
i
n
(
好
瓜
,
脐
部
)
=
0.171
G
a
i
n
(
好
瓜
,
触
感
)
=
0.722
G
a
i
n
(
好
瓜
,
色
泽
)
=
0.322
Gain(好瓜,根蒂)=0.073\\ Gain(好瓜,声音)=0.322\\ Gain(好瓜,脐部)=0.171\\ Gain(好瓜,触感)=0.722\\ Gain(好瓜,色泽)=0.322\\
Gain(好瓜,根蒂)=0.073Gain(好瓜,声音)=0.322Gain(好瓜,脐部)=0.171Gain(好瓜,触感)=0.722Gain(好瓜,色泽)=0.322
则触感是最重要的变量,即作为纹理为“稍糊”的时候的第二层决策树,以此类推。