朴素贝叶斯分类器

**單純貝氏分類器**（英語：Naive Bayes classifier，中國大陸稱為**樸素貝葉斯分類器**），在機器學習中是一系列以假設特徵之間強（樸素）獨立下運用貝氏定理為基礎的簡單機率分類器。

單純貝氏自 1950 年代已廣泛研究，在 1960 年代初就以另外一個名稱引入到文字資訊檢索界中， 並仍然是文字分類的一種熱門（基準）方法，文字分類是以詞頻為特徵判斷檔案所屬類別或其他（如垃圾郵件、合法性、體育或政治等等）的問題。通過適當的預處理，它可以與這個領域更先進的方法（包括支持向量機）相競爭。 它在自動醫療診斷中也有應用。

單純貝氏分類器是高度可延伸的，因此需要數量與學習問題中的變數（特徵 / 預測器）成線性關係的參數。最大概似訓練可以通過評估一個封閉形式的表達式來完成， 只需花費線性時間，而不需要其他很多類型的分類器所使用的費時的迭代逼近。

在統計學和電腦科學文獻中，單純貝氏模型有各種名稱，包括**簡單貝氏**和**獨立貝氏**。 所有這些名稱都參考了貝氏定理在該分類器的決策規則中的使用，但單純貝氏不（一定）用到貝氏方法； 《Russell 和 Norvig》提到「『單純貝氏』有時被稱為**貝氏分類器**，這個馬虎的使用促使真正的貝氏論者稱之為**傻瓜貝氏**模型。」

## 簡介

單純貝氏是一種建分類器的簡單方法。該分類器模型會給問題實例分配用特徵值表示的類標籤，類標籤取自有限集合。它不是訓練這種分類器的單一演算法，而是一系列基於相同原理的演算法：所有單純貝氏分類器都假定樣本每個特徵與其他特徵都不相關。舉個例子，如果一種水果其具有紅，圓，直徑大概 3 英寸等特徵，該水果可以被判定為是蘋果。儘管這些特徵相互依賴或者有些特徵由其他特徵決定，然而單純貝氏分類器認為這些屬性在判定該水果是否為蘋果的機率分布上獨立的。

對於某些類型的機率模型，在監督式學習的樣本集中能取得得非常好的分類效果。在許多實際應用中，單純貝氏模型參數估計使用最大概似估計方法；換而言之，在不用到貝氏機率或者任何貝氏模型的情況下，單純貝氏模型也能奏效。

儘管是帶著這些樸素思想和過於簡單化的假設，但單純貝氏分類器在很多複雜的現實情形中仍能夠取得相當好的效果。2004 年，一篇分析貝氏分類器問題的文章揭示了單純貝氏分類器取得看上去不可思議的分類效果的若干理論上的原因。 儘管如此，2006 年有一篇文章詳細比較了各種分類別方法，發現更新的方法（如決策樹和隨機森林）的效能超過了貝氏分類器。

單純貝氏分類器的一個優勢在於只需要根據少量的訓練資料估計出必要的參數（變數的均值和變異數）。由於變數獨立假設，只需要估計各個變數的方法，而不需要確定整個共變異數矩陣。

## 單純貝氏機率模型

理論上，機率模型分類器是一個條件機率模型。

　
: $p(C\vert F_{1},\dots ,F_{n})\,$

獨立的類別變數 $C$ 有若干類別，條件依賴於若干特徵變數 $F_{1}$ , $F_{2}$ ,..., $F_{n}$ 。但問題在於如果特徵數量 $n$ 較大或者每個特徵能取大量值時，基於機率模型列出機率表變得不現實。所以我們修改這個模型使之變得可行。
貝氏定理有以下式子：

　
: $p(C\vert F_{1},\dots ,F_{n})={\frac {p(C)\ p(F_{1},\dots ,F_{n}\vert C)}{p(F_{1},\dots ,F_{n})}}.\,$

用樸素的語言可以表達為：

　
: ${\mbox{posterior}}={\frac {{\mbox{prior}}\times {\mbox{likelihood}}}{\mbox{evidence}}}.\,$

