貝葉斯分類器(3)樸素貝葉斯分類器

根據(jù)貝葉斯分類器(1)貝葉斯決策論概述、貝葉斯和頻率檐迟、概率和似然专普,我們對貝葉斯分類器所要解決的問題悯衬、問題的求解方法做了概述,將貝葉斯分類問題轉(zhuǎn)化成了求解P(x|c)的問題檀夹,在上一篇貝葉斯分類器(2)極大似然估計筋粗、MLE與MAP
中,我們分析了第一個求解方法:極大似然估計炸渡。在本篇中娜亿,我們來介紹一個更加簡單的P(x|c)求解方法,并在此基礎(chǔ)上講講常用的一個貝葉斯分類器的實現(xiàn):樸素貝葉斯分類器(Naive Bayes classifier)蚌堵。

1 樸素貝葉斯分類原理

1.1 分類問題回顧

我們的目標(biāo)是通過對樣本的學(xué)習(xí)來得到一個分類器买决,以此來對未知數(shù)據(jù)進(jìn)行分類,即求后驗概率P(c|x)吼畏。在貝葉斯分類器(1)貝葉斯決策論概述策州、貝葉斯和頻率、概率和似然中宫仗,我們描述了貝葉斯分類器是以生成式模型的思路來處理這個問題的够挂,如下面的公式所示,貝葉斯分類器通過求得聯(lián)合概率P(x,c)來計算P(c|x)藕夫,并將聯(lián)合概率P(x,c)轉(zhuǎn)化成了計算類先驗概率P(c)孽糖、類條件概率P(x|c)、證據(jù)因子P(x)毅贮。

h^*(x)=\argmax_{c\in Y} P(c|x)=\argmax_{c\in Y} \frac{P(x,c)}{P(x)}=\argmax_{c\in Y} \frac{P(c)*P(x|c)}{P(x)}

其中的難點是類條件概率P(x|c)的計算办悟,因為樣本x本身就是其所有屬性的聯(lián)合概率,各種屬性隨意組合滩褥,變幻莫測病蛉,要計算其中某一種組合出現(xiàn)的概率真的是太難了,而樸素貝葉斯的出現(xiàn)就是為了解決這個問題的。

要想計算聯(lián)合概率P(a,b)铺然,我們肯定是希望事件a與事件b是相互獨立的俗孝,可以簡單粗暴的P(a,b)=P(a)P(b),多想對著流星許下心愿:讓世界上復(fù)雜的聯(lián)合概率都變成簡單的連乘魄健!

1.2 樸素貝葉斯

樸素貝葉斯實現(xiàn)了我們的夢想赋铝!樸素貝葉斯中的樸素就是對多屬性的聯(lián)合分布做了一個大膽的假設(shè),即xn個維度之間相互獨立:

P([x_1,x_2,...,x_n]|c)=P(x_1|c)P(x_2|c)...P(x_1|c)

樸素貝葉斯通過這一假設(shè)大大簡化了P(x|c)的計算沽瘦,當(dāng)然革骨,使用這個假設(shè)是有代價的,一般情況下析恋,大量樣本的特征之間獨立這個條件是弱成立的良哲,畢竟哲學(xué)上說聯(lián)系是普遍的,所以我們使用樸素貝葉斯會降低一些準(zhǔn)確性助隧;如果實際問題中的事件的各個屬性非常不獨立的話筑凫,甚至是無法使用樸素貝葉斯的±洌總的來說,樸素貝葉斯大大簡化了計算嚎货,同時犧牲了一些結(jié)果的準(zhǔn)確性橘霎,具體要不要使用、怎么使用就看我們在實際問題中的權(quán)衡了殖属。

在樸素貝葉斯的思想下再看回分類問題姐叁,事件xm個屬性,可將分類問題按下式轉(zhuǎn)化:

只需要計算出上式不同類別c下的值洗显,令值最大的類別c_i即為分類結(jié)果外潜。

其中,根據(jù)大數(shù)定律挠唆,P(c)=\frac{N_c}{N}处窥,P(x_i|c)是類別c下的后驗概率,其計算要取決于先驗x玄组,這里需要分為X是離散或連續(xù)兩種情況:

1.2.1 特征/屬性是離散型隨機(jī)變量

  • 1)先驗服從多項式分布:假設(shè)x的特征取值服從多項式分布滔驾,那么同樣根據(jù)大數(shù)定律,可通過頻率來計算P(x_i|c)

P(x_i=x_{i*}|c)=\frac{N_{ci*}}{N_c}

