卡方检验概述
卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
卡方检验过程
假设理论期望值为
E
E
, 实际值为, 那么卡方检验的差值衡量公式:
∑ni=1(xi−E)2/E
∑
i
=
1
n
(
x
i
−
E
)
2
/
E
当提供了观察值
x1,x2,x3,...,xn
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
之后,代入到上式就可以求得卡方值。用这个值于事先设定的阈值进行比较,如果大于阈值,就认为原假设不成立,反之认为原假设成立
卡方检验在文本分类中的应用
卡方检验在文本分类领域的应用主要是特征选择。在一个文本分类系统中,特征数量可能达到上百万维,如何有效的进行特征选择是非常重要的。如果一个词
wi
w
i
与一个类别
Cj
C
j
相互独立,那么该词对
Cj
C
j
没有任何的表征作用。
我们一般用词
wi
w
i
与类别
Cj
C
j
不相关来做原假设,计算出的卡方值越大,说明对原假设的偏离越大。选择的过程也变成了为每个词计算它与类别Ci的卡方值,从大到小排个序(此时开方值越大越相关),取前k个就可以。
举个简单例子。比如说现在有N篇文档,其中有M篇是关于体育的,我们想考察一个词“篮球”与类别“体育”之间的相关性。原假设,“篮球”与“体育”类不相关
- 包含“篮球”且属于“体育”类别的文档数,命名为A
- 包含“篮球”但不属于“体育”类别的文档数,命名为B
- 不包含“篮球”但却属于“体育”类别的文档数,命名为C
- 既不包含“篮球”也不属于“体育”类别的文档数,命名为D
特征选择 | 属于”体育” | 不属于”体育” | 总计 |
---|---|---|---|
包含篮球 | A | B | A+B |
不包含篮球 | C | D | C+D |
总数 | A+C | B+D | N |
根据上述表格,根据原假设,分别计算A,B,C,D的理论值,并且计算理论期望值和实际值的变差。
A的理论值,即包含“篮球”且属于“体育”类别的理论文档数。根据原假设,即“篮球”和体育类文章没什么关联性,那么在所有的文章中,“篮球”这个词都应该是等概率出现, 概率接近
A+BN
A
+
B
N
, 而属于体育类的文章数为
A+C
A
+
C
,理论上在这些文档中,应该有
E11
E
11
个包含篮球的词, 而实际值是A(表中的都是实际值)。
E11=(A+C)A+BN
E
11
=
(
A
+
C
)
A
+
B
N
则差值可以计算出来了
D11=(A−E11)2E11
D
11
=
(
A
−
E
11
)
2
E
11
同样的,可以计算出B的理论值,包含“篮球”但不属于“体育”类别的文档数。将实际值和理论值求误差得到
D22
D
22
在得到
D11,D12,D21,D22
D
11
,
D
12
,
D
21
,
D
22
之后,可以计算词”篮球”和体育类别的开方值。
X2(篮球,体育)=D11+D12+D21+D22
X
2
(
篮
球
,
体
育
)
=
D
11
+
D
12
+
D
21
+
D
22
化简之后,得到
X2(篮球,体育)=N(AD−BC)2(A+C)(A+B)(B+D)(C+D)
X
2
(
篮
球
,
体
育
)
=
N
(
A
D
−
B
C
)
2
(
A
+
C
)
(
A
+
B
)
(
B
+
D
)
(
C
+
D
)
接下来,可以计算其他词与体育类别的开方值,根据大小来排序,选择前K个词作为特征项就可以了。
但是里面也有两种计算方式,一种是平均,一种是取max。取平均就是求出一个特征与每个类别的相关度,然后求所有的平均,作为该个特征的分类作用的衡量。
取max就是求出一个特征与每个类别的相关度,然后取出最大的一个值,就作为该个特征的分类作用的衡量。这样的好处也显而易见,总能把跟某个类别相关的词都取出来,确保每个类别都有一些特征词被保留下来。而平均的操作就会让这个作用弱化。
基于sklearn的实践
# coding:utf-8
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.datasets import load_iris
# get data
iris = load_iris()
data = iris.data
# shape of (150,4)
print(data.shape)
# feature selection use chi
model = SelectKBest(chi2, k=2)
feature = model.fit_transform(iris.data, iris.target)
# shape of (150,2)
print(feature.shape)
更多关于特征选择同用法可以参考:
http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html