實際中，我們只關心分式中的分子部分，因為分母不依賴於 $C$ 而且特徵 $F_{i}$ 的值是給定的，於是分母可以認為是一個常數。這樣分子就等價於聯合分布模型。

　
: $p(C,F_{1},\dots ,F_{n})\,$

重複使用連鎖律，可將該式寫成條件機率的形式，如下所示：

　
: $p(C,F_{1},\dots ,F_{n})\,$

　
: $\varpropto p(C)\ p(F_{1},\dots ,F_{n}\vert C)$

　
: $\varpropto p(C)\ p(F_{1}\vert C)\ p(F_{2},\dots ,F_{n}\vert C,F_{1})$

　
: $\varpropto p(C)\ p(F_{1}\vert C)\ p(F_{2}\vert C,F_{1})\ p(F_{3},\dots ,F_{n}\vert C,F_{1},F_{2})$

　
: $\varpropto p(C)\ p(F_{1}\vert C)\ p(F_{2}\vert C,F_{1})\ p(F_{3}\vert C,F_{1},F_{2})\ p(F_{4},\dots ,F_{n}\vert C,F_{1},F_{2},F_{3})$

　
: $\varpropto p(C)\ p(F_{1}\vert C)\ p(F_{2}\vert C,F_{1})\ p(F_{3}\vert C,F_{1},F_{2})\ \dots p(F_{n}\vert C,F_{1},F_{2},F_{3},\dots ,F_{n-1}).$

現在「樸素」的條件獨立假設開始發揮作用：假設每個特徵 $F_{i}$ 對於其他特徵 $F_{j}$ , $j\neq i$ 是條件獨立的。這就意味著

　
: $p(F_{i}\vert C,F_{j})=p(F_{i}\vert C)\,$

對於 $i\neq j$ ，所以聯合分布模型可以表達為

　
: ${\begin{aligned}p(C\vert F_{1},\dots ,F_{n})&\varpropto p(C,F_{1},\dots ,F_{n})\\&\varpropto p(C)\ p(F_{1}\vert C)\ p(F_{2}\vert C)\ p(F_{3}\vert C)\ \cdots \,\\&\varpropto p(C)\prod _{i=1}^{n}p(F_{i}\vert C).\,\end{aligned}}$

這意味著上述假設下，類別變數 $C$ 的條件分布可以表達為：

　
: $p(C\vert F_{1},\dots ,F_{n})={\frac {1}{Z}}p(C)\prod _{i=1}^{n}p(F_{i}\vert C)$

其中 $Z$ （證據因子）是一個只依賴與 $F_{1},\dots ,F_{n}$ 等的縮放因子，當特徵變數的值已知時是一個常數。
由於分解成所謂的類事前機率 $p(C)$ 和獨立機率分布 $p(F_{i}\vert C)$ ，上述機率模型的可掌控性得到很大的提高。如果這是一個 $k$ 分類問題，且每個 $p(F_{i}\vert C=c)$ 可以表達為 $r$ 個參數，於是相應的單純貝氏模型有 (_k_ − 1) + _n_ _r_ _k_ 個參數。實際應用中，通常取 $k=2$ （二分類問題）， $r=1$ （伯努利分布作為特徵），因此模型的參數個數為 $2n+1$ ，其中 $n$ 是二值分類特徵的個數。

### 從機率模型中構造分類器

討論至此為止我們匯出了獨立分布特徵模型，也就是單純貝氏機率模型。單純貝氏分類器包括了這種模型和相應的決策規則。一個普通的規則就是選出最有可能的那個：這就是大家熟知的最大事後機率（MAP）決策準則。相應的分類器便是如下定義的 $\mathrm {classify} $ 公式：

　
: $\mathrm {classify} (f_{1},\dots ,f_{n})={\underset {c}{\operatorname {argmax} }}\ p(C=c)\displaystyle \prod _{i=1}^{n}p(F_{i}=f_{i}\vert C=c).$