N_c為樣本中類別為c的頻數(shù)俄讹,N_{ci*}為類別為c的樣本中哆致,第i個屬性中i*出現(xiàn)的頻數(shù)。
不過有些出現(xiàn)的概率比較低的屬性患膛,在我們的樣本中不一定會出現(xiàn)摊阀,即頻數(shù)為0,如果不作處理的話會導(dǎo)致其P(x_i|c)為0,會導(dǎo)致包含這個屬性的樣本永遠(yuǎn)都不會被分類到類別c胞此,而現(xiàn)實不一定是這樣臣咖,因此我們需要對沒出現(xiàn)的情況做平滑處理,比如常見的拉普拉斯平滑豌鹤,給分子i*的頻數(shù)加上一個定值\lambda亡哄,而分母加上a*\lambda,表示為第i個屬性中的每一種取值的頻數(shù)都加定值\lambda

P(x_i=x_{i*}|c)=\frac{N_{ci*}+\lambda}{N_c+a*\lambda}

舉例:垃圾郵件判斷
樸素貝葉斯分類在垃圾郵件的判斷上有不錯的實踐效果布疙,這是一個二分類問題蚊惯,c\in[垃圾郵件,正常郵件]灵临,假設(shè)c_0為垃圾郵件截型,c_1為正常郵件,統(tǒng)計出:

P(c_0)=0.2儒溉,P(c_1)=0.8

現(xiàn)在收到一封郵件包含一些關(guān)鍵詞:【中獎宦焦,筆記本電腦,特朗普顿涣,大選波闹,...】,根據(jù)大量的數(shù)據(jù)可以統(tǒng)計出這些詞出現(xiàn)的頻數(shù)涛碑,除以類別中所有詞的總頻數(shù)得到其出現(xiàn)的后驗概率蒲障,在垃圾郵件中:

P(中獎|c_0)=0.7庄撮,P(筆記本電腦|c_0)=0.5,P(特朗普|c_0)=0.3,P(大選|c_0)=0.4

在正常郵件中:

P(中獎|c_1)=0.1厅翔,P(筆記本電腦|c_1)=0.2,P(特朗普|c_1)=0.1甸昏,P(大選|c_1)=0.2

可以計算得到:

P(c_0)\cdot\prod_{} P(x_{i}|c_0)=0.2*0.7*0.5*0.3*0.4=0.0084

P(c_1)\cdot\prod_{} P(x_{i}|c_1)=0.8*0.1*0.2*0.1*0.2=0.00032

c=c_0時的值是c=c_1時值的26倍,所以判斷此郵件是垃圾郵件缸沃。

我們判斷西瓜好壞的問題也可以轉(zhuǎn)化成離散型隨機(jī)變量的分類問題肯污,過程與上面類似哄芜。

  • 2)先驗服從伯努利分布:x的屬性是離散型隨機(jī)變量的分類問題中,如果一個屬性只關(guān)注其出現(xiàn)或者不出現(xiàn)冤议,而不關(guān)注其在一個樣本內(nèi)出現(xiàn)的次數(shù)堪滨,也就是其取值只有0和1,那么我們可以假設(shè)這個屬性是服從伯努利分布的(注意:不要求屬性為伯努利分布,只要業(yè)務(wù)需要了讨,我們可以把它變成伯努利分布胞谭,比如對于銷量,我們讓小于100的都是0旺垒,大于100的為1)。其后驗概率的計算為:

P(x_{i*} \mid c) = P(x_{i*} \mid c) *x_{i*} + (1 - P(x_{i*}\mid c)) *(1 - x_{i*})

比如垃圾郵件的例子,在多項式樸素貝葉斯中:

P(x_{i*}=中獎|c=垃圾郵件)=\frac{垃圾郵件中“中獎”詞頻+\lambda}{垃圾郵件中總詞頻+詞數(shù)*\lambda}

如果我們只關(guān)心“中獎”出現(xiàn)與否鳍烁,不管詞頻糊闽,則在伯努利樸素貝葉斯中:

P(x_{i*}=中獎|c=垃圾郵件)=\frac{垃圾郵件中含有“中獎”的郵件數(shù) +α }{垃圾郵件數(shù) + α*郵件類別數(shù)}

