背景案例
幾年前割粮,J.K. 羅琳(憑借《哈利波特》出名)試著做了件有趣的事。她以 Robert Galbraith 的化名寫(xiě)了本名叫《The Cuckoo’s Calling》的書(shū)级零。盡管該書(shū)得到一些不錯(cuò)的評(píng)論,但是大家都不太重視它滞乙,直到 Twitter 上一個(gè)匿名的知情人士說(shuō)那是 J.K. Rowling 寫(xiě)的妄讯。《倫敦周日泰晤士報(bào)》找來(lái)兩名專家對(duì)《杜鵑在呼喚》和 Rowling 的《偶發(fā)空缺》以及其他幾名作者的書(shū)進(jìn)行了比較酷宵。分析結(jié)果強(qiáng)有力地指出羅琳就是作者,《泰晤士報(bào)》直接詢問(wèn)出版商情況是否屬實(shí)躬窜,而出版商也證實(shí)了這一說(shuō)法浇垦,該書(shū)在此后一夜成名。
這就是一個(gè)文本分類預(yù)測(cè)的例子荣挨,接下來(lái)我們看看樸素貝葉斯是怎么做的男韧。
貝葉斯定理
貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎(chǔ)默垄,故統(tǒng)稱為貝葉斯分類此虑。
這個(gè)定理解決了現(xiàn)實(shí)生活里經(jīng)常遇到的問(wèn)題:已知某條件概率,如何得到兩個(gè)事件交換后的概率口锭,也就是在已知P(A|B)的情況下如何求得P(B|A)朦前。
條件概率:
貝葉斯定理之所以有用,是因?yàn)槲覀冊(cè)谏钪薪?jīng)常遇到這種情況:我們可以很容易直接得出P(A|B)鹃操,P(B|A)則很難直接得出韭寸,但我們更關(guān)心P(B|A),貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路荆隘。
貝葉斯定理:
樸素貝葉斯
樸素貝葉斯之所以樸素恩伺,是因?yàn)槠渌枷牒軜闼兀⑽?naive .....(不禁想到某位長(zhǎng)者)椰拒。在文本分類上晶渠,其忽略了詞序凰荚,記錄詞頻。樸素貝葉斯的思想基礎(chǔ)是這樣的:對(duì)于給出的待分類項(xiàng)褒脯,求解在此項(xiàng)出現(xiàn)的條件下各個(gè)類別出現(xiàn)的概率便瑟,哪個(gè)最大,就認(rèn)為此待分類項(xiàng)屬于哪個(gè)類別憨颠。
優(yōu)點(diǎn):
- 易執(zhí)行
- 特征空間大
- 有效
缺點(diǎn):
- 無(wú)語(yǔ)義分析
樸素貝葉斯分類的正式定義如下:
-
設(shè)
為一個(gè)待分類項(xiàng)胳徽,而每個(gè)a為x的一個(gè)特征屬性。
-
有類別集合
爽彤。
-
計(jì)算
养盗。
-
如果
那么現(xiàn)在的關(guān)鍵就是如何計(jì)算第3步中的各個(gè)條件概率往核。我們可以這么做:
找到一個(gè)已知分類的待分類項(xiàng)集合,這個(gè)集合叫做訓(xùn)練樣本集嚷节。
統(tǒng)計(jì)得到在各類別下各個(gè)特征屬性的條件概率估計(jì)聂儒。即
- 如果各個(gè)特征屬性是條件獨(dú)立的,則根據(jù)貝葉斯定理有如下推導(dǎo):
-
因?yàn)榉帜笇?duì)于所有類別為常數(shù)硫痰,因?yàn)槲覀冎灰獙⒎肿幼畲蠡钥神没椤S忠驗(yàn)楦魈卣鲗傩允菞l件獨(dú)立的,所以有:
流程
第一階段——準(zhǔn)備工作階段效斑,這個(gè)階段的任務(wù)是為樸素貝葉斯分類做必要的準(zhǔn)備非春,主要工作是根據(jù)具體情況確定特征屬性,并對(duì)每個(gè)特征屬性進(jìn)行適當(dāng)劃分缓屠,然后由人工對(duì)一部分待分類項(xiàng)進(jìn)行分類奇昙,形成訓(xùn)練樣本集合。這一階段的輸入是所有待分類數(shù)據(jù)敌完,輸出是特征屬性和訓(xùn)練樣本储耐。這一階段是整個(gè)樸素貝葉斯分類中唯一需要人工完成的階段,其質(zhì)量對(duì)整個(gè)過(guò)程將有重要影響滨溉,分類器的質(zhì)量很大程度上由特征屬性什湘、特征屬性劃分及訓(xùn)練樣本質(zhì)量決定。
第二階段——分類器訓(xùn)練階段业踏,這個(gè)階段的任務(wù)就是生成分類器禽炬,主要工作是計(jì)算每個(gè)類別在訓(xùn)練樣本中的出現(xiàn)頻率及每個(gè)特征屬性劃分對(duì)每個(gè)類別的條件概率估計(jì),并將結(jié)果記錄勤家。其輸入是特征屬性和訓(xùn)練樣本腹尖,輸出是分類器。這一階段是機(jī)械性階段,根據(jù)前面討論的公式可以由程序自動(dòng)計(jì)算完成热幔。
第三階段——應(yīng)用階段乐设。這個(gè)階段的任務(wù)是使用分類器對(duì)待分類項(xiàng)進(jìn)行分類,其輸入是分類器和待分類項(xiàng)绎巨,輸出是待分類項(xiàng)與類別的映射關(guān)系近尚。這一階段也是機(jī)械性階段,由程序完成场勤。
Example
病人分類的例子
讓我從一個(gè)例子開(kāi)始講起戈锻,你會(huì)看到貝葉斯分類器很好懂,一點(diǎn)都不難和媳。
某個(gè)醫(yī)院早上收了六個(gè)門(mén)診病人格遭,如下表。
癥狀 職業(yè) 疾病
打噴嚏 護(hù)士 感冒
打噴嚏 農(nóng)夫 過(guò)敏
頭痛 建筑工人 腦震蕩
頭痛 建筑工人 感冒
打噴嚏 教師 感冒
頭痛 教師 腦震蕩
現(xiàn)在又來(lái)了第七個(gè)病人留瞳,是一個(gè)打噴嚏的建筑工人拒迅。請(qǐng)問(wèn)他患上感冒的概率有多大?
根據(jù)貝葉斯定理:
P(A|B) = P(B|A) P(A) / P(B)
可得
P(感冒|打噴嚏x建筑工人)
= P(打噴嚏x建筑工人|感冒) x P(感冒)
/ P(打噴嚏x建筑工人)
假定"打噴嚏"和"建筑工人"這兩個(gè)特征是獨(dú)立的她倘,因此璧微,上面的等式就變成了
P(感冒|打噴嚏x建筑工人)
= P(打噴嚏|感冒) x P(建筑工人|感冒) x P(感冒)
/ P(打噴嚏) x P(建筑工人)
這是可以計(jì)算的
P(感冒|打噴嚏x建筑工人)
= 0.66 x 0.33 x 0.5 / 0.5 x 0.33
= 0.66
因此,這個(gè)打噴嚏的建筑工人硬梁,有66%的概率是得了感冒前硫。同理,可以計(jì)算這個(gè)病人患上過(guò)敏或腦震蕩的概率荧止。比較這幾個(gè)概率开瞭,就可以知道他最可能得什么病。
這就是貝葉斯分類器的基本方法:在統(tǒng)計(jì)資料的基礎(chǔ)上罩息,依據(jù)某些特征,計(jì)算各個(gè)類別的概率个扰,從而實(shí)現(xiàn)分類瓷炮。
實(shí)戰(zhàn)
我們有一組郵件,分別由同一家公司的兩個(gè)人撰寫(xiě)其中半數(shù)的郵件递宅。我們的目標(biāo)是僅根據(jù)郵件正文區(qū)分每個(gè)人寫(xiě)的郵件娘香。
先給你一個(gè)字符串列表。每個(gè)字符串代表一封經(jīng)過(guò)預(yù)處理的郵件的正文办龄;提供代碼烘绽,用來(lái)將數(shù)據(jù)集分解為訓(xùn)練集和測(cè)試集。
樸素貝葉斯特殊的一點(diǎn)在于俐填,這種算法非常適合文本分類安接。在處理文本時(shí),常見(jiàn)的做法是將每個(gè)單詞看作一個(gè)特征英融,這樣就會(huì)有大量的特征盏檐。此算法的相對(duì)簡(jiǎn)單性和樸素貝葉斯獨(dú)立特征的這一假設(shè)歇式,使其能夠出色完成文本的分類。此項(xiàng)目使用 python 的 sklearn包胡野,然后使用樸素貝葉斯根據(jù)作者對(duì)郵件進(jìn)行分類材失。
#!/usr/bin/python
import sys
from time import time
sys.path.append("../tools/")
from email_preprocess import preprocess
from sklearn.metrics import accuracy_score
### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()
#########################################################
### main code ###
from sklearn.naive_bayes import GaussianNB
# 創(chuàng)建分類器
clf = GaussianNB()
t0 = time()
clf.fit(features_train, labels_train)
print "training time:", round(time()-t0, 3), "s"
t1 = time()
# 進(jìn)行預(yù)測(cè)
pred = clf.predict(features_test)
print "predicting time:", round(time()-t1, 3), "s"
# 輸出預(yù)測(cè)準(zhǔn)確率
print accuracy_score(pred,labels_test)
#########################################################
結(jié)果
no. of Chris training emails: 7936
no. of Sara training emails: 7884
training time: 2.396 s
predicting time: 0.464 s
accuracy: 0.973265073948
參考文章
算法雜貨鋪——分類算法之樸素貝葉斯分類(Naive Bayesian classification))
樸素貝葉斯分類器的應(yīng)用
Intro to machine learning