前言:
上一篇提到了特征提取,或者叫做降維。在文本分類中,特征提取算法的優劣對於文本分類的結果具有非常大的影響。 所以選擇效果好的特征提取算法是文本分類前中很重要的步驟。於是這篇就對卡方檢驗做一個介紹。這是一個效果很好的特征提取方法。
之前對卡方檢驗做過介紹:卡方檢驗是通過對特征進行打分然后排序,選擇排名靠前的特征來表示文本。
目錄:
- 文本分類學習(一)開篇
- 文本分類學習(二)文本表示
- 文本分類學習(三)特征權重(TF/IDF)和特征提取
- 文本分類學習 (四) 特征選擇之卡方檢驗
一:卡方檢驗的介紹
1.接下來簡單介紹一下卡方檢驗:
(官方定義)
卡方檢驗是以χ2分布為基礎的一種常用假設檢驗方法,它的無效假設H0是:觀察頻數與期望頻數沒有差別。該檢驗的基本思想是:首先假設H0成立,基於此前提計算出χ2值,它表示觀察值與理論值之間的偏離程度。根據χ2分布及自由度可以確定在H0假設成立的情況下獲得當前統計量及更極端情況的概率P。如果當前統計量大於P值,說明觀察值與理論值偏離程度太大,應當拒絕無效假設,表示比較資料之間有顯著差異;否則就不能拒絕無效假設,尚不能認為樣本所代表的實際情況和理論假設有差別。(摘自智庫百科)
(通俗的來講)
卡方檢驗的思想是通過觀察值和理論值之間的偏差來判斷理論值的正確率是多少。如果正確率很大我們就認為理論值是正確的。所以我們一開始要設定一個理論值,這個理論值是我們根據自己的假設計算而來。
2.卡方檢驗的基本公式:
卡方檢驗的基本公式,也就是χ2的計算公式,也就是觀察值和理論值之間的偏差
先介紹下這個公式是如何得來的吧
其中A代表觀察頻數(就是觀察值),E代表期望頻數(就是理論值,我們一開始做的那個假設得到的值)
- 那么第一步,觀察值和理論值之間的偏差,就是二者的差。將多個觀察值和理論值的偏差求和
- 這樣確實可以表示偏差,但是多個觀察值和理論值,且差值有正有負,那么就會相互抵消,如果抵消為0,本來有偏差的,現在變成沒有偏差 了。所以第二步,加上平方之后再求和
- 這樣確實可以表示偏差,但是多個觀察值和理論值,且差值有正有負,那么就會相互抵消,如果抵消為0,本來有偏差的,現在變成沒有偏差 了。於是第三步,在平之后再除以理論值之后再求和,這樣不會因為理論值的大小而影響偏差的計算了
越是得到了最終χ2的計算公式。再回到這個式子:
A 為觀察值,E為理論值,k為觀察值的個數,最后一個式子實際上就是具體計算的方法了 n 為總的頻數,p為理論頻率,那么n*p自然就是理論頻數(理論值)
3.卡方分布:
可以看出當觀察值和理論值十分接近的時候,也就是我們做的假設是正確的時候,χ2的值就越趨近於0,也就是說我們計算的偏差越小,那么假設值就越可能是對的,那么偏差值越大,假設值就越不准確。那么到底多大才算不准確,有沒有個衡量的數值標准呢?答案是有:卡方分布。
於是我們再看到官方說的第一句話:卡方檢驗是以χ2分布為基礎的一種常用假設檢驗方法
χ2分布,就叫做卡方分布。那么卡方分布是個什么東西呢?官方定義:
若k 個隨機變量Z1、……、Zk 相互獨立,且數學期望為0、方差為 1(即服從標准正態分布),則隨機變量X
被稱為服從自由度為 k 的卡方分布,記作
官方的定義我們也不管了,公式也不管了。直接用Matlab 畫出卡方分布的圖來,我們通過直觀圖,來看懂卡方分布:
我寫的Matlab的卡方分布圖的代碼:
x=0:0.01:50; y=chi2pdf(x,1); y1=chi2pdf(x,4); y2=chi2pdf(x,10); y3=chi2pdf(x,20); y4=chi2pdf(x,50); plot(x,y,'-r',x,y1,'-.b',x,y2,':k',x,y3,'--g',x,y4,'-m'); legend('Freedom 1','Freedom 4','Freedom 10','Freedom 20','Freedom 100'); axis([0,50,0,0.2]);
於是得到這樣的圖:
先看上圖中的Freedom 這里有5條線,分別對應Freedom=1, 4, 10, 20 , 100 。這個Freedom 就是自由度(我英語不好),俗稱:個式子中獨立變量的個數。(具體的后面再說到)。 就是卡方分布官方定義中的k,k個符合標准正太分布的隨機變量。先不管這個自由度是干嘛,也不管在實際應用中是怎么計算出來的。我們挑一條曲線Freedom = 1 來看:
x 橫坐標 其實就是我們前面利用卡方檢驗公式計算出來的偏差χ2 而y 縱坐標表示假設的正確的概率。可以看到當χ2 的值越小,假設正確的可能性無限大,值越大假設正確的可能性無限小,正好驗證了卡方檢驗的公式。(文章的最后會放上一個卡方分布的表格)。
現在我們回過頭看自由度,通過觀察圖可以發現,不同自由度的卡方分布可以說差別很多。當自由度為1時,卡方分布式一個傾斜的曲線,當自由度逐漸增大是,卡方分布逐步變的平緩,兩頭矮,中間高。對沒錯,隨着自由度越來越大,卡方分布會越來越接近正態分布(因為我們看到卡方分布的定義,卡方分布本來就是由k個標准正太分布的方差形成的分布)。這個時候疑問就來了,當自由度為1的時候,很好理解χ2 越小,概率越大,χ2 越大概率越小,這個好理解通過卡方檢驗的公式可以看出。當自由度越大的時候,怎么χ2 越大,對應的概率先是變大,然后再是變小呢?還有另一個問題,卡方檢驗的自由度又是怎么算的呢?前面說過,自由度其實就公式中獨立變量的個數,它可以表示變量的變化范圍。這里實在不想通過公式推導,卡方分布自由度是怎么得出,並且表示的是什么,太繁瑣,不易理解,更重要的是我根本不會。
二:實例,通過卡方檢驗進行特征選擇
1.四表格
帶着這兩個問題,我們到實際的例子中去查看。
突然想起來,這篇文章是在說卡方檢驗在文本分類的特征提取中的應用。所以例子不能跑題,我們看下面的四格圖表(百度四格圖表+卡方檢驗 你會發現有很多例子。如果把四格換成八格,就很少了。事實上特征提取我們用四格圖表就夠了。)
我這個例子和網上的都大同小異,也不能照搬別人,就自己造一點數據。
這是一個四格表,表示我在把文本一通分析之后發現 包含"洪秀全"這個詞且屬於中國近代史的有34個文本,而包含這個詞不屬於中國近代史的有6文本.........
通過這個四格表的提供信息,我們來檢驗詞"洪秀全"和中國近代史類的文本的關系。
我加入C1 C2 R1 R2 分別表示第1列的合計,第2列的合計,第1行的合計,第2行的合計。n表示總數。
第一步我們應該做啥?肯定是先做一個假設啊,我們假設"洪秀全"和中國近代史類的文本沒有任何關系(為什么不假設有關系呢?)
然后我們去確認觀察值,和理論值,確定好了之后不就可以算偏差了嘛!
那么觀察值是什么?很顯然,觀察值就是表格中的數字,表示實際我們觀察到的值。觀察值有幾個呢?很顯然是4個,因為是4格表啊。分別是:
34 (含有"洪秀全"屬於中國近代史); 6 (含有"洪秀全"不屬於中國近代史); 20 (不含有"洪秀全"屬於中國近代史);24(不含有"洪秀全"不屬於中國近代史)
那么理論值是什么呢?理論值也是4個,和觀察值一一對應。理論值怎么計算呢?當然是通過假設來計算。
我們假設"洪秀全"這個詞和中國近代史類的文本沒有任何關系,那么就表示有無"洪秀全"對它是不是中國近代史類的文本沒有影響。根據這個假設,我們來算第一個觀察值(含有"洪秀全"屬於中國近代史)對於的理論值。我們設為 E11,表示第一行第一列的理論值。
根據假設,我們可以先算出一個文本出現"洪秀全"的概率,然后用中國近代史的文本個數乘以這個概率就得到了理論值,很好理解的普通概率問題。(想一想,這一起是不是建立在我們的假設的基礎上。如果假設是二者不相關,那么理論值應該怎么算?你會發現根本不知道怎么算)
出現"洪秀全"的概率 = 包含"洪秀全"的文本 / 總文本 這很好理解。
於是我們可以得出第一個理論值E1 = E11 (第一個1表示第一個理論值,后來兩個1表示四格表中第1行第1列,顯然二者是等價的)
由次可以類推Epq 表示p行q列的理論值
這個時候我們就可以算出四格表中的理論值了,我們可以先把四個理論值算出來,然后帶入卡方檢驗的公式中去求偏差。當然也可以把Epq 帶入卡方檢驗的公式中然后直接根據公式來算
其實沒什么復雜的 ,會基礎的概率知識就一下能看明白了。於是我們就可以算出偏差了。
通過公式可以算出:
偏差值是14.2715,下一步呢?當然是去查卡方分布表。在查看卡方分布表的時候,我們發現還有個自由度的問題,那么問題來了,我們上面的四格表中自由度是多少呢?答案是(p-1)*(q-1)也就是(行數-1)*(列數-1) 。為什么是這么算的呢?這個暫時先不管了,根據查表我們得知自由度設為df,df為1的卡方分布如下:
可以看到v=1 ,χ2 = 3.84 是對應的P是0.05 ,再看看上面的函數圖,的確如此。為什么0.05要塗顏色呢?這是因為在卡方分布中概率小於0.05的叫做一個拒絕域,也就是說如果你算出來的P小於0.05,那么原假設就不成立。在卡方分布函數圖中表示就是一個小尾巴:
前面我們算出來的值是14.2715 很明顯已經大約3.84 也就是P < 0.05 也就是說原假設成立的概率小於5% 那么就意味着假設不成立,於是我們可以得出結論"洪秀全"和中國近代史是有關系的。
2.自由度的問題
這個四格表的案例就是通過卡方檢驗在文本分析中的應用。
再回到前面的兩個問題:
- 為什么自由度不一樣,卡方分布的區別就很大,自由度越大卡方分布越接近正太分布
- 自由度是怎么算的。
先回答第二個問題,上面說到過自由度=(行數-1)*(列數-1) 。自由度指的是計算某一統計量時,取值不受限制的變量個數。通常df=n-k。其中n為樣本數量,k為被限制的條件數或變量個數。
在這里行數是兩個變量,n=2 ,四格表中的限制條件數k=1,因為四個表中有一個限制條件:總數一定。所以自由度為2-1=1,
列數也同理。所以自由度df = (行數-1)*(列數-1)
3.八格表
再看第一個問題:看一個八格表:
我們假設"洪秀全","楊秀清","石達開","曾國藩"對於文本是否為中國近代史的影響程度是不一樣的。
自由度df = 3
這樣就可以理解為什么df越大就越符合正太分布。因為"洪秀全","楊秀清","石達開","曾國藩"這四個詞對文本是否為中國近代史影響都非常小,查看前面的公式就是(A-E)的偏差都很小,得出的χ2 越小,這個時候意味着這四個詞的影響程度是一樣的,也即通過卡方分布計算的假設成立概率是很小的,在上面的卡方分布函數圖中就可以看出屬於卡方分布左邊的小尾巴。同理當這個四個詞的影響都很大的時候,假設成立的概率也是很小,所以屬於卡方分布的右邊小尾巴。
這樣通過例子就好理解一點了。
三,利用卡方檢驗用來特征選擇
說到這里,我們再回頭看下卡方檢驗在特征選擇中的應用。通篇大部分在說卡方檢驗,而實際應用到特征選擇中的時候,我們不需要知道自由度,不要知道卡方分布,我們只需要根據算出來的χ2 進行排序就好了,越大我們就越喜歡!挑選最大的一堆,於是就完成了利用卡方檢驗來進行特征提取。
一般在四格表中如果第一行,第一列的值表示為A,第二行第二列的值表示為B,第三行第三列的值表示為C,第四行第四列的值表示為D
在四格表中的卡方檢驗公式可以變換為:
上面也說了,對於文本分類我們只關心排序,不要求算出具體的值,對於每個詞,n是不變的,(A+C)也就是屬於中國近代史的文本,是不變的,(B+D)也是不變的。所以可以化簡:
然而我們發現在四格表中,我們只關心了出現"洪秀全"的文本,而沒有提及"洪秀全"出現了幾次,也就是忽略了詞頻。這是卡方檢驗的低詞頻性的缺點,所以實際應用的時候還需要結合詞頻的因素,考慮進去。
四,結語
本來博客的題目叫做“特征選擇之卡方檢驗”,我現在想改名字叫做“卡方檢驗之特征選擇”。
下一篇就要開始實戰了,利用JIEba分詞,對訓練集進行分析再特征選擇,最后構造出一個非常合適的詞向量。