1.2.2 特征/屬性是連續(xù)型隨機(jī)變量

  • 連續(xù)變量離散化姚垃,使用多項式分布或伯努利分布:當(dāng)x的屬性是連續(xù)型隨機(jī)變量時,如果我們對取值的業(yè)務(wù)理解較好,一些情況下可以選擇將連續(xù)變量離散化偿荷,比如在一個商品的分類中贪嫂,我們根據(jù)業(yè)務(wù)理解把低于100塊的映射到“便宜”斗塘,100到200塊的映射到“一般”,高于100塊的映射到“好貴”,這樣就可以轉(zhuǎn)化為離散變量的問題,這是比較簡單的處理方式乳讥,不過對業(yè)務(wù)理解的要求比較高,而且要求樣本的量不能太少告嘲,要保證每個區(qū)間有一定的樣本量。

  • 假設(shè)x的連續(xù)型屬性服從某種分布侨嘀,比如正態(tài)分布: 假設(shè)P(x_i|c)服從正態(tài)分布臭挽,其中參數(shù)\mu通過類別為c的所有樣本中屬性x_i的各種取值的平均得到,參數(shù)\sigma同理咬腕,通過樣本的標(biāo)準(zhǔn)差得到欢峰,以此概率密度函數(shù)來計算P(x_i=x_{i*}|c)

舉例:性別判斷
下面是一組人類身體特征的統(tǒng)計資料涨共。

有人身高6英尺纽帖、體重130磅,腳掌8英寸举反,判斷此人性別:

各屬性為連續(xù)變量懊直,假設(shè)男性和女性的身高、體重火鼻、腳掌都是正態(tài)分布室囊,通過樣本計算出均值和方差。男性的身高是均值5.855魁索、方差0.035的正態(tài)分布波俄。所以,例如男性的身高為6英尺的概率的相對值等于1.5789(密度函數(shù)的值蛾默,并不是概率懦铺,只用來反映各個值的相對可能性)。

分布確定后支鸡,就可以計算性別的分類了:

P(身高=6|男) * P(體重=130|男) * P(腳掌=8|男) * P(男) = 6.1984 * 10^{-9}

P(身高=6|女) * P(體重=130|女) * P(腳掌=8|女) * P(女) = 5.3778 *10^{-4}

女性的概率比男性要高出將近10000倍冬念,所以判斷該人為女性。

1.3 樸素貝葉斯分類的平滑方法

在前文1.2.1小節(jié)中我們已經(jīng)提過平滑處理牧挣,主要針對于那些在樣本中沒有出現(xiàn)過的詞急前,它們的概率是0,導(dǎo)致在分類中完全沒有存在感瀑构,所以要對這些進(jìn)行平滑處理裆针。

平滑處理的方法也有很多種,包括我們上面說過的拉普拉斯平滑寺晌,除此之外還有古德圖靈平滑世吨,線性插值法,回退法(K-Z回退)等呻征,不過這些方法在自然語言處理中比較常用耘婚,我們暫時先不多介紹了,還是聚焦在樸素貝葉斯上陆赋,下面我們看看樸素貝葉斯在sklearn中的實現(xiàn)沐祷。

2 樸素貝葉斯的sklearn實現(xiàn)

sklearn中有3種常用的不同類型的樸素貝葉斯:

1)高斯分布型樸素貝葉斯

sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)

Parameters
priors:array-like of shape (n_classes,)
類別的先驗概率胜蛉,如果指定,則不再根據(jù)數(shù)據(jù)計算調(diào)整
var_smoothing:float, default=1e-9
Portion of the largest variance of all features that is added to variances for calculation stability.(不是很明白)

Gaussian NB的方法
>> import numpy as np
>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>> Y = np.array([1, 1, 1, 2, 2, 2])
>> from sklearn.naive_bayes import GaussianNB
>> clf = GaussianNB()
>> clf.fit(X, Y)
GaussianNB()
>> print(clf.predict([[-0.8, -1]]))
[1]
>> clf_pf = GaussianNB()
>> clf_pf.partial_fit(X, Y, np.unique(Y))  # 增量訓(xùn)練
GaussianNB()
>> print(clf_pf.predict([[-0.8, -1]]))
[1]
>> clf.predict_proba(np.array([[2,2]]))   # 輸出概率
array([[2.31952419e-16, 1.00000000e+00]])
>> clf.predict_log_proba(np.array([[2,2]]))    # 輸出對數(shù)概率
array([[-35.99999941,   0.        ]])

2)多項式分布型樸素貝葉斯

sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)

Parameters
alpha:float, default=1.0
Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).

fit_prior:bool, default=True
Whether to learn class prior probabilities or not. If false, a uniform prior will be used.

class_prior:array-like of shape (n_classes,), default=None
Prior probabilities of the classes. If specified the priors are not adjusted according to the data.

其常用函數(shù)與高斯型一樣色乾。

