# 1.9. 樸素貝葉斯
校驗者:
[@Kyrie](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@TWITCH](https://github.com/apachecn/scikit-learn-doc-zh)
樸素貝葉斯方法是基于貝葉斯定理的一組有監督學習算法,即“簡單”地假設每對特征之間相互獨立。 給定一個類別  和一個從  到  的相關的特征向量, 貝葉斯定理闡述了以下關系:

使用簡單(naive)的假設-每對特征之間都相互獨立:

對于所有的 :math: i ,這個關系式可以簡化為

由于在給定的輸入中  是一個常量,我們使用下面的分類規則:

我們可以使用最大后驗概率(Maximum A Posteriori, MAP) 來估計  和  ; 前者是訓練集中類別  的相對頻率。
各種各樣的的樸素貝葉斯分類器的差異大部分來自于處理  分布時的所做的假設不同。
盡管其假設過于簡單,在很多實際情況下,樸素貝葉斯工作得很好,特別是文檔分類和垃圾郵件過濾。這些工作都要求 一個小的訓練集來估計必需參數。(至于為什么樸素貝葉斯表現得好的理論原因和它適用于哪些類型的數據,請參見下面的參考。)
相比于其他更復雜的方法,樸素貝葉斯學習器和分類器非常快。 分類條件分布的解耦意味著可以獨立單獨地把每個特征視為一維分布來估計。這樣反過來有助于緩解維度災難帶來的問題。
另一方面,盡管樸素貝葉斯被認為是一種相當不錯的分類器,但卻不是好的估計器(estimator),所以不能太過于重視從 `predict_proba` 輸出的概率。
參考文獻:
- H. Zhang (2004). [The optimality of Naive Bayes.](http://www.cs.unb.ca/~hzhang/publications/FLAIRS04ZhangH.pdf)Proc. FLAIRS.
## 1.9.1. 高斯樸素貝葉斯
[`GaussianNB`](generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB "sklearn.naive_bayes.GaussianNB") 實現了運用于分類的高斯樸素貝葉斯算法。特征的可能性(即概率)假設為高斯分布:

參數  和  使用最大似然法估計。
```
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> from sklearn.naive_bayes import GaussianNB
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
>>> print("Number of mislabeled points out of a total %d points : %d"
... % (iris.data.shape[0],(iris.target != y_pred).sum()))
Number of mislabeled points out of a total 150 points : 6
```
## 1.9.2. 多項分布樸素貝葉斯
[`MultinomialNB`](generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB "sklearn.naive_bayes.MultinomialNB") 實現了服從多項分布數據的樸素貝葉斯算法,也是用于文本分類(這個領域中數據往往以詞向量表示,盡管在實踐中 tf-idf 向量在預測時表現良好)的兩大經典樸素貝葉斯算法之一。 分布參數由每類  的  向量決定, 式中  是特征的數量(對于文本分類,是詞匯量的大小)  是樣本中屬于類  中特征  概率  。
參數  使用平滑過的最大似然估計法來估計,即相對頻率計數:

式中  是 訓練集  中 特征  在類  中出現的次數, 是類  中出現所有特征的計數總和。先驗平滑因子  應用于在學習樣本中沒有出現的特征,以防在將來的計算中出現0概率輸出。 把  被稱為拉普拉斯平滑(Lapalce smoothing),而  被稱為利德斯通(Lidstone smoothing)。
>
## 1.9.3. 伯努利樸素貝葉斯
[`BernoulliNB`](generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB "sklearn.naive_bayes.BernoulliNB") 實現了用于多重伯努利分布數據的樸素貝葉斯訓練和分類算法,即有多個特征,但每個特征 都假設是一個二元 (Bernoulli, boolean) 變量。 因此,這類算法要求樣本以二元值特征向量表示;如果樣本含有其他類型的數據, 一個 `BernoulliNB` 實例會將其二值化(取決于 `binarize` 參數)。
伯努利樸素貝葉斯的決策規則基于

與多項分布樸素貝葉斯的規則不同 伯努利樸素貝葉斯明確地懲罰類  中沒有出現作為預測因子的特征  ,而多項分布分布樸素貝葉斯只是簡單地忽略沒出現的特征。
在文本分類的例子中,詞頻向量(word occurrence vectors)(而非詞數向量(word count vectors))可能用于訓練和用于這個分類器。 `BernoulliNB` 可能在一些數據集上可能表現得更好,特別是那些更短的文檔。 如果時間允許,建議對兩個模型都進行評估。
參考文獻:
- C.D. Manning, P. Raghavan and H. Schütze (2008). Introduction to Information Retrieval. Cambridge University Press, pp. 234-265.
- A. McCallum and K. Nigam (1998). [A comparison of event models for Naive Bayes text classification.](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1529)Proc. AAAI/ICML-98 Workshop on Learning for Text Categorization, pp. 41-48.
- V. Metsis, I. Androutsopoulos and G. Paliouras (2006). [Spam filtering with Naive Bayes – Which Naive Bayes?](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.61.5542)3rd Conf. on Email and Anti-Spam (CEAS).
## 1.9.4. 堆外樸素貝葉斯模型擬合
樸素貝葉斯模型可以解決整個訓練集不能導入內存的大規模分類問題。 為了解決這個問題, [`MultinomialNB`](generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB "sklearn.naive_bayes.MultinomialNB"), [`BernoulliNB`](generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB "sklearn.naive_bayes.BernoulliNB"), 和 [`GaussianNB`](generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB "sklearn.naive_bayes.GaussianNB") 實現了 `partial_fit` 方法,可以動態的增加數據,使用方法與其他分類器的一樣,使用示例見 [Out-of-core classification of text documents](../auto_examples/applications/plot_out_of_core_classification.html#sphx-glr-auto-examples-applications-plot-out-of-core-classification-py) 。所有的樸素貝葉斯分類器都支持樣本權重。
與 `fit` 方法不同,首次調用 `partial_fit` 方法需要傳遞一個所有期望的類標簽的列表。
對于 scikit-learn 中可用方案的概覽,另見 [out-of-core learning](scaling_strategies.html#scaling-strategies) 文檔。
所有樸素貝葉斯模型調用 `partial_fit` 都會引入一些計算開銷。推薦讓數據快越大越好,其大小與 RAM 中可用內存大小相同。
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話