## 參數估計

所有的模型參數都可以通過訓練集的相關頻率來估計。常用方法是機率的最大概似估計。類的事前機率可以通過假設各類等機率來計算（事前機率 = 1 / (類的數量)），或者通過訓練集的各類樣本出現的次數來估計（A 類事前機率 =（A 類樣本的數量）/(樣本總數)）。為了估計特徵的分布參數，我們要先假設訓練集資料滿足某種分布或者無母數模型。

### 高斯單純貝氏

如果要處理的是連續資料一種通常的假設是這些連續數值為高斯分布。
例如，假設訓練集中有一個連續屬性， $x$ 。我們首先對資料根據類別分類，然後計算每個類別中 $x$ 的均值和變異數。令 $\mu _{c}$ 表示為 $x$ 在 _c_ 類上的均值，令 $\sigma _{c}^{2}$ 為 $x$ 在 _c_ 類上的變異數。在給定類中某個值的機率， $P(x=v|c)$ ，可以通過將 $v$ 表示為均值為 $\mu _{c}$ 變異數為 $\sigma _{c}^{2}$ 常態分布計算出來。如下， $P(x=v|c)={\tfrac {1}{\sqrt {2\pi \sigma _{c}^{2}}}}\,e^{-{\frac {(v-\mu _{c})^{2}}{2\sigma _{c}^{2}}}}$ 處理連續數值問題的另一種常用的技術是通過離散化連續數值的方法。通常，當訓練樣本數量較少或者是精確的分布已知時，通過機率分布的方法是一種更好的選擇。在大量樣本的情形下離散化的方法表現更優，因為大量的樣本可以學習到資料的分布。由於單純貝氏是一種典型的用到大量樣本的方法（越大計算量的模型可以產生越高的分類精確度），所以單純貝氏方法都用到離散化方法，而不是機率分布估計的方法。

## 樣本修正

如果一個給定的類和特徵值在訓練集中沒有一起出現過，那麼基於頻率的估計下該機率將為 0。這將是一個問題。因為與其他機率相乘時將會把其他機率的資訊統統去除。所以常常要求要對每個小類樣本的機率估計進行修正，以保證不會出現有為 0 的機率出現。

## 討論

儘管實際上獨立假設常常是不準確的，但單純貝氏分類器的若干特性讓其在實踐中能夠取得令人驚奇的效果。特別地，各類條件特徵之間的解耦意味著每個特徵的分布都可以獨立地被當做一維分布來估計。這樣減輕了由於維數災帶來的阻礙，當樣本的特徵個數增加時就不需要使樣本規模呈指數增長。然而單純貝氏在大多數情況下不能對類機率做出非常準確的估計，但在許多應用中這一點並不要求。例如，單純貝氏分類器中，依據最大事後機率決策規則只要正確類的事後機率比其他類要高就可以得到正確的分類。所以不管機率估計輕度的甚至是嚴重的不精確都不影響正確的分類結果。在這種方式下，分類器可以有足夠的強健性去忽略單純貝氏機率模型上存在的缺陷。

## 實例

### 性別分類

問題描述：通過一些測量的特徵，包括身高、體重、腳的尺寸，判定一個人是男性還是女性。

#### 訓練

訓練資料如下：

假設訓練集樣本的特徵滿足高斯分布，得到下表：

我們認為兩種類別是等機率的，也就是 P (male)= P (female) = 0.5。在沒有做辨識的情況下就做這樣的假設並不是一個好的點子。但我們通過資料集中兩類樣本出現的頻率來確定 P (C)，我們得到的結果也是一樣的。

#### 測試

以下給出一個待分類是男性還是女性的樣本。

我們希望得到的是男性還是女性哪類的事後機率大。男性的事後機率通過下面式子來求取

　
: $posterior(male)={\frac {P(male)\,p(height|male)\,p(weight|male)\,p(footsize|male)}{evidence}}$

女性的事後機率通過下面式子來求取

　
: $posterior(female)={\frac {P(female)\,p(height|female)\,p(weight|female)\,p(footsize|female)}{evidence}}$