>> import numpy as np
>> rng = np.random.RandomState(1)
>> X = rng.randint(5, size=(6, 100))
>> y = np.array([1, 2, 3, 4, 5, 6])
>> from sklearn.naive_bayes import MultinomialNB
>> clf = MultinomialNB()
>> clf.fit(X, y)
MultinomialNB()
>> print(clf.predict(X[2:3]))
[3]

3)伯努利分布型樸素貝葉斯

sklearn.naive_bayes.BernoulliNB(*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)

Parameters
binarize:float or None, default=0.0
Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors.(用于設(shè)置二值化的閾值)

官方例子與多項式型的基本一樣誊册,而且也沒有設(shè)置binarize,相當(dāng)于默認(rèn)使用binarize=0.0暖璧,根據(jù)源碼 sklearn/preprocessing/_data.py
中的binarize(X, *, threshold=0.0, copy=True)函數(shù)可以發(fā)現(xiàn)案怯,大于binarize的都賦值為1,其他為0澎办。

>> import numpy as np
>> rng = np.random.RandomState(1)
>> X = rng.randint(5, size=(6, 100))
>> Y = np.array([1, 2, 3, 4, 4, 5])
>> from sklearn.naive_bayes import BernoulliNB
>> clf = BernoulliNB()
>> clf.fit(X, Y)   # X中各個特征的取值為[0,1,2,3,4]嘲碱,二值化后大于0的都為1
BernoulliNB()
>> print(clf.predict(X[2:3]))
[3]

3 樸素貝葉斯總結(jié)

優(yōu)點

  • 樸素貝葉斯算法假設(shè)了數(shù)據(jù)集屬性之間是相互獨立的,因此算法的邏輯性十分簡單局蚀,并且算法較為穩(wěn)定麦锯,當(dāng)數(shù)據(jù)呈現(xiàn)不同的特點時,樸素貝葉斯的分類性能不會有太大的差異琅绅;
  • 當(dāng)數(shù)據(jù)集屬性之間的關(guān)系相對比較獨立時扶欣,樸素貝葉斯分類算法會有較好的效果;
  • 數(shù)據(jù)量要求不大千扶,適合增量式訓(xùn)練料祠,能直接處理多分類;
  • 算法簡單直觀澎羞,具有很好的可解釋性髓绽,可以直接輸出概率。

缺點

  • 屬性獨立性的條件也是樸素貝葉斯的不足之處妆绞,數(shù)據(jù)集屬性的獨立性在很多情況下很難滿足顺呕;
  • 需要知道先驗概率,且先驗概率很多時候也是取決于假設(shè)括饶,故對假設(shè)的合理性較為依賴株茶。

可見,樸素貝葉斯的缺點很大程度來來源于其假設(shè)太強(qiáng)巷帝,對于其假設(shè)符合程度較低的問題會損失較多的準(zhǔn)確性忌卤,因此扫夜,如果我們能把假設(shè)弱化一下楞泼,是不是就能提高樸素貝葉斯的性能呢驰徊?在接下來的篇章中我們來繼續(xù)探索。



主要參考資料

《機(jī)器學(xué)習(xí)》周志華
《統(tǒng)計學(xué)習(xí)方法》 李航
scikit-learn Naive Bayes文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堕阔,一起剝皮案震驚了整個濱河市棍厂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌超陆,老刑警劉巖牺弹,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異时呀,居然都是意外死亡张漂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谨娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來航攒,“玉大人,你說我怎么就攤上這事趴梢∧螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵坞靶,是天一觀的道長憔狞。 經(jīng)常有香客問我,道長彰阴,這世上最難降的妖魔是什么瘾敢? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尿这,結(jié)果婚禮上廉丽,老公的妹妹穿的比我還像新娘。我一直安慰自己妻味,他們只是感情好正压,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著责球,像睡著了一般焦履。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雏逾,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天嘉裤,我揣著相機(jī)與錄音,去河邊找鬼栖博。 笑死屑宠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仇让。 我是一名探鬼主播典奉,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼躺翻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卫玖?” 一聲冷哼從身側(cè)響起公你,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎假瞬,沒想到半個月后陕靠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡脱茉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年剪芥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琴许。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡粗俱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虚吟,到底是詐尸還是另有隱情寸认,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布串慰,位于F島的核電站偏塞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邦鲫。R本人自食惡果不足惜灸叼,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庆捺。 院中可真熱鬧古今,春花似錦、人聲如沸滔以。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽你画。三九已至抵碟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坏匪,已是汗流浹背拟逮。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留适滓,地道東北人敦迄。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罚屋。 傳聞我的和親對象是個殘疾皇子苦囱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355