樸素貝葉斯
樸素貝葉斯分類是基於貝葉斯概率的思想,假設屬性之間相互獨立,求得各特征的概率,最後取較大的一個作為預測結果(為了消弱罕見特征對最終結果的影響,通常會為概率加入權重,在比較時加入閾值)。樸素貝葉斯是較為簡單的一種分類器。
屬性獨立性:事件B的發生不對事件A的發生造成影響,這樣的兩個事件叫做相互獨立事件。然而其屬性獨立性假設在現實世界中多數不能成立,例如: “spring”的後面更有可能跟著“MVC”。
A和B中至少有一件事情發生:A∪B; A與B同時發生:A∩B(或AB);如果P(AB) =P(A)P(B),稱A,B 相互獨立。即:從數學上說,若N (N≥2) 個事件相互獨立,則必須滿足這樣的條件:其中任意k (N ≥ k ≥2)個事件同時發生的概率等於該k個事件單獨發生時的概率的乘積。
例:假設事件相互獨立,P(spring) = 0.2,P(MVC) = 0.8, 則 P(spring MVC) = 0.2 * 0.8=0.16。
實例應用
很多時候,無法將樸素貝葉斯求得的結果作用於實際,因為樸素的假設(屬性之間相互獨立)會使其得到錯誤的結果。
樸素貝葉斯假設各特征項是獨立的,整體概率=各特征項概率的乘積,計算出特征集在每個分類的概率後進行比較,最大值即預測結果。
根據概率公式,在實際應用中是:
下面以垃圾郵件過濾器為例,描述貝葉斯分類的實際應用。
早期的郵件過濾器使用的基於規則的樸素貝葉斯分類,典型的規則包括:大寫的過度使用、與醫藥相關的單詞、過於花哨的HTML等。
這種過濾有兩個問題:
1.如果垃圾制造者知道規律就能繞開過濾器,其行為變得更加隱蔽。
2.某些被當作垃圾的分類中某些情況下並不適用(可能是正常內容)。
本例將在開始階段和逐漸接收到更多消息後,由人們告訴它哪些是垃圾,哪些不是,不斷學習後,程序對垃圾信息的界定逐漸形成自己的觀點。這是典型的監督學習中的分類。
下面是實現過程的描述:
- 問題描述:郵件分為兩類,bad and good,令郵件內容為doc,分類為cat;程序判斷給定doc是哪個分類。上述描述實際是計算doc是某一分類的概率,即P(cat|doc)
- 設置特征集,將特征集定為分詞,每個分詞是一個特征,doc = FeatureSet = Set(分詞)
- 字典fc記錄每個特征在不同分類下的數量:fc = {} = {feature:{good:N, bad:M}},cc記錄每個分類下特征的總數:cc = {good:N, bad:M};則對於某個特定分類,特征f出現的概率 P(f|cat) = fc[f][cat] / cc[cat]
- 根據Navies Bayes計算 P(cat|doc),假設每個特征彼此獨立,下圖是核心公式:
由上圖的公式可推導:
P(cat|doc) = P(doc|cat) * P(cat) / P(doc)
= P(FeatureSet|cat) * P(cat) / P(doc)
= [(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat) / P(doc)
= ∏(Fn|cat) * P(cat) / P(doc)
由於絕大多數doc的內容都不同,可認為P(doc)是一個固定值1,計算P(doc)沒有意義。由此上式可等價為[(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat)
偽代碼:
docProbability = [(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat)
docProbability.setDefaultValue(1)
compute docProbability:
Features.forEach(f -> { docProbability *= P(f|cat)}) = Features.forEach(f->{docProbability *= fc[f][cat] / cc[cat]})
catProbabilty = P(cat) = cc[cat] / cc.all
最終 P(cat|doc) ≈ docProbability / catProbabilty
5. 當訓練數據較少時,避免將普通doc歸為bad非常重要。為解決這個問題,為每個分類設置閾值。對於一個doc來說,其概率與所有其他分類的概率相比,要大於閾值,即:
P(cat|doc) / P(other|doc) > threshold。
例如:假設過濾到bad的閾值是3, 則當P(bad|doc) / P(good|doc) > 3時才能劃分到bad類中。
如果good的閾值是1, 則 P(good|doc) > P(bad|doc)是就能劃分到good類中。
對於 1 < P(bad|doc) / P(good|doc) < 3, 劃分到unknow,可令unknow = good。
函數predict(doc) 是最終暴露的方法,使用threshold處理分類。
6.添加訓練集,使用predict方法判斷測試項屬於哪個分類。
參考文獻:
《集體智慧編程》
作者:我是8位的
出處:http://www.cnblogs.com/bigmonkey
本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!
樸素貝葉斯