1.9. 樸素貝氏#

樸素貝氏方法是一組監督式學習演算法,基於應用貝氏定理,並假設在給定類別變數的值下,每對特徵之間都具有「樸素」的條件獨立性。貝氏定理指出以下關係,給定類別變數 \(y\) 和相關特徵向量 \(x_1\)\(x_n\)

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots, x_n \mid y)} {P(x_1, \dots, x_n)}\]

使用樸素的條件獨立性假設,即

\[P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),\]

對於所有 \(i\),此關係簡化為

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)}\]

由於 \(P(x_1, \dots, x_n)\) 在給定輸入的情況下是常數,因此我們可以使用以下分類規則

\[ \begin{align}\begin{aligned}P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)\\\Downarrow\\\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y),\end{aligned}\end{align} \]

並且我們可以使用最大後驗機率 (MAP) 估計來估計 \(P(y)\)\(P(x_i \mid y)\);前者是類別 \(y\) 在訓練集中出現的相對頻率。

不同的樸素貝氏分類器主要差異在於它們對 \(P(x_i \mid y)\) 分佈所做的假設。

儘管它們的假設明顯過於簡化,但樸素貝氏分類器在許多現實情況中都表現良好,最著名的是文件分類和垃圾郵件過濾。它們需要少量的訓練資料來估計必要的參數。(關於樸素貝氏為何運作良好以及適用於哪種類型資料的理論原因,請參閱下面的參考文獻。)

與更複雜的方法相比,樸素貝氏學習器和分類器速度可能非常快。類別條件特徵分佈的解耦意味著每個分佈都可以獨立地估計為一維分佈。這反過來有助於緩解因維度災難而引起的問題。

另一方面,儘管樸素貝氏被認為是一個不錯的分類器,但已知它是一個糟糕的估計器,因此不應過於認真看待 predict_proba 的機率輸出。

參考文獻#

1.9.1. 高斯樸素貝氏#

GaussianNB 實作高斯樸素貝氏分類演算法。假設特徵的似然性為高斯分佈

\[P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)\]

參數 \(\sigma_y\)\(\mu_y\) 使用最大似然估計。

>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.naive_bayes import GaussianNB
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(X_train, y_train).predict(X_test)
>>> print("Number of mislabeled points out of a total %d points : %d"
...       % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4

1.9.2. 多項式樸素貝氏#

MultinomialNB 實作適用於多項式分佈資料的樸素貝氏演算法,並且是文字分類中使用的兩個經典樸素貝氏變體之一(其中資料通常表示為詞向量計數,儘管已知 tf-idf 向量在實務中也能很好地運作)。分佈由每個類別 \(y\) 的向量 \(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\) 參數化,其中 \(n\) 是特徵的數量(在文字分類中,詞彙表的大小),而 \(\theta_{yi}\) 是在屬於類別 \(y\) 的樣本中,特徵 \(i\) 出現的機率 \(P(x_i \mid y)\)

參數 \(\theta_y\) 由最大似然的平滑版本估計,即相對頻率計數

\[\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}\]

其中 \(N_{yi} = \sum_{x \in T} x_i\) 是特徵 \(i\) 在訓練集 \(T\) 中類別 \(y\) 的所有樣本中出現的次數,而 \(N_{y} = \sum_{i=1}^{n} N_{yi}\) 是類別 \(y\) 的所有特徵的總計數。

平滑先驗 \(\alpha \ge 0\) 考慮學習樣本中不存在的特徵,並防止進一步計算中出現零機率。設定 \(\alpha = 1\) 稱為拉普拉斯平滑,而 \(\alpha < 1\) 稱為利德斯通平滑。

1.9.3. 互補樸素貝氏#

ComplementNB 實作互補樸素貝氏 (CNB) 演算法。CNB 是標準多項式樸素貝氏 (MNB) 演算法的改編版本,特別適用於不平衡的資料集。具體而言,CNB 使用每個類別的互補統計資料來計算模型的權重。CNB 的發明者經驗性地表明,CNB 的參數估計比 MNB 的參數估計更穩定。此外,CNB 在文字分類任務中通常優於 MNB(通常有相當大的差距)。

權重計算#

計算權重的程序如下