證據因子（通常是常數）用來對各類的事後機率之和進行歸一化.

　
: $evidence=P(male)\,p(height|male)\,p(weight|male)\,p(footsize|male)+P(female)\,p(height|female)\,p(weight|female)\,p(footsize|female)$

證據因子是一個常數（在常態分布中通常是正數），所以可以忽略。接下來我們來判定這樣樣本的性別。

　
: $P(male)=0.5$

 $p({\mbox{height}}|{\mbox{male}})={\frac {1}{\sqrt {2\pi \sigma ^{2}}}}\exp \left({\frac {-(6-\mu )^{2}}{2\sigma ^{2}}}\right)\approx 1.5789$ , 其中 $\mu =5.855$ ， $\sigma ^{2}=3.5033e^{-02}$ 是訓練集樣本的常態分布參數。注意，這裡的值大於 1 也是允許的 – 這裡是機率密度而不是機率，因為身高是一個連續的變數.

　
: $p(weight|male)=5.9881e^{-06}$

　
: $p(footsize|male)=1.3112e^{-3}$

　
: $posteriornumerator(male)=6.1984e^{-09}$

　
: $P(female)=0.5$

　
: $p(height|female)=2.2346e^{-1}$

　
: $p(weight|female)=1.6789e^{-2}$

　
: $p(footsize|female)=2.8669e^{-1}$

　
: $posteriornumerator(female)=5.3778e^{-04}$

由於女性事後機率的分子比較大，所以我們預計這個樣本是女性。

### 文字分類

這是一個用單純貝氏分類做的一個文字分類問題的例子。考慮一個基於內容的文字分類問題，例如判斷郵件是否為垃圾郵件。想像文字可以分成若干的類別，首先文字可以被一些單詞集標註，而這個單詞集是獨立分布的，在給定的 C 類文字中第 i 個單詞出現的機率可以表示為：

　
: $p(w_{i}\vert C)\,$

（通過這種處理，我們進一步簡化了工作，假設每個單詞是在文中是隨機分布的 - 也就是單詞不依賴於文字的長度，與其他詞出現在文中的位置，或者其他文字內容。）

所以，對於一個給定類別 _C_，文字 _D_ 包含所有單詞 $w_{i}$ 的機率是:

　
: $p(D\vert C)=\prod _{i}p(w_{i}\vert C)\,$

我們要回答的問題是「文件 _D_ 屬於類 _C_ 的機率是多少？」換而言之 $p(C\vert D)\,$ 是多少？
現在定義

　
: $p(D\vert C)={p(D\cap C) \over p(C)}$

　
: $p(C\vert D)={p(D\cap C) \over p(D)}$

通過貝氏定理將上述機率處理成概似度的形式

　
: $p(C\vert D)={p(C) \over p(D)}\,p(D\vert C)$

**假設現在只有兩個相互獨立的類別，_S_ 和 ¬_S_（垃圾郵件和非垃圾郵件），這裡每個元素（郵件）要麼是垃圾郵件，要麼就不是。**

　
: $p(D\vert S)=\prod _{i}p(w_{i}\vert S)\,$

　
: $p(D\vert \neg S)=\prod _{i}p(w_{i}\vert \neg S)\,$

 
用上述貝氏的結果，可以寫成

　
: $p(S\vert D)={p(S) \over p(D)}\,\prod _{i}p(w_{i}\vert S)$

　
: $p(\neg S\vert D)={p(\neg S) \over p(D)}\,\prod _{i}p(w_{i}\vert \neg S)$

兩者相除:

　
: ${p(S\vert D) \over p(\neg S\vert D)}={p(S)\,\prod _{i}p(w_{i}\vert S) \over p(\neg S)\,\prod _{i}p(w_{i}\vert \neg S)}$

整理得:

　
: ${p(S\vert D) \over p(\neg S\vert D)}={p(S) \over p(\neg S)}\,\prod _{i}{p(w_{i}\vert S) \over p(w_{i}\vert \neg S)}$

