决策树算法属性筛选度量标准
在 信息论中, 熵(entropy)是接收的每条消息中包含的信息的平均量,又被称为 信息熵、 信源熵、 平均自信息量。这里,“消息” 代表来自分布或数据流中的事件、样本或特征。熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在 信息论里面,熵是对不确定性的测量。在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。
信息熵
1948年,香农(Shannon)引入热力学中的熵概念来衡量信息量。熵是各种可能性的熵以概率为权重进行加和,每个可能性可以用
log
1
p
=
−
log
p
\log \frac{1}{p} = - \log p
logp1=−logp 来表示。对于信息
x
x
x,其所含的信息量为
I
(
x
)
=
log
1
p
(
x
)
=
−
log
p
(
x
)
\mathrm{I}(x) = \log \frac{1}{p(x)} = -\log p(x)
I(x)=logp(x)1=−logp(x)
其中,
p
(
x
)
p(x)
p(x) 为信息
x
x
x 发生的概率。
信息熵是信息量的数学期望,是信源发出信息前的先验不确定性,也称先验熵。对于随机变量
X
X
X,
x
1
,
x
2
,
⋯
,
x
n
x_1,x_2,\cdots,x_n
x1,x2,⋯,xn 为来自总体的简单样本,其概率密度分布为
P
(
X
=
x
i
)
=
p
i
\mathrm{P}(X = x_i) = p_i
P(X=xi)=pi
满足
∑
i
=
1
n
p
i
=
1
\sum_{i=1}^n p_i = 1
i=1∑npi=1
则
X
X
X 的熵定义为
H
(
X
)
=
I
E
(
x
1
,
x
2
,
⋯
,
x
n
)
=
∑
i
=
1
n
p
i
I
(
x
i
)
=
−
∑
i
=
1
n
p
i
log
p
i
\mathrm{H}(X) = \mathrm{I}_E(x_1,x_2,\cdots,x_n) = \sum_{i=1}^n p_i I(x_i) = -\sum_{i=1}^np_i\log p_i
H(X)=IE(x1,x2,⋯,xn)=i=1∑npiI(xi)=−i=1∑npilogpi
设存在信源
x
1
,
x
2
x_1,x_2
x1,x2,下图为信息熵
H
\mathrm{H}
H 随信源
x
1
x_1
x1 的发生概率
P
(
x
1
)
P(x_1)
P(x1) 的变化图,当
P
(
x
1
)
=
1
P(x_1) = 1
P(x1)=1 或
P
(
x
2
)
=
0
P(x_2) = 0
P(x2)=0 时,则信息熵
H
=
0
\mathrm{H} = 0
H=0 表示没有发送的不确定性。而当
P
(
x
1
)
=
0.5
P(x_1) = 0.5
P(x1)=0.5 时,熵达到最大,不确定性最大。
举例来说,如果一个分类系统中,类别的标识是
c
c
c,取值情况是
c
1
,
c
2
,
⋯
,
c
n
c_1 , c_2 ,\cdots,c_n
c1,c2,⋯,cn,
n
n
n 为类别的总数。那么该分类系统的熵为:
H
(
c
)
=
−
∑
i
=
1
n
p
(
c
i
)
log
p
(
c
i
)
\mathrm{H}(c) = -\sum_{i=1}^np(c_i)\log p(c_i)
H(c)=−i=1∑np(ci)logp(ci)
特别地,如果是个二分类系统,那么此系统的熵为:
H
(
c
)
=
−
p
(
c
0
)
log
2
p
(
c
0
)
−
p
(
c
1
)
log
p
(
c
1
)
\mathrm{H}(c) = -p(c_0)\log_2p(c_0) - p(c_1) \log p(c_1)
H(c)=−p(c0)log2p(c0)−p(c1)logp(c1)
其中
p
(
c
0
)
,
p
(
c
1
)
p(c_0),p(c_1)
p(c0),p(c1) 分别为两类样本出现的概率。
信息增益
决策树算法 ID3 的生成使用信息增益。信息增益是基于信息论中信息熵与自信息理论,被定义为
I
G
(
T
,
a
)
⏞
Information Gain
=
H
(
T
)
⏞
Entropy (parent)
−
H
(
T
∣
a
)
⏞
Weighted Sum of Entropy (Children)
=
−
∑
i
=
1
J
p
i
log
2
p
i
−
∑
a
p
(
a
)
∑
i
=
1
J
−
Pr
(
i
∣
a
)
log
2
Pr
(
i
∣
a
)
\begin{aligned} \overbrace {\mathrm{IG}(T,a)} ^{\text{Information Gain}} &=\overbrace {\mathrm {H} (T)} ^{\text{Entropy (parent)}}-\overbrace {\mathrm {H} (T|a)} ^{\text{Weighted Sum of Entropy (Children)}}\\ &=-\sum _{i=1}^{J}p_{i}\log _{2}{p_{i}}-\sum _{a}{p(a)\sum _{i=1}^{J}-\Pr(i|a)\log _{2}{\Pr(i|a)}} \end{aligned}
IG(T,a)
Information Gain=H(T)
Entropy (parent)−H(T∣a)
Weighted Sum of Entropy (Children)=−i=1∑Jpilog2pi−a∑p(a)i=1∑J−Pr(i∣a)log2Pr(i∣a)
来看一个 Wikipedia 中给出的例子:
例 数据集有4个属性:outlook (sunny, overcast, rainy), temperature (hot, mild, cool), humidity (high, normal), 和 windy (true, false), 目标值play(yes, no), 总共14个数据点。
Outlook Temperature Humidity Windy Play? sunny hot high false no sunny hot high true no overcast hot high false yes rainy mild high false yes rainy cool normal false yes rainy cool normal true no overcast cool normal true yes sunny mild high false no sunny cool normal false yes rainy mild normal false yes sunny mild normal true yes overcast mild high true yes overcast hot normal false yes rainy mild high true no 为建造决策树,需要比较4棵决策树的信息增益,每棵决策树用一种属性做划分。信息增益最高的划分作为第一次划分,并在每个子节点继续此过程,直至其信息增益为0。
若使用属性windy做划分时,产生2个子节点:windy值为真与为假。当前数据集,6个数据点的windy值为真,其中3个点的play值为真,3个点的play值为假;其余8个数据点的windy为假,其中6个点的play值为真,2个点的play值为假。
- windy=true的子节点的信息熵计算为:
I E ( [ 3 , 3 ] ) = − 3 6 log 2 3 6 − 3 6 log 2 3 6 = − 1 2 log 2 1 2 − 1 2 log 2 1 2 = 1 {\displaystyle \mathrm{I}_{E}([3,3])=-{\frac {3}{6}}\log _{2}^{}{\frac {3}{6}}-{\frac {3}{6}}\log _{2}^{}{\frac {3}{6}}=-{\frac {1}{2}}\log _{2}^{}{\frac {1}{2}}-{\frac {1}{2}}\log _{2}^{}{\frac {1}{2}}=1} IE([3,3])=−63log263−63log263=−21log221−21log221=1
- windy=false的子节点的信息熵计算为:
I E ( [ 6 , 2 ] ) = − 6 8 log 2 6 8 − 2 8 log 2 2 8 = − 3 4 log 2 3 4 − 1 4 log 2 1 4 = 0.8112781 {\displaystyle \mathrm{I}_{E}([6,2])=-{\frac {6}{8}}\log _{2}^{}{\frac {6}{8}}-{\frac {2}{8}}\log _{2}^{}{\frac {2}{8}}=-{\frac {3}{4}}\log _{2}^{}{\frac {3}{4}}-{\frac {1}{4}}\log _{2}^{}{\frac {1}{4}}=0.8112781} IE([6,2])=−86log286−82log282=−43log243−41log241=0.8112781
这个划分(使用属性windy)的信息熵是两个子节点信息熵的加权和:
I
E
(
[
3
,
3
]
,
[
6
,
2
]
)
=
I
E
(
windy or not
)
=
6
14
⋅
1
+
8
14
⋅
0.8112781
=
0.8921589
{\displaystyle \mathrm{I}_{E}([3,3],[6,2])=\mathrm{I}_{E}({\text{windy or not}})={\frac {6}{14}}\cdot 1+{\frac {8}{14}}\cdot 0.8112781=0.8921589}
IE([3,3],[6,2])=IE(windy or not)=146⋅1+148⋅0.8112781=0.8921589
为计算使用属性windy的信息增益,必须先计算出最初(未划分)的数据集的信息熵,数据集的play有9个yes与5个no:
I
E
(
[
9
,
5
]
)
=
−
9
14
log
2
9
14
−
5
14
log
2
5
14
=
0.940286
{\displaystyle \mathrm{I}_{E}([9,5])=-{\frac {9}{14}}\log _{2}^{}{\frac {9}{14}}-{\frac {5}{14}}\log _{2}{\frac {5}{14}}=0.940286}
IE([9,5])=−149log2149−145log2145=0.940286
因此,使用属性windy的信息增益是:
I
G
(
windy
)
=
I
E
(
[
9
,
5
]
)
−
I
E
(
[
3
,
3
]
,
[
6
,
2
]
)
=
0.940286
−
0.8921589
=
0.0481271
{\displaystyle \mathrm{IG}({\text{windy}})=\mathrm{I}_{E}([9,5])-\mathrm{I}_{E}([3,3],[6,2])=0.940286-0.8921589=0.0481271}
IG(windy)=IE([9,5])−IE([3,3],[6,2])=0.940286−0.8921589=0.0481271
上面只是举如果按照 Windy 划分算得的信息增益, 那么如果按照Temperature 、 Humidity、 Outlook 划分呢?同理,经计算
I
G
(
o
u
t
l
o
o
k
)
=
0.246
I
G
(
T
e
m
p
e
r
a
t
u
r
e
)
=
0.029
I
G
(
H
u
m
i
d
i
t
y
)
=
0.151
\begin{aligned} \mathrm{IG(outlook)} = 0.246 \\ \mathrm{IG(Temperature)} = 0.029 \\ \mathrm{IG(Humidity)} = 0.151 \end{aligned}
IG(outlook)=0.246IG(Temperature)=0.029IG(Humidity)=0.151
选择最大的信息增益属性进行划分,然后再重复进行上述步骤,直至建好一棵树为止;在本例中第一个分支节点的属性是 Outlook。
注意:取值更多的属性容易使得数据更“纯”,其信息增益更大。决策树会首先挑选这个属性作为树的顶/结点;结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分极不合理。
信息增益率
由于信息增益偏好取值多的属性(极限趋近于均匀分布),所以决策树 C4.5 算法就采用增益率替代了 ID3 算法的信息增益。信息增益率定义为
I
G
r
=
I
G
(
T
,
a
)
H
(
a
)
\mathrm{IG_{r}}= \frac{\mathrm{IG}(T,a)}{\mathrm{H}(a)}
IGr=H(a)IG(T,a)
其中
a
a
a 为的固有属性,
I
G
(
T
,
a
)
\mathrm{IG}(T,a)
IG(T,a) 为按照属性
a
a
a 划分时的信息增益,
H
(
a
)
\mathrm{H}(a)
H(a) 为按照属性
a
a
a 划分的信息熵。
因此,按属性 Outlook 划分时,信息熵为
I
E
(
[
5
,
4
,
5
]
)
=
−
5
14
log
2
5
14
−
4
14
log
2
4
14
−
5
14
log
2
5
14
=
1.5774
{\displaystyle \mathrm{I}_{E}([5,4,5])=-{\frac {5}{14}}\log _{2}^{}{\frac {5}{14}}-{\frac {4}{14}}\log _{2}^{}{\frac {4}{14}}-{\frac {5}{14}}\log _{2}^{}{\frac {5}{14}}=1.5774}
IE([5,4,5])=−145log2145−144log2144−145log2145=1.5774
信息增益率为
I
G
r
(
o
u
t
l
o
o
k
)
=
0.246
1.5774
=
0.15595
\mathrm{IG_{r}}(\mathrm{outlook}) = \frac{0.246}{1.5774} = 0.15595
IGr(outlook)=1.57740.246=0.15595
基尼系数
但是无论是 ID3 还是 C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算(为了避免这个问题)。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART(Classification and Regression Tree)分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低(纯度越高),特征越好。
同样地,对于
n
n
n 类别
c
1
,
c
2
,
⋯
,
c
n
c_1,c_2,\cdots,c_n
c1,c2,⋯,cn 样本
T
T
T,第
i
i
i 个类别出现地概率为
p
k
p_k
pk,则基尼系数为
G
i
n
i
(
T
)
=
∑
i
=
1
n
p
i
(
1
−
p
i
)
=
1
−
∑
i
=
1
n
p
i
2
\mathrm{Gini}(T) = \sum_{i=1}^n p_i(1-p_i) = 1- \sum_{i=1}^n p_i^2
Gini(T)=i=1∑npi(1−pi)=1−i=1∑npi2
特别地,对于二分类问题,其基尼系数为
G
i
n
i
(
T
)
=
∑
i
=
1
2
p
i
(
1
−
p
i
)
=
1
−
∑
i
=
1
2
p
i
2
=
2
p
(
1
−
p
)
\mathrm{Gini}(T) = \sum_{i=1}^2 p_i(1-p_i) = 1- \sum_{i=1}^2 p_i^2 = 2p(1-p)
Gini(T)=i=1∑2pi(1−pi)=1−i=1∑2pi2=2p(1−p)
当一个节点中所有样本都是一个类时,基尼不纯度为零。
如果特征
a
a
a 有
k
k
k 种类别,则其基尼系数为
G
i
n
i
(
T
,
a
)
=
∑
i
=
1
k
∣
T
i
∣
∣
T
∣
G
i
n
i
(
T
i
)
\mathrm{Gini}(T,a) = \sum_{i=1}^k \frac{|T^i|}{|T|} \mathrm{Gini}(T^i)
Gini(T,a)=i=1∑k∣T∣∣Ti∣Gini(Ti)
在特征选取中,会优先选择基尼指数最小的属性作为优先划分属性。
a
∗
=
arg
min
a
∈
A
G
i
n
i
(
T
,
a
)
a^* = \mathop{\arg \min}_{a \in A} \mathrm{Gini}(T,a)
a∗=argmina∈AGini(T,a)
参考资料
[2] 信息增益_信息增益率_Gini, xiaoxiyouran
[3] 决策树学习, Wikipedia