1. 程式人生 > >sklearn文件 — 1.9. 樸素貝葉斯

sklearn文件 — 1.9. 樸素貝葉斯

這個樸素貝葉斯方法是一組基於貝葉斯理論的監督學習演算法,其對每個特徵對都定義了一個"簡單"假設。對給定的類變數 y 和獨立的特徵向量 x1 xn ,貝葉斯理論的關係如下所示:


使用樸素的獨立假設後:


對全體 i 而言,其等式又能簡化為:


因為 P(x1, ..., xn) 在給定輸入時,它的值就已經固定不變了,所以可以使用下列的分類規則:


然後我們使用最大先驗(MAP, Maximum A Posteriori)估計器來估計 P(y) P(xi | y) 的值。前者對後者來說,表示的是在訓練集中,類 y 出現的相對頻率。

不同的貝葉斯分類器的不同點在於,它們各自對 P(xi | y)

分佈有著不同的假設。

儘管上面的假設有點過於簡化了,但是樸素貝葉斯分類器卻能夠很好的作用於現實場景,例如著名的文件分類和垃圾郵件過濾等功能。它們只需要小部分的訓練集就能夠估計出必要的引數的值.(如果想要知道貝葉斯的原理和它需要的資料型別的話,可以參考下方的引用)

樸素貝葉斯學習器和分類器能夠極其快速地適應大多複雜的方法。類條件特徵分佈的解耦意味著每一個分佈能夠獨立的被估計成一個一維分佈。而這一點能夠有效的應對由於"維度詛咒"所引起的問題。

在另一方面,儘管樸素貝葉斯作為一個出色的分類器很出名,但是它作為一個很糟糕的估計器也是很出名,所以在實際應用上,不要太過於注重函式 predict_proba

的輸出值。

1.9.1. 高斯樸素貝葉斯

GaussianNB 實現了用於分類的高斯樸素貝葉斯,其將特徵的似然假定成高斯:


引數 σy μy 的值是使用最大似然來估計出的。

>>> 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 實現了用於處理多項式分佈的資料的樸素貝葉斯演算法,並且這種演算法屬於用於文字分類的貝葉斯經典的兩種變種演算法之一(一般是用詞向量技術來表示原始資料,不過用 tf-idf 向量來表示也有比較好的表現)。這個模型的分佈會通過向量( θy = θy1, ..., θyn )來為每一類 y 進行引數化,其中 n 為特徵的數量(在文字分類中應為詞彙的大小), θyi 表示特徵 i 表現為屬於類 y 的概率。

引數 θy 由一個平滑版本的最大似然來估計出的。例如相對頻率計數:


其中 Nyi = Σ(χ∈T)·xi 是一個在訓練集 T 中,特徵 i 出現在類 y 的次數,然後 Ny = Σ(i = 1)^(|T|)·(Nyi) 則是在每個 y 類中,所有特徵的總出現次數。

然後平滑先驗 α >= 0 則會根據考慮到沒在訓練樣本出現的特徵來防止在後續計算中出現零概率的可能性。當 α = 1 時這個平滑過程就是拉普拉斯平滑,而 α < 1 的平滑則叫做Lidstone平滑。

1.9.3. 伯努利樸素貝葉斯

BernoulliNB 實現了對有多項式伯努利分佈的資料的NB訓練和分類演算法。即存在多個以二進位制變數(Bernoulli, boolean)所定義的特徵值。也正因為如此,這個類需要特徵以二進位制向量的方式來表示;如果存在非二進位制型別的特徵, BernoulliNB 也會試圖將其變成二進位制(不過還是取決於 binarize 引數的設定)。

伯努利樸素貝葉斯的決策規則基於下列公式:


這一公式與多項式NB的不同點在於,這公式明確地對特徵 i 的不出現進行了懲罰,而多項式的該公式變體則只會簡單的忽略沒出現的特徵。

在文字分類中,可以用詞頻向量(而不是詞數向量)來訓練和使用這個分類器。BernoulliNB 會在一些資料集上有更好的表現,特別是那些短篇文章。不過時間允許的話,還是建議分別對這兩種模型來做評估以選擇更符合條件的那個。

引用

1.9.4. 超核樸素貝葉斯模型的擬合過程

樸素貝葉斯模型能夠用來解決擁有難以存入記憶體的資料集的大規模分類問題。為了解決這一問題,MultinomialNB, BernoulliNB, 和 GaussianNB 提供了一個 partial_fit 方法,可以跟其他分類器一樣增量地使用,例如文件的超核分類所示。

fit 函式相反,第一次呼叫 partial_fit 函式時需要傳入所有可預見的類標籤列表。

如果要知道更多在scikit-learn中關於可用策略的描述的話,可以參考這篇 out-of-core learning 文件。

注意:
因為樸素貝葉斯模型裡的 partial_fit 方法存在一些計算開銷,所以在每次操作的時候,在記憶體(RAM)允許的情況下,儘可能的擴大資料塊的大小以減少多次呼叫所產生的額外開銷。