貝葉斯分類器,即是以貝葉斯決策理論為基礎的分類器,什么是貝葉斯決策理論呢?
貝葉斯決策論
1 統計推斷中的貝葉斯學派和頻率學派
貝葉斯決策論是貝葉斯學派關于統計推斷(根據已有資料或者說數據,對未知問題作出判斷)的理論,要理解貝葉斯理論,就不得不和他的 “老對手”——頻率學派(經典學派)一起聊。
首先我們看看統計推斷的問題是什么。statistical inference 是學統計的目的,即根據樣本數據,對總體進行統計推斷(假設檢驗 或 預測).是指統計學中研究如何根據樣本數據去推斷總體數量特征的方法。統計推斷主要可以分為兩大類:一類是參數估計問題;另一類是假設檢驗問題。
關于這些問題,從20世紀上半頁至今,頻率學派和貝葉斯學派兩大學派一直在辯論,也一直互相不服。貝葉斯學派的發展在二十世紀滯后于頻率學派,所以我們在學校教材上學到的統計推斷的方法基本上都是頻率學派的,比如最大似然估計、卡方檢驗、T檢驗、矩估計等等。
兩個學派爭論的點是什么呢?
頻率學派 認為頻率即概率,我們所看到的樣本只是無數可能的試驗結果的一部分展現,樣本中未出現的結果不是不可能出現,只是這次抽樣沒有出現而已,綜合考慮我們看到的和沒看到的全部可能的結果,總體分布F(X,θ)是確定的,因此其中參數θ也是確定的,按我的理解,頻率學派是忽略我們觀察者,而從事件本身出發,希望以純粹的客觀事實來描述事件。所以我們看像極大似然估計、區間估計等方法,都是希望盡可能的找到那個未知的、確定的參數。
貝葉斯學派 認為概率是反映事件發生可能性的一個度量,并且不認為樣本X是無數可能中的一部分,既然樣本X出現了,那么就只能依靠事件X去做判斷,我們不知道是什么分布生成了這些樣本,所以什么分布都有可能,因此其中參數θ是不確定的,只是不同的θ的概率不同,而且應該是服從一個分布H(θ)的,而H(θ)為“先驗分布”(指抽樣之前得到的分布),這是貝葉斯學派引入的主觀概率的概念(主觀概率是根據對事件的周密觀察所得到的先驗知識,并不是唯心主義的),這里的“驗”就是這些樣本X的作用,H(θ)經過真實樣本的“驗”之后,就得到了“后驗概率”H(θ|X)(后驗概率是條件概率的形式,但不可以理解為這個形式的就是后驗概率,重點要看有沒有后驗概率的思想)。因此我們可以理解為貝葉斯學派沒有忽略觀察者的作用,在做判斷時需要不僅要考慮抽樣信息,也要考慮觀察者對事件的先驗知識,同時還引入了各種推斷結果所帶來的損失,顯然這與頻率學派的出發點是不同的,從拉普拉斯所說的Probability theory is nothing but common sense reduced to calculation也可窺一二。
現在應該對貝葉斯學派的思想有了一點認識了。那我們看看在分類問題上貝葉斯分類器是怎么一回事呢?
2 貝葉斯分類器
2.1 貝葉斯分類器概述
貝葉斯分類器是一類分類算法的總稱,貝葉斯定理是這類算法的核心,因此統稱為貝葉斯分類。
在分類問題中,我們可以根據樣本x計算出在樣本中各個類別c出現的概率,即后驗概率P(c|x),根據之前對貝葉斯統計推斷的介紹,還需要引入各種推斷結果所帶來的損失,我們定義λi,j為將cj誤分為ci時所產生的損失,根據誤判出現的概率和導致的損失,可以計算出錯誤分類是產生的期望損失,稱之為“風險”:
設想我們制定了一個判定準則h來對x進行分類得到h(x),如果每個分類結果h(x)
都是風險最小的結果,那個總體的風險R(h)也是最小的,這就是貝葉斯判定準則,稱h為貝葉斯最優分類器。
貝葉斯最優分類器為:
后驗概率最大化與風險最小化:對于二分類問題,λ要么等于0要么等于1
當i = i,即正確分類時,λii = 0,所以可以計算此時所以條件風險(該條件下的風險)為
即
P(c|x)就是根據樣本x進行分類,想想以前講過的KNN、LR等,所做的不就是這個工作嗎,這種直接對P(c|x)進行建模來預測c的方法,都叫做判別式模型(Discriminative Model),判別式模型不考慮樣本的產生模型,直接研究預測模型。如果我們換一種思路,先得到聯合分布P(c,x),再得到后驗概率P(c|x),這就是生成式模型(Generative Model),顧名思義,生成式模型會研究樣本的產生模型,判別式模型和生成式模型都是監督學習中的概念。
顯然生成模型比判別模型包含更多的信息,可以做到更多的事,實際上由生成模型可以得到判別模型,但由判別模型得不到生成模型,貝葉斯分類器就是從生成模型的角度來解決分類問題,怎么實現呢?
P(c)是類“先驗”(prior)概率;P(c|x)是樣本x相對于類標記c的類條件概率(class-conditional probability);P(c|x)是用于歸一化的“證據”(evidence)因子。
2.2 求解方法
類先驗概率P(c)表達了樣本空間中各類樣本所占的比例,根據大數定律,當訓練集包含充足的獨立同分布樣本時,P(c)可通過各類樣本出現的頻率來進行估計.P(x)看起來是樣本出現的概率,對給定樣本x,從形式上也可以看出與樣本的類標記無關,因此估計P(c|x)的問題就轉化為如何基于訓練數據D來估計先驗P(c)和P(x|c)的問題,所以問題的重點就是怎么求P(x|c),得到P(x|c)
就能得到聯合概率P(x,c),也能能得到一個貝葉斯分類器了。那么怎么完成呢?能直接通過樣本中的頻率來統計嗎?
對P(x|c)來說,由于它涉及關于x 所有屬性的聯合概率,直接根據樣本出現的頻率來估計將會遇到嚴重的困難,例如,假設樣本的 d 個屬性都是二值的,則樣本空間將有2d種可能的取值,在現實應用中,這個值往往遠大于訓練樣本數m,也就是說,很多樣本取值在訓練集中根本沒有出現,直接使用頻率來估計P(x|c)顯然不可行,因為"未被觀測到"與"出現概率為零"通常是不同的。
那應該怎么計算呢?先說第一種方法:最大似然估計。
要求得類條件概率P(x|c),如果我們什么信息都沒有肯定是不行的,所以一般假設我們知道它的概率分布,然后用一定方法來求出分布的參數即可。對于求分布的參數,一般使用最大似然估計MLE,雖然MLE是頻率學派的估計方法,不過好用的東西大家一起用嘛,貝葉斯學派有個差不多的估計方法:最大后驗估計MAP,不過MAP比MLE多了個作為因子的先驗概率P(θ),更復雜一些,這些內容咱們下回再講。
說回最大似然估計,說到最大似然估計就不得不問一句,什么是似然?這里需要好好的說道說道,只有搞清楚似然的概念才能理解怎么計算它。
2.3 似然
2.3.1 似然、似然與概率的區別和聯系
極大似然是頻率學派的參數估計方法,似然即參數的似然,是由頻率學派建立的、極大似然估計中的重要概念。從前文可知,頻率學派認為參數是確定值,參數的似然就表達了給定樣本x下某參數為這個確定值的可能性。在計算上,參數的似然值等于在該參數下事件發生的概率L(θ|x) = P(X = x|θ)。也就是說,似然值可以用概率來計算,但似然卻不是概率,因為頻率學派的體系下,參數不是隨機變量,故似然不是概率,概率是在確定參數的情況下,觀測結果發生的可能性,概率的對象是概率空間中的事件,而似然的對象是參數。
因此,似然函數定義為:似然函數L(θ|x)是給定樣本x時,關于參數θ的函數,其在數值上等于給定參數θ后變量X的概率
-
如果x
是離散型隨機變量時f(x;θ)是概率分布,f(x;θ) = Pθ(x)
-
如果x
是連續型隨機變量時f(x;θ)是概率密度,此時在x (一個樣本點)處f(x;θ) = 0
(那給定這一個點的θ的似然也是0,是不是可以理解為根據這點信息判斷出θ是否為真值的可能性太低),此時應該給定一段x區間來積分得到似然值。
值得注意的是,因為θ不是隨機變量,所以各個θ所對應的似然值是不能做累加的,我們都知道:image.pngimage.png
只是似然函數的自變量,并不是概率空間里的取值。這也從一方面說明似然是不滿足概率定理(柯爾莫果洛夫公理)的三個條件的,似然并不是概率。
2.3.2 一個例子
關于似然,知乎上還有一個很形象的例子,他山之石,可以借鑒一下,如何理解似然函數?HiTao的回答
其中的核心觀點是:似然和概率兩個函數有著不同的名字,卻源于同一個函數。P(x|θ)是一個有著兩個變量的函數。如果,你將θ設為常量,則你會得到一個概率函數(關于x的函數);如果,你將x設為常量你將得到似然函數(關于θ的函數)。
舉一個例子:
有一個硬幣,它有θ的概率會正面向上,有1-θ的概率反面向上。現有正反序列:
比如,如果θ=0,則得到這個序列的概率值為0。如果θ=1/2,概率值為1/1024。嘗試所有θ
可取的值,畫出了下圖,即為似然函數的函數圖像:
可以看出θ=0.7時的似然值最大,即0.7是最可能是真值的參數值,這就是最大似然估計的思想了。
2.4 回到貝葉斯分類
現在應該對似然有了一定的了解了,我們回憶一下貝葉斯分類器說到哪了,對:
我們的目標是用最大似然估計計算得到P(x|c),得到聯合分布.
1 極大似然估計
1.1 極大似然估計的步驟
我們已經知道,似然即參數的似然,表示給定樣本下,參數θ為真值的可能性,所以,極大似然估計就是以最大化參數的似然值的方法來估計參數的真值的算法。
極大似然函數估計值的一般步驟:
假設概率服從某種確定的概率分布(或者分布已知);
- 寫出似然函數:
image.png對似然函數取對數,并整理;
求導數;
解似然方程,得到極大似然的參數;
對于一批樣本,共有M個屬性值和N個類別,那么x就是一個M維向量,要求得[圖片上傳中...(image-e088df-1618739940424-51)],其實就是要求
- 假設分布:假設P(c|x)具有確定的形式并且被參數向量θc唯一確定,則我們的任務就是利用訓練集D估計參數θc。我們將假設的P(c|x)分布記為P(x,θc)
-
似然函數,取對數:Dc表示訓練集D中第c類樣本組成的集合,假設這些樣本是獨立同分布的,則參數θc對于數據集Dc**的似然函數是:
image.png
取對數得到對數似然函數,連乘轉換為累加,求導之類的計算更加方便:
-
求導數:當似然函數取得極大值時,自變量θc的導數應該為0,所以可以得到針對參數向量θc中每個參數θi
求偏導之后的方程組:
image.png
-
解似然方程:求解方程組得到參數向量θc,確定P(x|c)所假設的分布,根據x的取值image.png
注意:
- 當屬性值的個數M=1時,屬于假設的分布是單個屬性的分布,還比較好計算;
- 當屬性值的個數M>1時,多個屬性的分布是多維隨機變量分布,需要計算其多個屬性的聯合分布概率,這個計算方法是比較困難的。
1.2 從散度的角度解讀極大似然估計
知乎上大神詳細介紹了從散度的角度解讀極大似然估計:知乎 - 微調的回答,跟隨大神的腳步學習一下(原回答了引入了期望,我覺得其實不用期望也沒問題):
MLE的第一步是假設分布(或者已有一個分布),接下來就是通過最大化X發生的概率來求得分布參數,認為這就是最可能真實的分布,這個思路其實還是有一點繞的,憑什么說X發生的概率最大的參數就是真的參數呢?我們的目的是求出真實分布,最直觀的思路應該是看我們算出來的分布跟真實分布的相似程度,這剛好可以通過散度來解釋。
這里的散度是機器學習的散度,也就是信息論中的散度,與物理上的散度不太一樣。機器學習中我們常用的散度是KL散度(KL-Divergence)。信息論中,KL(P||Q)可以理解為:用來衡量在同一份數據P下,使用P的編碼方案和Q的編碼方案的平均編碼長度的差異,如果我們把真實的分布Pθ和計算得到的分布
注意上面兩個分布的順序是不能變的,因為定義中的P必須是真實分布,數據就是由P產生的。我們的目標是人是讓KL(P||Q)最小,注意到式中
看上面的推導,再看看極大似然的公式:
是不是根本就是一樣的?所以其實如果我們正向考慮極大似然估計,當模型是條件概率分布,損失函數是對數損失函數時,極大似然估計就是做經驗風險最小化;如果我們反過來考慮,即上面從散度推導的過程,MLE就是在尋找最接近真實分布的分布。
1.3 極大似然估計實例
以上一篇提到的西瓜好壞分類為例:
西瓜數據集如下圖:
顯然樣本共有M=6個屬性值和N=2個類別,首先根據樣本估計類先驗概率P(好瓜)=8/17 = 0.47,P(壞瓜)=9/17 = 0.53,然后為每個屬性估計條件概率P(x|c),要求P(x|c)
,應該假設兩個六維概率分布,比如我們假設樣本為6元正態分布:
均值向量
為6維向量,協方差矩陣
是一個6*6的正定矩陣。
然后分別寫出似然函數的對數形式:
最后再求偏導解方程即可,多元正態分布求導計算還是挺復雜的,本篇主要講極大似然估計,具體計算過程就不寫了,大家明白是怎么做的就好。
講完了極大似然估計的理論和操作,再來看看它和一個跟它很像的算法最大后驗估計MAP的關系。
2 MLE和MAP的區別和聯系
極大似然估計MLE是頻率學派的參數估計方法,最大后驗估計MAP是貝葉斯學派的參數估計方法。因此,同樣是參數估計的問題,MLE中參數是確定值,故定義為P(x,θ);MAP中參數是一個隨機變量,故定義為
P(θ|c),是一個后驗概率,受到先驗P(c)和樣本x的共同作用,這就是他們最本質的區別了,由此可得到其計算過程的區別:極大似然估計MLE對參數θ的估計是:
最大后驗估計MAP對參數θ的估計是:
我們發現原來MAP與MLE在計算上的不同就是多了一個先驗概率項,因此如果有一個合理的先驗的話,MAP會比MLE對樣本數據的依賴更小一些,如果數據量很大的話他們基本就是一樣的了,以我們上一篇中的拋硬幣例子來說:
有一個硬幣,它有θ的概率會正面向上,有1-θ
的概率反面向上。現有正反序列:x=HHTTHTHHHH 。無論θ的值是多少,這個序列的概率值為
image.png
如果按極大似然估計計算,取對數求導后計算得到θ=0.7,這似乎不太符合我們的常識,如果是用MAP呢?對拋硬幣問題,我們先驗是
(注意MAP中的θ=0.7是隨機變量,先驗是一個分布,不能是一個數值哦,如果給一個數值的話,樣本就不起作用了),因此:
正態分布的概率密度函數:
因此:
在MAP中使用一個高斯分布的先驗的效果就類似于在MLE中采用L2正則(Seurat分析的時候也有),相當于結構風險最小化,可以說,當模型是條件概率分布、損失函數是對數損失函數、模型復雜度由模型的先驗概率表示時,結構風險最小化就等價于最大后驗估計。
回到θ的計算上來,
顯然MAP的計算要麻煩的多,現實中很多問題都要比我們的例子復雜的多,其求解通常不會像我們的例子這樣求導計算。
總結一下:
- MLE是頻率學派的參數估計方法,MAP是貝葉斯學派的參數估計方法,基本思想不同;
- MLE是一種經驗風險最小化,MAP是一種結構風險最小化;
- 在計算上,MAP比MLE多了一個先驗概率項,隨著數據量的增加,先驗的影響力會越來越小;
- MAP對先驗的假設比較依賴,需要有好的先驗假設。
3 極大似然估計求解P(x|c)總結
我們將貝葉斯分類器轉化為了求解P(x|c)的問題,使用極大似然估計是我們介紹的第一個求解方法,它還存在一些不足:
- 對P(x|c)分布的假設強依賴,所假設的概率分布形式需要符合潛在的真實數據分布,這個比較難;
- 對于多個屬性值的樣本,使用極大似然估計計算比較困難。
求解P(x|c)問題的另一個方法:樸素貝葉斯。
根據貝葉斯分類器(1)貝葉斯決策論概述、貝葉斯和頻率、概率和似然,我們對貝葉斯分類器所要解決的問題、問題的求解方法做了概述,將貝葉斯分類問題轉化成了求解P(x|c)的問題,上面我們分析了第一個求解方法:極大似然估計。這里我們來介紹一個更加簡單的P(x|c)求解方法,并在此基礎上講講常用的一個貝葉斯分類器的實現:樸素貝葉斯分類器(Naive Bayes classifier)。
1 樸素貝葉斯分類原理
1.1 分類問題回顧
我們的目標是通過對樣本的學習來得到一個分類器,以此來對未知數據進行分類,即求后驗概率P(x|c)
。在[貝葉斯分類器(1)貝葉斯決策論概述、貝葉斯和頻率、概率和似然】(http://www.lxweimin.com/p/88b6ada7fa0e)中,我們描述了貝葉斯分類器是以生成式模型的思路來處理這個問題的,如下面的公式所示,貝葉斯分類器通過求得聯合概率P(x,c)來計算P(x|c),并將聯合概率P(x,c)轉化成了計算類先驗概率P(c)、類條件概P(x|c)、證據因子P(x)。
其中的難點是類條件概率P(x|c)的計算,因為樣本x本身就是其所有屬性的聯合概率,各種屬性隨意組合,變幻莫測,要計算其中某一種組合出現的概率真的是太難了,而樸素貝葉斯的出現就是為了解決這個問題的。
要想計算聯合概率P(a,b),我們肯定是希望事件a與事件b是相互獨立的,可以簡單粗暴的
1.2 樸素貝葉斯
樸素貝葉斯實現了我們的夢想!樸素貝葉斯中的樸素就是對多屬性的聯合分布做了一個大膽的假設,即x
的n個維度之間相互獨立:
樸素貝葉斯通過這一假設大大簡化了P(x|c)的計算,當然,使用這個假設是有代價的,一般情況下,大量樣本的特征之間獨立這個條件是弱成立的,畢竟哲學上說聯系是普遍的,所以我們使用樸素貝葉斯會降低一些準確性;如果實際問題中的事件的各個屬性非常不獨立的話,甚至是無法使用樸素貝葉斯的。總的來說,樸素貝葉斯大大簡化了計算,同時犧牲了一些結果的準確性,具體要不要使用、怎么使用就看我們在實際問題中的權衡了。
在樸素貝葉斯的思想下再看回分類問題,事件x有m個屬性,可將分類問題按下式轉化:
只需要計算出上式不同類別c下的值,令值最大的類別c<xub>i即為分類結果。其中,根據大數定律,
1.2.1 特征/屬性是離散型隨機變量
-
1)先驗服從多項式分布:假設x的特征取值服從多項式分布,那么同樣根據大數定律,可通過頻率來計算P(xi|c)
image.png
Nc為樣本中類別為c的頻數,Nci*為類別為c的樣本中,第i個屬性中i*出現的頻數。
不過有些出現的概率比較低的屬性,在我們的樣本中不一定會出現,即頻數為0,如果不作處理的話會導致其P(xi|c)為0,會導致包含這個屬性的樣本永遠都不會被分類到類別c,而現實不一定是這樣,因此我們需要對沒出現的情況做平滑處理,比如常見的拉普拉斯平滑,給分子i*的頻數加上一個定值λ,而分母加上a * λ,,表示為第i個屬性中的每一種取值的頻數都加定值λ:
image.png
舉例:垃圾郵件判斷
樸素貝葉斯分類在垃圾郵件的判斷上有不錯的實踐效果,這是一個二分類問題,
現在收到一封郵件包含一些關鍵詞:【中獎,筆記本電腦,特朗普,大選,...】,根據大量的數據可以統計出這些詞出現的頻數,除以類別中所有詞的總頻數得到其出現的后驗概率,在垃圾郵件中:
c = c0時的值是c = c1時值的26倍,所以判斷此郵件是垃圾郵件。
我們判斷西瓜好壞的問題也可以轉化成離散型隨機變量的分類問題,過程與上面類似。
-
2)先驗服從伯努利分布:在x的屬性是離散型隨機變量的分類問題中,如果一個屬性只關注其出現或者不出現,而不關注其在一個樣本內出現的次數,也就是其取值只有0和1,那么我們可以假設這個屬性是服從伯努利分布的(注意:不要求屬性為伯努利分布,只要業務需要,我們可以把它變成伯努利分布,比如對于銷量,我們讓小于100的都是0,大于100的為1)。其后驗概率的計算為:
image.png
比如垃圾郵件的例子,在多項式樸素貝葉斯中:
image.png
如果我們只關心“中獎”出現與否,不管詞頻,則在伯努利樸素貝葉斯中:
image.png
1.2.2 特征/屬性是連續型隨機變量
連續變量離散化,使用多項式分布或伯努利分布:當x的屬性是連續型隨機變量時,如果我們對取值的業務理解較好,一些情況下可以選擇將連續變量離散化,比如在一個商品的分類中,我們根據業務理解把低于100塊的映射到“便宜”,100到200塊的映射到“一般”,高于100塊的映射到“好貴”,這樣就可以轉化為離散變量的問題,這是比較簡單的處理方式,不過對業務理解的要求比較高,而且要求樣本的量不能太少,要保證每個區間有一定的樣本量。
-
假設x** 的連續型屬性服從某種分布,比如正態分布:** P(xi|c)服從正態分布,其中參數μ通過類別為c的所有樣本中屬性xi的各種取值的平均得到,參數σ同理,通過樣本的標準差得到,以此概率密度函數來計算P(xi=xi*|c)。
image
舉例:性別判斷
下面是一組人類身體特征的統計資料。
有人身高6英尺、體重130磅,腳掌8英寸,判斷此人性別:
各屬性為連續變量,假設男性和女性的身高、體重、腳掌都是正態分布,通過樣本計算出均值和方差。男性的身高是均值5.855、方差0.035的正態分布。所以,例如男性的身高為6英尺的概率的相對值等于1.5789(密度函數的值,并不是概率,只用來反映各個值的相對可能性)。
分布確定后,就可以計算性別的分類了:
女性的概率比男性要高出將近10000倍,所以判斷該人為女性。
1.3 樸素貝葉斯分類的平滑方法
在前文1.2.1小節中我們已經提過平滑處理,主要針對于那些在樣本中沒有出現過的詞,它們的概率是0,導致在分類中完全沒有存在感,所以要對這些進行平滑處理。
平滑處理的方法也有很多種,包括我們上面說過的拉普拉斯平滑,除此之外還有古德圖靈平滑,線性插值法,回退法(K-Z回退)等,不過這些方法在自然語言處理中比較常用,我們暫時先不多介紹了,還是聚焦在樸素貝葉斯上,下面我們看看樸素貝葉斯在sklearn中的實現。
2 樸素貝葉斯的sklearn實現
sklearn中有3種常用的不同類型的樸素貝葉斯:
- 高斯分布型 (Gaussian NB):用于上面所說的連續型變量的分類問題,假定屬性/特征服從正態分布;
- 多項式型 (Multinomial NB):用于離散值模型里。比如我們在1.2.1中的例子;
- 伯努利型 (Bernoulli NB):用于離散值模型里,最后得到的特征只有0(沒出現)和1(出現過)。
1)高斯分布型樸素貝葉斯
sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)
Parameters
priors:array-like of shape (n_classes,)
類別的先驗概率,如果指定,則不再根據數據計算調整
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)) # 增量訓練
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]])) # 輸出對數概率
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.
其常用函數與高斯型一樣。
>> 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.(用于設置二值化的閾值)
官方例子與多項式型的基本一樣,而且也沒有設置binarize,相當于默認使用binarize=0.0,根據源碼 sklearn/preprocessing/_data.py
中的binarize(X, *, threshold=0.0, copy=True)函數可以發現,大于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 樸素貝葉斯總結
優點
- 樸素貝葉斯算法假設了數據集屬性之間是相互獨立的,因此算法的邏輯性十分簡單,并且算法較為穩定,當數據呈現不同的特點時,樸素貝葉斯的分類性能不會有太大的差異;
- 當數據集屬性之間的關系相對比較獨立時,樸素貝葉斯分類算法會有較好的效果;
- 數據量要求不大,適合增量式訓練,能直接處理多分類;
- 算法簡單直觀,具有很好的可解釋性,可以直接輸出概率。
缺點
- 屬性獨立性的條件也是樸素貝葉斯的不足之處,數據集屬性的獨立性在很多情況下很難滿足;
- 需要知道先驗概率,且先驗概率很多時候也是取決于假設,故對假設的合理性較為依賴。
可見,樸素貝葉斯的缺點很大程度來來源于其假設太強,對于其假設符合程度較低的問題會損失較多的準確性,因此,如果我們能把假設弱化一下,是不是就能提高樸素貝葉斯的性能呢?需要我們來繼續探索。