\[ \begin{align}\begin{aligned}\hat{\theta}_{ci} = \frac{\alpha_i + \sum_{j:y_j \neq c} d_{ij}} {\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}}\\w_{ci} = \log \hat{\theta}_{ci}\\w_{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|}\end{aligned}\end{align} \]

其中總和是對所有不在類別 \(c\) 中的文件 \(j\) 進行的,\(d_{ij}\) 是詞語 \(i\) 在文件 \(j\) 中的計數或 tf-idf 值,\(\alpha_i\) 是一個平滑超參數,類似於 MNB 中使用的,而 \(\alpha = \sum_{i} \alpha_i\)。第二個正規化解決了較長的文件在 MNB 中主導參數估計的趨勢。分類規則為

\[\hat{c} = \arg\min_c \sum_{i} t_i w_{ci}\]

也就是說,一個文件被分配到最差的補集匹配的類別。

參考文獻#

1.9.4. 伯努利樸素貝氏#

BernoulliNB 實現了針對依據多元伯努利分佈分佈的數據的樸素貝氏訓練和分類演算法;也就是說,可能有多個特徵,但每個特徵都被假設為二元值(伯努利,布林值)變數。因此,這個類別要求樣本被表示為二元值特徵向量;如果傳入任何其他類型的數據,BernoulliNB 實例可能會將其輸入二元化(取決於 binarize 參數)。

伯努利樸素貝氏的決策規則基於

\[P(x_i \mid y) = P(x_i = 1 \mid y) x_i + (1 - P(x_i = 1 \mid y)) (1 - x_i)\]

這與多項式 NB 的規則不同,因為它明確懲罰了特徵 \(i\) 的不發生,該特徵是類別 \(y\) 的指標,而多項式變體只會忽略不發生的特徵。

在文本分類的情況下,可以使用單詞出現向量(而不是單詞計數向量)來訓練和使用此分類器。BernoulliNB 在某些數據集上可能表現更好,特別是那些具有較短文件的數據集。如果時間允許,建議評估這兩種模型。

參考文獻#

1.9.5. 類別樸素貝氏#

CategoricalNB 實現了針對類別分佈數據的類別樸素貝氏演算法。它假設每個由索引 \(i\) 描述的特徵都有其自己的類別分佈。

對於訓練集 \(X\) 中的每個特徵 \(i\)CategoricalNB 會估計 X 的每個特徵 i 在類別 y 條件下的類別分佈。樣本的索引集定義為 \(J = \{ 1, \dots, m \}\),其中 \(m\) 為樣本數。

機率計算#

給定類別 \(c\) 時,特徵 \(i\) 中類別 \(t\) 的機率估計為

\[P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} + \alpha n_i},\]

其中 \(N_{tic} = |\{j \in J \mid x_{ij} = t, y_j = c\}|\) 是類別 \(t\) 在屬於類別 \(c\) 的樣本 \(x_{i}\) 中出現的次數,\(N_{c} = |\{ j \in J\mid y_j = c\}|\) 是類別為 c 的樣本數,\(\alpha\) 是平滑參數,而 \(n_i\) 是特徵 \(i\) 的可用類別數。

CategoricalNB 假設樣本矩陣 \(X\) 已編碼(例如,藉助 OrdinalEncoder),使得每個特徵 \(i\) 的所有類別都用數字 \(0, ..., n_i - 1\) 表示,其中 \(n_i\) 是特徵 \(i\) 的可用類別數。

1.9.6. 核心外樸素貝氏模型擬合#

樸素貝氏模型可用於解決大規模分類問題,其中完整的訓練集可能無法放入記憶體中。為了處理這種情況,MultinomialNBBernoulliNBGaussianNB 公開了一個 partial_fit 方法,該方法可以像其他分類器一樣逐步使用,如 文本文件核心外分類 中所示。所有樸素貝氏分類器都支援樣本加權。

fit 方法相反,第一次調用 partial_fit 需要傳遞所有預期的類別標籤清單。

有關 scikit-learn 中可用策略的概述,另請參閱 核心外學習 文件。

注意

樸素貝氏模型的 partial_fit 方法調用會產生一些計算開銷。建議使用盡可能大的數據塊大小,也就是可用 RAM 允許的大小。