這樣機率比 p (_S_ | _D_) / p(¬_S_ | _D_) 可以表達為概似比。實際的機率 p (_S_ | _D_) 可以很容易通過 log (p (_S_ | _D_) / p(¬_S_ | _D_)) 計算出來，基於 p (_S_ | _D_) + p(¬_S_ | _D_) = 1。

結合上面所討論的機率比，可以得到：

　
: $\ln {p(S\vert D) \over p(\neg S\vert D)}=\ln {p(S) \over p(\neg S)}+\sum _{i}\ln {p(w_{i}\vert S) \over p(w_{i}\vert \neg S)}$

(這種對數概似比的技術在統計中是一種常用的技術。在這種兩個獨立的分類情況下（如這個垃圾郵件的例子），把對數概似比轉化為 S 曲線的形式)。

最後文字可以分類，當 $p(S\vert D)>p(\neg S\vert D)$ 或者 $\ln {p(S\vert D) \over p(\neg S\vert D)}>0$ 時判定為垃圾郵件，否則為正常郵件。

## 參見

## 參考文獻

## 延伸閱讀

* Domingos, Pedro; Pazzani, Michael. On the optimality of the simple Bayesian classifier under zero-one loss. Machine Learning. 1997, **29**: 103–137 [2012-04-01]. （原始內容存檔於 2008-04-18）.
* Webb, G. I.; Boughton, J.; Wang, Z. Not So Naive Bayes: Aggregating One-Dependence Estimators. Machine Learning (Springer). 2005, **58** (1): 5–24. doi:10.1007/s10994-005-4258-6.
* Mozina, M.; Demsar, J.; Kattan, M.; Zupan, B. Nomograms for Visualization of Naive Bayesian Classifier (PDF). Proc. PKDD-2004: 337–348. 2004.
* Maron, M. E. Automatic Indexing: An Experimental Inquiry. JACM. 1961, **8** (3): 404–417. doi:10.1145/321075.321084.
* Minsky, M. Steps toward Artificial Intelligence. Proc. IRE **49** (1): 8–30. 1961.

## 外部連結

* Book Chapter: Naive Bayes text classification, Introduction to Information Retrieval （頁面存檔備份，存於網際網路檔案館）
* Naive Bayes for Text Classification with Unbalanced Classes （頁面存檔備份，存於網際網路檔案館）
* Benchmark results of Naive Bayes implementations （頁面存檔備份，存於網際網路檔案館）
* Hierarchical Naive Bayes Classifiers for uncertain data （頁面存檔備份，存於網際網路檔案館） (an extension of the Naive Bayes classifier).

**軟體**

* Naive Bayes classifiers are available in many general-purpose machine learning and NLP packages, including Apache Mahout, Mallet （頁面存檔備份，存於網際網路檔案館）, NLTK, Orange, scikit-learn and Weka.
* IMSL Numerical Libraries Collections of math and statistical algorithms available in C/C++, Fortran, Java and C#/.NET. Data mining routines in the IMSL Libraries include a Naive Bayes classifier.
* Winnow content recommendation Open source Naive Bayes text classifier works with very small training and unbalanced training sets. High performance, C, any Unix.
* An interactive Microsoft Excel spreadsheet Naive Bayes implementation using VBA (requires enabled macros) with viewable source code.
* jBNC - Bayesian Network Classifier Toolbox （頁面存檔備份，存於網際網路檔案館）
* Statistical Pattern Recognition Toolbox for Matlab （頁面存檔備份，存於網際網路檔案館）.
* ifile （頁面存檔備份，存於網際網路檔案館） - the first freely available (Naive) Bayesian mail/spam filter
* NClassifier （頁面存檔備份，存於網際網路檔案館） - NClassifier is a .NET library that supports text classification and text summarization. It is a port of Classifier4J.
* Classifier4J （頁面存檔備份，存於網際網路檔案館） - Classifier4J is a Java library designed to do text classification. It comes with an implementation of a Bayesian classifier.