文本分类入门(五)——关于开方检验和信息增益特征选择算法
1.开方检验
前文提到过,除了分类算法以外,为分类文本作处理的特征提取算法也对最终效果有巨大影响,而特征提取算法又分为特征选择和特征抽取两大类,其中特征选择算法有互信息,文档频率,信息增益,开方检验等等十数种,这次先介绍特征选择算法中效果比较好的开方检验方法。
大家应该还记得,开方检验其实是数理统计中一种常用的检验两个变量独立性的方法。
开方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
那么用什么来衡量偏差程度呢?假设理论值为
E
E
E(这也是数学期望的符号哦),实际值为
x
x
x,如果仅仅使用所有样本的观察值与理论值的差值
x
−
E
x-E
x−E之和
∑
i
=
1
m
(
x
i
−
E
)
\sum_{i=1}^{m}(x_{i}-E)
i=1∑m(xi−E)
来衡量,单个的观察值还好说,当有多个观察值
,
,
x
1
,
x
2
,
x
3
,,x_{1},x_{2},x_{3}
,,x1,x2,x3的时候,很可能
,
,
x
1
−
E
,
x
2
−
E
,
x
3
−
E
,,x_{1}-E,x_{2}-E,x_{3}-E
,,x1−E,x2−E,x3−E的值有正有负,因而互相抵消,使得最终的结果看上好像偏差为0,但实际上每个都有偏差,而且都还不小!此时很直接的想法便是使用方差代替均值,这样就解决了正负抵消的问题,即使用
∑
i
=
1
m
(
x
i
−
E
)
2
\sum_{i=1}^{m}(x_{i}-E)^{2}
i=1∑m(xi−E)2
这时又引来了新的问题,对于500的均值来说,相差5其实是很小的(相差1%),而对20的均值来说,5相当于25%的差异,这是使用方差也无法体现的。因此应该考虑改进上面的式子,让均值的大小不影响我们对差异程度的判断
∑
i
=
1
m
(
x
i
−
E
)
2
E
式
(
1
)
\sum_{i=1}^{m}\frac{(x_{i}-E)^{2}}{E} 式(1)
i=1∑mE(xi−E)2式(1)
上面这个式子已经相当好了。实际上这个式子就是开方检验使用的差值衡量公式。当提供了数个样本的观察值
x
1
,
x
2
,
…
…
x
i
,
…
…
x
n
x_{1},x_{2},……x_{i} ,……x_{n}
x1,x2,……xi,……xn之后,代入到式(1)中就可以求得开方值,用这个值与事先设定的阈值比较,如果大于阈值(即偏差很大),就认为原假设不成立,反之则认为原假设成立。
在文本分类问题的特征选择阶段,我们主要关心一个词t(一个随机变量)与一个类别c(另一个随机变量)之间是否相互独立?如果独立,就可以说词t对类别c完全没有表征作用,即我们根本无法根据t出现与否来判断一篇文档是否属于c这个分类。但与最普通的开方检验不同,我们不需要设定阈值,因为很难说词t和类别c关联到什么程度才算是有表征作用,我们只想借用这个方法来选出一些最最相关的即可。
此时我们仍然需要明白对特征选择来说原假设是什么,因为计算出的开方值越大,说明对原假设的偏离越大,我们越倾向于认为原假设的反面情况是正确的。我们能不能把原假设定为“词t与类别c相关“?原则上说当然可以,这也是一个健全的民主主义社会赋予每个公民的权利,但此时你会发现根本不知道此时的理论值该是多少!你会把自己绕进死胡同。所以我们一般都使用”词t与类别c不相关“来做原假设。选择的过程也变成了为每个词计算它与类别c的开方值,从大到小排个序(此时开方值越大越相关),取前k个就可以(k值可以根据自己的需要选,这也是一个健全的民主主义社会赋予每个公民的权利)。
好,原理有了,该来个例子说说到底怎么算了。
比如说现在有N篇文档,其中有M篇是关于体育的,我们想考察一个词“篮球”与类别“体育”之间的相关性(任谁都看得出来两者很相关,但很遗憾,我们是智慧生物,计算机不是,它一点也看不出来,想让它认识到这一点,只能让它算算看)。我们有四个观察值可以使用:
1.包含“篮球”且属于“体育”类别的文档数,命名为A
2.包含“篮球”但不属于“体育”类别的文档数,命名为B
3.不包含“篮球”但却属于“体育”类别的文档数,命名为C
4.既不包含“篮球”也不属于“体育”类别的文档数,命名为D
用下面的表格更清晰:
特征选择 | 1.属于“体育” | 2.不属于“体育” | 总计 |
---|---|---|---|
1.包含“篮球” | A | B | A+B |
2.不包含“篮球” | C | D | C+D |
总数 | A+C | B+D | N |
如果有些特点你没看出来,那我说一说,首先,A+B+C+D=N。其次,A+C的意思其实就是说“属于体育类的文章数量”,因此,它就等于M,同时,B+D就等于N-M。
好,那么理论值是什么呢?以包含“篮球”且属于“体育”类别的文档数为例。如果原假设是成立的,即“篮球”和体育类文章没什么关联性(如果假设有联系…),那么在所有的文章中,“篮球”这个词都应该是等概率出现,而不管文章是不是体育类的。这个概率具体是多少,我们并不知道,但他应该体现在观察结果中(就好比抛硬币的概率是二分之一,可以通过观察多次抛的结果来大致确定),因此我们可以说这个概率接近:
A
+
B
N
\frac{A+B}{N}
NA+B
(因为A+B是包含“篮球”的文章数,除以总文档数就是“篮球”出现的概率,当然,这里认为在一篇文章中出现即可,而不管出现了几次)而属于体育类的文章数为A+C,在这些个文档中,应该有
E
11
=
(
A
+
C
)
A
+
B
N
E_{11}=(A+C)\frac{A+B}{N}
E11=(A+C)NA+B
篇包含“篮球”这个词(数量乘以概率嘛)。即包含了"篮球"且属于体育类的文章数理论上应该为多少。
但实际有多少呢?当然是A啦。
此时对这种情况的差值就得出了(套用式(1)的公式),应该是
D
11
=
(
A
−
E
11
)
2
E
11
D_{11}=\frac{(A-E_{11})^{2}}{E_{11}}
D11=E11(A−E11)2
同样,我们还可以计算剩下三种情况的差值
,
,
,
D
12
,
D
21
,
D
22
,
,,,D_{12},D_{21},D_{22},
,,,D12,D21,D22,聪明的读者一定能自己算出来。有了所有观察值的差值,就可以计算“篮球”与“体育”类文章的开方值
x
2
(
篮
球
,
体
育
)
=
D
11
+
D
12
+
D
21
+
D
22
x^{2}(篮球,体育)=D_{11}+D_{12}+D_{21}+D_{22}
x2(篮球,体育)=D11+D12+D21+D22
把
,
,
,
,
D
11
,
D
12
,
D
21
,
D
22
,
,,,,D_{11},D_{12},D_{21},D_{22},
,,,,D11,D12,D21,D22,的值分别代入并化简,词t与类别c的开方值更一般的形式可以写成:
x
2
(
t
,
c
)
=
N
(
A
D
−
B
C
)
2
(
A
+
C
)
(
A
+
B
)
(
B
+
D
)
(
C
+
D
)
式
(
2
)
x^{2}(t,c)=\frac{N(AD-BC)^2}{(A+C)(A+B)(B+D)(C+D)}式(2)
x2(t,c)=(A+C)(A+B)(B+D)(C+D)N(AD−BC)2式(2)
接下来我们就可以计算其他词如“排球”,“产品”,“银行”等等与体育类别的开方值,然后根据大小来排序,选择我们需要的最大的数个词汇作为特征项就可以了。
实际上式(2)还可以进一步化简,注意如果给定了一个文档集合(例如我们的训练集)和一个类别,则N,M,N-M(即A+C和B+D)对同一类别文档中的所有词来说都是一样的,而我们只关心一堆词对某个类别的开方值的大小顺序,而并不关心具体的值,因此把它们从式(2)中去掉是完全可以的,故实际计算的时候我们都使用:
x
2
(
t
,
c
)
=
(
A
D
−
B
C
)
2
(
A
+
B
)
(
C
+
D
)
式
(
3
)
x^{2}(t,c)=\frac{(AD-BC)^2}{(A+B)(C+D)}式(3)
x2(t,c)=(A+B)(C+D)(AD−BC)2式(3)
针对英文纯文本的实验结果表明:作为特征选择方法时,开方检验和信息增益的效果最佳(相同的分类算法,使用不同的特征选择算法来得到比较结果);文档频率方法的性能同前两者大体相当,术语强度方法性能一般;互信息方法的性能最差(文献[17])。
但开方检验也并非就十全十美了。回头想想A和B的值是怎么得出来的,它统计文档中是否出现词t,却不管t在该文档中出现了几次,这会使得他对低频词有所偏袒(因为它夸大了低频词的作用)。甚至会出现有些情况,一个词在一类文章的每篇文档中都只出现了一次,其开方值却大过了在该类文章99%的文档中出现了10次的词,其实后面的词才是更具代表性的,但只因为它出现的文档数比前面的词少了“1”,特征选择的时候就可能筛掉后面的词而保留了前者。这就是开方检验著名的“低频词缺陷“。因此开方检验也经常同其他因素如词频综合考虑来扬长避短。
附:给精通统计学的同学多说几句,式(1)实际上是对连续型的随机变量的差值计算公式,而我们这里统计的“文档数量“显然是离散的数值(全是整数),因此真正在统计学中计算的时候,是有修正过程的,但这种修正仍然是只影响具体的开方值,而不影响大小的顺序,故文本分类中不做这种修正。
2.信息增益
前文提到过,除了开方检验(CHI)以外,信息增益(IG,Information Gain)也是很有效的特征选择方法。但凡是特征选择,总是在将特征的重要程度量化之后再进行选择,而如何量化特征的重要性,就成了各种方法间最大的不同。开方检验中使用特征与类别间的关联性来进行这个量化,关联性越强,特征得分越高,该特征越应该被保留。
在信息增益中,重要性的衡量标准就是看特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要。
才因此先回忆一下信息论中有关信息量(就是“熵”)的定义。说有这么一个变量X,它可能的取值有
n
n
n多种,分别是
x
1
,
x
2
,
…
…
,
x
n
,
x_{1},x_{2},……,x_{n},
x1,x2,……,xn,每一种取到的概率分别是
P
1
,
P
2
,
…
…
,
P
n
,
P_{1},P_{2},……,P_{n},
P1,P2,……,Pn,那么X的熵就定义为:
H
(
x
)
=
−
∑
i
=
1
n
P
i
⋅
l
o
g
2
P
i
H(x)=-\sum_{i=1}^{n}P_{i}\cdot log_{2}P_{i}
H(x)=−i=1∑nPi⋅log2Pi
意思就是一个变量可能的变化越多(反而跟变量具体的取值没有任何关系,只和值的种类多少以及发生概率有关),它携带的信息量就越大。
对分类系统来说,类别C是变量,它可能的取值是
C
1
,
C
2
,
…
…
,
C
n
,
C_{1},C_{2},……,C_{n},
C1,C2,……,Cn,而每一个类别出现的概率是
P
(
C
1
)
,
P
(
C
2
)
,
…
…
,
P
(
C
n
)
,
P(C_{1}),P(C_{2}),……,P(C_{n}),
P(C1),P(C2),……,P(Cn),因此n就是类别的总数。此时分类系统的熵就可以表示为:
H
(
C
)
=
∑
i
=
1
n
P
(
C
i
)
⋅
l
o
g
2
P
(
C
i
)
H(C)=\sum_{i=1}^{n}P(C_{i})\cdot log_{2}P(C_{i})
H(C)=i=1∑nP(Ci)⋅log2P(Ci)
有同学说不好理解呀,这样想就好了,文本分类系统的作用就是输出一个表示文本属于哪个类别的值,而这个值可能是
C
1
,
C
2
,
…
…
,
C
n
,
C_{1},C_{2},……,C_{n},
C1,C2,……,Cn,因此这个值所携带的信息量就是上式中的这么多。
信息增益是针对一个一个的特征而言的,就是看一个特征 t t t,系统有它和没它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量,即增益。系统含有特征t的时候信息量很好计算,就是刚才的式子,它表示的是包含所有特征时系统的信息量。
问题是当系统不包含t时,信息量如何计算?我们换个角度想问题,把系统要做的事情想象成这样:说教室里有很多座位,学生们每次上课进来的时候可以随便坐,因而变化是很大的(无数种可能的座次情况);但是现在有一个座位,看黑板很清楚,听老师讲也很清楚,于是校长的小舅子的姐姐的女儿托关系(真辗转啊),把这个座位定下来了,每次只能给她坐,别人不行,此时情况怎样?对于座次的可能情况来说,我们很容易看出以下两种情况是等价的:(1)教室里没有这个座位;(2)教室里虽然有这个座位,但其他人不能坐(因为反正它也不能参与到变化中来,它是不变的)。
对应到我们的系统中,就是下面的等价:(1)系统不包含特征t;(2)系统虽然包含特征t,但是t已经固定了,不能变化。
我们计算分类系统不包含特征t的时候,就使用情况(2)来代替,就是计算当一个特征t不能变化时,系统的信息量是多少。这个信息量其实也有专门的名称,就叫做“条件熵”,条件嘛,自然就是指“t已经固定“这个条件。
但是问题接踵而至,例如一个特征X,它可能的取值有n多种 ( x 1 , x 2 , … … , x n ) , (x_{1},x_{2},……,x_{n}), (x1,x2,……,xn),当计算条件熵而需要把它固定的时候,要把它固定在哪一个值上呢?答案是每一种可能都要固定一下,计算 n n n个值,然后取均值才是条件熵。而取均值也不是简单的加一加然后除以 n n n,而是要用每个值出现的概率来算平均(简单理解,就是一个值出现的可能性比较大,固定在它上面时算出来的信息量占的比重就要多一些)。
因此有这样两个条件熵的表达式:
H
(
C
∣
X
=
x
i
)
H(C|X=x_{i})
H(C∣X=xi)
这是指特征X被固定为值xi时的条件熵,
H
(
C
∣
X
)
H(C|X)
H(C∣X)
这是指特征X被固定时的条件熵,注意与上式在意义上的区别。从刚才计算均值的讨论可以看出来,第二个式子与第一个式子的关系就是:
H
(
C
∣
X
)
=
P
1
H
(
C
∣
X
=
x
1
)
+
P
2
H
(
C
∣
X
=
x
2
)
+
⋯
+
P
n
H
(
C
∣
X
=
x
n
)
=
∑
i
=
1
n
P
i
H
(
C
∣
X
=
x
i
)
H(C|X)=P_{1}H(C|X=x_{1})+P_{2}H(C|X=x_{2})+\cdots +P_{n}H(C|X=x_{n})=\sum_{i=1}^{n}P_{i}H(C|X=x_{i})
H(C∣X)=P1H(C∣X=x1)+P2H(C∣X=x2)+⋯+PnH(C∣X=xn)=i=1∑nPiH(C∣X=xi)
具体到我们文本分类系统中的特征t,t有几个可能的值呢?注意t是指一个固定的特征,比如他就是指关键词“经济”或者“体育”,当我们说特征“经济”可能的取值时,实际上只有两个,“经济”要么出现,要么不出现。一般的,
t
t
t的取值只有
t
t
t(代表t出现)和
t
ˉ
\bar{t}
tˉ(代表t不出现),注意系统包含
t
t
t但
t
t
t不出现与系统根本不包含
t
t
t可是两回事。
因此固定
t
t
t时系统的条件熵就有了,为了区别t出现时的符号与特征
t
t
t本身的符号,我们用T代表特征,而用
t
t
t代表
T
T
T出现,那么:
H
(
C
∣
T
)
=
P
(
t
)
H
(
C
∣
t
)
+
P
(
t
ˉ
)
H
(
C
∣
t
ˉ
)
H(C|T)=P(t)H(C|t)+P(\bar{t})H(C|\bar{t})
H(C∣T)=P(t)H(C∣t)+P(tˉ)H(C∣tˉ)
与刚才的式子对照一下,含义很清楚对吧,P(t)就是T出现的概率,
P
(
t
ˉ
)
P(\bar{t})
P(tˉ)就是
T
T
T不出现的概率。这个式子可以进一步展开,其中的
H
(
C
∣
t
)
=
−
∑
i
=
1
n
P
(
C
i
∣
t
)
⋅
l
o
g
2
P
(
C
i
∣
t
)
H(C|t)=-\sum_{i=1}^{n}P(C_{i}|t)\cdot log_{2}P(C_{i}|t)
H(C∣t)=−i=1∑nP(Ci∣t)⋅log2P(Ci∣t)
另一半就可以展开为:
H
(
C
∣
t
ˉ
)
=
−
∑
i
=
1
n
P
(
C
i
∣
t
ˉ
)
⋅
l
o
g
2
P
(
C
i
∣
t
ˉ
)
H(C|\bar{t})=-\sum_{i=1}^{n}P(C_{i}|\bar{t})\cdot log_{2}P(C_{i}|\bar{t})
H(C∣tˉ)=−i=1∑nP(Ci∣tˉ)⋅log2P(Ci∣tˉ)
因此特征T给系统带来的信息增益就可以写成系统原本的熵与固定特征T后的条件熵之差:
I
G
(
T
)
=
H
(
C
)
−
H
(
C
∣
T
)
IG(T)=H(C)-H(C|T)
IG(T)=H(C)−H(C∣T)
= − ∑ i = 1 n P ( C i ) ⋅ l o g 2 P ( C i ) + P ( t ) ∑ i = 1 n P ( C i ∣ t ) ⋅ l o g 2 P ( C i ∣ t ) + P ( t ˉ ) ∑ i = 1 n P ( C i ∣ t ˉ ) ⋅ l o g 2 P ( C i ∣ t ˉ ) =-\sum_{i=1}^{n}P(C_{i})\cdot log_{2}P(C_{i})+P(t)\sum_{i=1}^{n}P(C_{i}|t)\cdot log_{2}P(C_{i}|t)+P(\bar{t})\sum_{i=1}^{n}P(C_{i}|\bar{t})\cdot log_{2}P(C_{i}|\bar{t}) =−i=1∑nP(Ci)⋅log2P(Ci)+P(t)i=1∑nP(Ci∣t)⋅log2P(Ci∣t)+P(tˉ)i=1∑nP(Ci∣tˉ)⋅log2P(Ci∣tˉ)
公式中的东西看上去很多,其实也都很好计算。比如 P ( C i ) P(C_{i}) P(Ci),表示类别 C i C_{i} Ci出现的概率,其实只要用1除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。再比如 P ( t ) P(t) P(t),就是特征T出现的概率,只要用出现过T的文档数除以总文档数就可以了,再比如 P ( C i ∣ t ) P(C_{i}|t) P(Ci∣t)表示出现T的时候,类别 C i C_{i} Ci出现的概率,只要用出现了 T T T并且属于类别 C i C_{i} Ci的文档数除以出现了 T T T的文档数就可以了。
从以上讨论中可以看出,信息增益也是考虑了特征出现和不出现两种情况,与开方检验一样,是比较全面的,因而效果不错。但信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓“全局”的特征选择(指所有的类都使用相同的特征集合),而无法做“本地”的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。