本文主要是通过大白话,解释何为 信息,信息熵,信息增益,信息增益率,基尼系数
一、信息(information)
能消除不确定性的内容才能叫信息,而告诉你一个想都不用想的事实,那不叫信息。
比如数据分析师的工作经常是要用数据中发现信息,有一天上班你告诉老大从数据中发现我们的用户性别有男有女。。。(这不废话吗?)这不叫信息,但是如果你告诉老大女性用户的登录频次、加购率,浏览商品数量远高于男性,且年龄段在25岁~30岁的女性用户消费金额最多,15-20岁最少,那么我相信你老大会眼前一亮的!!!
如何衡量信息量?1948年有一位科学家香农从引入热力学中的熵概念,得到了信息量的数据公式:
y
=
−
l
o
g
2
P
k
y=-log_2P_k
y=−log2Pk
P
k
P_k
Pk代表信息发生的可能性,发生的可能性越大,概率越大,则信息越少,通常将这种可能性叫为不确定性,越有可能则越能确定则信息越少;比如中国与西班牙踢足球,中国获胜的信息量要远大于西班牙胜利(因为这可能性实在太低~~)
二、信息熵(information entropy)
信息熵是用来评估样本集合的纯度的一个参数,就是说,给出一个样本集合,这个样本集合中的样本可能属于好多不同的类别,也可能只属于一个类别,那么如果属于好多不同的类别的话,我们就说这个样本是不纯的,如果只属于一个类别,那么,我们就说这个样本是纯洁的。
而信息熵这个东西就是来计算一个样本集合中的数据是纯洁的还是不纯洁的。
信息熵是用来解决对信息的量化度量问题,衡量信息的多少,在信息的基础上,将有可能产生的信息定义为一个随机变量,那么变量的期望就是信息熵,比如上述例子中变量是赢家,有两个取值,中国或西班牙,两个都有自己的信息,再分别乘以概率再求和,就得到了这件事情的信息熵,公式如下:
基于频率的信息熵公式:
E
n
t
(
D
)
=
−
∑
k
=
1
∣
n
∣
∣
D
k
∣
D
l
o
g
2
∣
D
k
∣
D
Ent(D)=-\sum_{k=1}^{|n|}\frac{|D_k|}{D}log_2\frac{|D_k|}{D}
Ent(D)=−k=1∑∣n∣D∣Dk∣log2D∣Dk∣
基于概率的信息熵公式:
E
n
t
(
P
)
=
−
∑
k
=
1
∣
n
∣
P
k
l
o
g
2
P
k
Ent(P)=-\sum_{k=1}^{|n|}P_klog_2{P_k}
Ent(P)=−k=1∑∣n∣Pklog2Pk
假如只有2个取值,曲线长得特别像金拱门,当Pk=0或1时,信息量为0,当Pk=0.5时,信息熵最大,想想看一件事情有N多种结果,有各种结果都同样有可能的时候,是不是最难以料到结局?信息熵最大。
计算一个集合的纯度,就是把集合中每一个类别所占的比例乘上它的概率对数(信息),然后加到一起,然后经过计算之后,可以得到一个数据集的信息熵然后根据信息熵,可以判断这个数据集是否纯粹。信息熵越小的话,表明这个数据集越纯粹。信息熵的最小值为0,此时数据集D中只含有一个类别。
三、信息增益(Information Gain)
下面来介绍信息增益,所谓的信息增益,是要针对于具体的属性来讲的,比如说,数据集D中含有两个类别,分别是好人和坏人,那么,随便选择一个属性吧,比如说性别,性别这个属性中包含两个值,男人和女人,如果用男人和女人来划分数据集D的话,会得到两个集合,
D
m
a
n
D_{man}
Dman
D
w
o
m
a
n
D_{woman}
Dwoman划分后的两个集合中各自有 好人和坏人,所以可以分别计算划分后两个集合的纯度,
计算之后,把这两个集合的信息熵求加权平均,
D
m
a
n
D
E
n
t
(
D
m
a
n
)
+
D
w
o
m
a
n
D
E
n
t
(
D
w
o
m
a
n
)
\frac{D_{man}}{D}Ent(D_{man})+\frac{D_{woman}}{D}Ent(D_{woman})
DDmanEnt(Dman)+DDwomanEnt(Dwoman)
跟之前没有划分的时候的信息熵相比较,用后者减去前者,得到的就是属性-性别对样本集D划分所得到的信息增益。
G
a
i
n
(
D
,
A
)
=
E
n
t
(
D
)
−
D
m
a
n
D
E
n
t
(
D
m
a
n
)
−
D
w
o
m
a
n
D
E
n
t
(
D
w
o
m
a
n
)
Gain(D,A)=Ent(D)-\frac{D_{man}}{D}Ent(D_{man})-\frac{D_{woman}}{D}Ent(D_{woman})
Gain(D,A)=Ent(D)−DDmanEnt(Dman)−DDwomanEnt(Dwoman)
可以通俗理解为,信息增益就是纯度提升值,用属性对原数据集进行划分后,得到的信息熵的差就是纯度的提升值。
信息增益是决策树中ID3算法中用来进行特征选择的方法,就是用整体的信息熵减掉以按某一特征分裂后的条件熵,结果越大,说明这个特征越能消除不确定性,最极端的情况,按这个特征分裂后信息增益与信息熵一模一样,那说明这个特征就能获得唯一的结果了。
信息增益为:(Information Gain)
信息复杂度(不确定性)减少的程度。
G
a
i
n
(
D
,
A
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
=
E
n
t
(
D
)
−
H
(
D
∣
A
)
Gain(D,A)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)=Ent(D)-H(D|A)
Gain(D,A)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)=Ent(D)−H(D∣A)
先解释一下上式中的参数,D是数据集,A是选择的属性,A中一共有V个取值,用这个V取值去划分数据集D,分别得到数据集到
D
1
D_1
D1~
D
v
D_v
Dv,分别求这V个数据集的信息熵,并将其求加权平均。两者的差得到的就是信息增益。那么这个信息增益有什么用呢?有用,可以根据信息增益值的大小来判断是否要用这个属性A去划分数据集D,如果得到的信息增益比较大,那么就说明这个属性是用来划分数据集D比较好的属性,否则则认为该属性不适合用来划分数据集D。这样有助于去构建决策树。
著名的算法ID3就是采用信息增益来作为判断是否用该属性划分数据集的标准。
这里补充一个概念:
条件熵(conditional entropy)
条件熵是另一个变量Y熵对X(条件)的期望,公式为:
H
(
X
∣
Y
)
=
−
∑
x
∈
X
,
y
∈
Y
P
(
x
∣
y
)
l
o
g
2
P
(
x
∣
y
)
H(X|Y)=-\sum_{x∈X,y∈Y}P(x|y)log_2{P(x|y)}
H(X∣Y)=−x∈X,y∈Y∑P(x∣y)log2P(x∣y)
然后在每一个小类里面,都计算一个小熵,然后每一个小熵乘以各个类别的概率,然后求和。
我们用另一个变量对原变量分类后,原变量的不确定性就会减小了,因为新增了Y的信息,可以感受一下。不确定程度减少了多少就是信息的增益。
H
(
D
∣
A
)
=
∑
k
=
1
∣
K
∣
∣
D
k
∣
∣
D
∣
H
(
D
i
)
=
−
∑
k
=
1
∣
K
∣
∣
D
k
∣
∣
D
∣
∑
i
=
1
∣
n
∣
∣
D
k
i
∣
∣
D
∣
l
o
g
2
∣
D
k
i
∣
∣
D
∣
H(D| A)=\sum_{k=1}^{|K|}\frac{|D_k|}{|D|}H(D_i)=-\sum_{k=1}^{|K|}\frac{|D_k|}{|D|}\sum_{i=1}^{|n|}\frac{|D_{ki}|}{|D|}log_2\frac{|D_{ki}|}{|D|}
H(D∣A)=k=1∑∣K∣∣D∣∣Dk∣H(Di)=−k=1∑∣K∣∣D∣∣Dk∣i=1∑∣n∣∣D∣∣Dki∣log2∣D∣∣Dki∣
联和信息熵
H
(
X
,
Y
)
=
−
∑
x
∈
X
,
y
∈
Y
P
(
x
,
y
)
l
o
g
2
P
(
x
,
y
)
H(X,Y)=-\sum_{x∈X,y∈Y}P(x,y)log_2{P(x,y)}
H(X,Y)=−x∈X,y∈Y∑P(x,y)log2P(x,y)
H
(
X
,
Y
)
=
H
(
X
∣
Y
)
+
H
(
Y
)
H(X,Y)=H(X|Y)+H(Y)
H(X,Y)=H(X∣Y)+H(Y)
互信息(Mutual Information)
它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性, 也就是用来衡量两个信息的相关性大小的量。
两个事件的互信息定义为:
I
(
X
;
Y
)
=
H
(
X
)
+
H
(
Y
)
−
H
(
X
,
Y
)
I(X;Y)=H(X)+H(Y)-H(X,Y)
I(X;Y)=H(X)+H(Y)−H(X,Y),
I ( X ; Y ) = − ∑ x ∈ X , y ∈ Y P ( x , y ) l o g 2 P ( x , y ) P ( x ) ∗ P ( y ) I(X;Y)=-\sum_{x∈X,y∈Y}P(x,y)log_2\frac{P(x,y)}{P(x)*P(y)} I(X;Y)=−x∈X,y∈Y∑P(x,y)log2P(x)∗P(y)P(x,y)
四、信息增益率(Information Gain Ratio)
为什么要提出信息增益率这种评判划分属性的方法?信息增益不是就很好吗?其实不然,用信息增益作为评判划分属性的方法其实是有一定的缺陷的,书上说,信息增益准则对那些属性的取值比较多的属性有所偏好,也就是说,采用信息增益作为判定方法,会倾向于去选择属性取值比较多的属性。那么,选择取值多的属性为什么就不好了呢?举个比较极端的例子,如果将身份证号作为一个属性,那么,其实每个人的身份证号都是不相同的,也就是说,有多少个人,就有多少种取值,它的取值很多吧,让我们继续看,如果用身份证号这个属性去划分原数据集D,那么,原数据集D中有多少个样本,就会被划分为多少个子集,每个子集只有一个人,这种极端情况下,因为一个人只可能属于一种类别,好人,或者坏人,那么此时每个子集的信息熵就是0了,就是说此时每个子集都特别纯。这样的话,会导致信息增益公式的第二项
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
v=1∑V∣D∣∣Dv∣Ent(Dv)
整体为0,这样导致的结果是,信息增益计算出来的特别大,然后决策树会用身份证号这个属性来划分原数据集D,其实这种划分毫无意义。因此,为了改变这种不良偏好带来的不利影响,提出了采用信息增益率作为评判划分属性的方法。
公式如下:
G
a
i
n
r
a
t
i
o
(
D
,
A
)
=
G
a
i
n
(
D
,
A
)
I
V
(
A
)
Gain_{ratio}(D,A)=\frac{Gain(D,A)}{IV(A)}
Gainratio(D,A)=IV(A)Gain(D,A)
I
V
(
A
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
IV(A)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2{\frac{|D^v|}{|D|}}
IV(A)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
IV(A)被称为是的“固有值”,这个IV(A)的公式是不是很熟悉啊,简直和信息熵的计算公式一毛一样,就是看属性A的纯度,如果A只含有少量的取值的话,那么A的纯度就比较高,否则的话,A的取值越多,A的纯度越低,IV(A)的值也就越大,因此,最后得到的信息增益率就越低。
采用信息增益率可以解决ID3算法中存在的问题(ID3会对那些属性的取值比较多的属性有所偏好,如西瓜的颜色有10种),因此将采用信息增益率作为判定划分属性好坏的方法称为C4.5。
需要注意的是,增益率准则对属性取值较少的时候会有偏好,为了解决这个问题,C4.5并不是直接选择增益率最大的属性作为划分属性,而是之前先通过一遍筛选,先把信息增益低于平均水平的属性剔除掉,之后从剩下的属性中选择信息增益率最高的,这样的话,相当于两方面都得到了兼顾。 (结合信息增益与信息增益率使用)
信息增益率是在信息增益的基础上,增加了一个关于选取的特征包含的类别的惩罚项,这主要是考虑到如果纯看信息增益,会导致包含类别越多的特征的信息增益越大,极端一点,有多少个样本,这个特征就有多少个类别,那么就会导致决策树非常浅。公式为:
S
=
−
∑
i
=
1
∣
n
∣
∣
D
i
∣
∣
D
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
S=-\sum_{i=1}^{|n|}\frac{|D_{i}|}{|D|}log_2\frac{|D_{i}|}{|D|}
S=−i=1∑∣n∣∣D∣∣Di∣log2∣D∣∣Di∣
五、基尼系数
基尼指数( CART算法 —分类树)
定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。
注意: Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。
即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率
书中公式:
基尼系数也是一种衡量信息不确定性的方法,与信息熵计算出来的结果差距很小,基本可以忽略,但是基尼系数要计算快得多,因为没有对数,公式为:
G
i
n
i
(
D
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
i
=
1
N
(
∣
D
i
∣
∣
D
∣
)
2
Gini(D)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{i=1}^{N}{(\frac{|D_{i}|}{|D|})^2}
Gini(D)=k=1∑Kpk(1−pk)=1−i=1∑N(∣D∣∣Di∣)2
与信息熵一样,当类别概率趋于平均时,基尼系数越大
六、代码
当按特征A分裂时,基尼系数的计算如下:
G
i
n
i
(
D
∣
A
)
=
1
−
∑
i
=
1
N
∣
D
i
∣
∣
D
∣
G
i
n
i
(
D
i
)
Gini(D|A)=1-\sum_{i=1}^{N}{\frac{|D_{i}|}{|D|}Gini(D_i)}
Gini(D∣A)=1−i=1∑N∣D∣∣Di∣Gini(Di)
这是二分类时的基尼系数图像,与信息熵形状非常接近,从数据角度看,将信息熵在Pk=1处进行泰勒一阶展开,可以得到 log2Pk≈1-Pk
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
# 生成概率的范围
p = np.linspace(0.01, 0.99, 100)
# 计算基尼系数值。
def gini(p):
return 1 - p ** 2 - (1 - p) ** 2
# 计算信息熵。
def entropy(p):
return - p * np.log2(p) - (1 - p) * np.log2(1 - p)
# 计算错误率
def error(p):
return 1 - np.max([p, 1 - p], axis=0)
x = np.linspace(0.01, 0.99, 200)
# 计算信息熵
en = entropy(x)
# 将信息熵进行缩放。因为信息熵的取值范围为[0, 1],而基尼系数与错误率的取值范围为[0, 0.5],为了能够统一区间,
# 所以进行缩放,以便于可视化观察效果。
en2 = en * 0.5
# 计算错误率。
err = error(x)
# 计算基尼系数
g = gini(x)
fig = plt.figure()
for i, lab, ls, c, in zip([en, en2, g, err], ["信息熵", "信息熵(缩放)", "基尼系数", "错误率"],
["-", ":", "--", "-."], ["r", "g", "b", "y"]):
# 分别绘制信息熵,基尼系数与错误率的曲线,随着概率的变化而发生改变。
plt.plot(x, i, label=lab, linestyle=ls, lw=2, color=c)
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 1.15),
ncol=4, fancybox=True, shadow=False)
plt.axhline(y=0.5, linewidth=1, color='k', linestyle="--")
plt.axhline(y=1.0, linewidth=1, color='k', linestyle="--")
plt.ylim([0, 1.1])
plt.xlabel("p(i=1)")
plt.ylabel("纯度系数")
plt.show()
七、总结
应用:
(1)去计算一个变量的不确定性,可以考虑信息熵;在研究显著性时,可以用信息熵去计算一个区域的信息量的大小,近而来判断其为显著性区域;
(2)计算两个变量之间的相关性,可以考虑条件熵;
八、参考链接
[1] https://blog.csdn.net/qintian888/article/details/90054519
[2]https://www.cnblogs.com/muzixi/p/6566803.html