根據(jù)貝葉斯分類器(1)貝葉斯決策論概述、貝葉斯和頻率檐迟、概率和似然专普,我們對貝葉斯分類器所要解決的問題悯衬、問題的求解方法做了概述,將貝葉斯分類問題轉(zhuǎn)化成了求解的問題檀夹,在上一篇貝葉斯分類器(2)極大似然估計筋粗、MLE與MAP
中,我們分析了第一個求解方法:極大似然估計炸渡。在本篇中娜亿,我們來介紹一個更加簡單的求解方法,并在此基礎(chǔ)上講講常用的一個貝葉斯分類器的實現(xiàn):樸素貝葉斯分類器(Naive Bayes classifier)蚌堵。
1 樸素貝葉斯分類原理
1.1 分類問題回顧
我們的目標(biāo)是通過對樣本的學(xué)習(xí)來得到一個分類器买决,以此來對未知數(shù)據(jù)進(jìn)行分類,即求后驗概率吼畏。在貝葉斯分類器(1)貝葉斯決策論概述策州、貝葉斯和頻率、概率和似然中宫仗,我們描述了貝葉斯分類器是以生成式模型的思路來處理這個問題的够挂,如下面的公式所示,貝葉斯分類器通過求得聯(lián)合概率
來計算
藕夫,并將聯(lián)合概率
轉(zhuǎn)化成了計算類先驗概率
孽糖、類條件概率
、證據(jù)因子
毅贮。
其中的難點是類條件概率的計算办悟,因為樣本
本身就是其所有屬性的聯(lián)合概率,各種屬性隨意組合滩褥,變幻莫測病蛉,要計算其中某一種組合出現(xiàn)的概率真的是太難了,而樸素貝葉斯的出現(xiàn)就是為了解決這個問題的。
要想計算聯(lián)合概率铺然,我們肯定是希望事件
與事件
是相互獨立的俗孝,可以簡單粗暴的
,多想對著流星許下心愿:讓世界上復(fù)雜的聯(lián)合概率都變成簡單的連乘魄健!
1.2 樸素貝葉斯
樸素貝葉斯實現(xiàn)了我們的夢想赋铝!樸素貝葉斯中的樸素就是對多屬性的聯(lián)合分布做了一個大膽的假設(shè),即的
個維度之間相互獨立:
樸素貝葉斯通過這一假設(shè)大大簡化了的計算沽瘦,當(dāng)然革骨,使用這個假設(shè)是有代價的,一般情況下析恋,大量樣本的特征之間獨立這個條件是弱成立的良哲,畢竟哲學(xué)上說聯(lián)系是普遍的,所以我們使用樸素貝葉斯會降低一些準(zhǔn)確性助隧;如果實際問題中的事件的各個屬性非常不獨立的話筑凫,甚至是無法使用樸素貝葉斯的±洌總的來說,樸素貝葉斯大大簡化了計算嚎货,同時犧牲了一些結(jié)果的準(zhǔn)確性橘霎,具體要不要使用、怎么使用就看我們在實際問題中的權(quán)衡了殖属。
在樸素貝葉斯的思想下再看回分類問題姐叁,事件有
個屬性,可將分類問題按下式轉(zhuǎn)化:
只需要計算出上式不同類別下的值洗显,令值最大的類別
即為分類結(jié)果外潜。
其中,根據(jù)大數(shù)定律挠唆,处窥,
是類別
下的后驗概率,其計算要取決于先驗
玄组,這里需要分為
是離散或連續(xù)兩種情況:
1.2.1 特征/屬性是離散型隨機(jī)變量
-
1)先驗服從多項式分布:假設(shè)
的特征取值服從多項式分布滔驾,那么同樣根據(jù)大數(shù)定律,可通過頻率來計算
:
為樣本中類別為
的頻數(shù)俄讹,
為類別為
的樣本中哆致,第
個屬性中
出現(xiàn)的頻數(shù)。
不過有些出現(xiàn)的概率比較低的屬性患膛,在我們的樣本中不一定會出現(xiàn)摊阀,即頻數(shù)為0,如果不作處理的話會導(dǎo)致其為0,會導(dǎo)致包含這個屬性的樣本永遠(yuǎn)都不會被分類到類別
胞此,而現(xiàn)實不一定是這樣臣咖,因此我們需要對沒出現(xiàn)的情況做平滑處理,比如常見的拉普拉斯平滑豌鹤,給分子
的頻數(shù)加上一個定值
亡哄,而分母加上
,表示為第
個屬性中的每一種取值的頻數(shù)都加定值
:
舉例:垃圾郵件判斷
樸素貝葉斯分類在垃圾郵件的判斷上有不錯的實踐效果布疙,這是一個二分類問題蚊惯,灵临,假設(shè)
為垃圾郵件截型,
為正常郵件,統(tǒng)計出:
現(xiàn)在收到一封郵件包含一些關(guān)鍵詞:【中獎宦焦,筆記本電腦,特朗普顿涣,大選波闹,...】,根據(jù)大量的數(shù)據(jù)可以統(tǒng)計出這些詞出現(xiàn)的頻數(shù)涛碑,除以類別中所有詞的總頻數(shù)得到其出現(xiàn)的后驗概率蒲障,在垃圾郵件中:
在正常郵件中:
可以計算得到:
時的值是
時值的26倍,所以判斷此郵件是垃圾郵件缸沃。
我們判斷西瓜好壞的問題也可以轉(zhuǎn)化成離散型隨機(jī)變量的分類問題肯污,過程與上面類似哄芜。
-
2)先驗服從伯努利分布:在
的屬性是離散型隨機(jī)變量的分類問題中,如果一個屬性只關(guān)注其出現(xiàn)或者不出現(xiàn)冤议,而不關(guān)注其在一個樣本內(nèi)出現(xiàn)的次數(shù)堪滨,也就是其取值只有0和1,那么我們可以假設(shè)這個屬性是服從伯努利分布的(注意:不要求屬性為伯努利分布,只要業(yè)務(wù)需要了讨,我們可以把它變成伯努利分布胞谭,比如對于銷量,我們讓小于100的都是0旺垒,大于100的為1)。其后驗概率的計算為:
比如垃圾郵件的例子,在多項式樸素貝葉斯中:
如果我們只關(guān)心“中獎”出現(xiàn)與否鳍烁,不管詞頻糊闽,則在伯努利樸素貝葉斯中:
1.2.2 特征/屬性是連續(xù)型隨機(jī)變量
連續(xù)變量離散化姚垃,使用多項式分布或伯努利分布:當(dāng)
的屬性是連續(xù)型隨機(jī)變量時,如果我們對取值的業(yè)務(wù)理解較好,一些情況下可以選擇將連續(xù)變量離散化偿荷,比如在一個商品的分類中贪嫂,我們根據(jù)業(yè)務(wù)理解把低于100塊的映射到“便宜”斗塘,100到200塊的映射到“一般”,高于100塊的映射到“好貴”,這樣就可以轉(zhuǎn)化為離散變量的問題,這是比較簡單的處理方式乳讥,不過對業(yè)務(wù)理解的要求比較高,而且要求樣本的量不能太少告嘲,要保證每個區(qū)間有一定的樣本量。
假設(shè)
的連續(xù)型屬性服從某種分布侨嘀,比如正態(tài)分布: 假設(shè)
服從正態(tài)分布臭挽,其中參數(shù)
通過類別為
的所有樣本中屬性
的各種取值的平均得到,參數(shù)
同理咬腕,通過樣本的標(biāo)準(zhǔn)差得到欢峰,以此概率密度函數(shù)來計算
。
舉例:性別判斷
下面是一組人類身體特征的統(tǒng)計資料涨共。
有人身高6英尺纽帖、體重130磅,腳掌8英寸举反,判斷此人性別:
各屬性為連續(xù)變量懊直,假設(shè)男性和女性的身高、體重火鼻、腳掌都是正態(tài)分布室囊,通過樣本計算出均值和方差。男性的身高是均值5.855魁索、方差0.035的正態(tài)分布波俄。所以,例如男性的身高為6英尺的概率的相對值等于1.5789(密度函數(shù)的值蛾默,并不是概率懦铺,只用來反映各個值的相對可能性)。
分布確定后支鸡,就可以計算性別的分類了:
女性的概率比男性要高出將近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種常用的不同類型的樸素貝葉斯:
- 高斯分布型 (Gaussian NB):用于上面所說的連續(xù)型變量的分類問題嚷闭,假定屬性/特征服從正態(tài)分布;
- 多項式型 (Multinomial NB):用于離散值模型里赖临。比如我們在1.2.1中的例子胞锰;
- 伯努利型 (Bernoulli NB):用于離散值模型里,最后得到的特征只有0(沒出現(xiàn))和1(出現(xiàn)過)兢榨。
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.(不是很明白)
>> 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文檔