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}\) 是特徵 \(i\) 在屬於類 \(y\) 的樣本中出現的機率 \(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\) 稱為拉普拉斯平滑(Laplace smoothing),而 \(\alpha < 1\) 稱為利德斯通平滑(Lidstone smoothing)。

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}\) 是文件 \(j\) 中詞項 \(i\) 的計數或 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)\]

這與多項式樸素貝葉斯的規則不同,它顯式懲罰了作為一個類 \(y\) 指示器的特徵 \(i\) 的不出現,而多項式變體則簡單地忽略不出現的特徵。

在文字分類的情況下,可以使用詞出現向量(而非詞頻向量)來訓練和使用該分類器。BernoulliNB 在某些資料集(尤其是文件較短的資料集)上可能表現更好。如果時間允許,建議對兩種模型進行評估。

參考文獻#

1.9.5. 分類樸素貝葉斯#

CategoricalNB 實現了用於分類分佈資料的分類樸素貝葉斯演算法。它假定每個特徵(由索引 \(i\) 描述)都有其自己的分類分佈。

對於訓練集 \(X\) 中的每個特徵 \(i\)CategoricalNB 都會在給定類 \(y\) 的條件下,為 X 的每個特徵 i 估計一個分類分佈。樣本索引集定義為 \(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. 核外(Out-of-core)樸素貝葉斯模型擬合#

樸素貝葉斯模型可用於處理大規模分類問題,即使完整的訓練集無法裝入記憶體。為處理這種情況,MultinomialNBBernoulliNBGaussianNB 提供了 partial_fit 方法,可以像其他分類器一樣進行增量式學習,正如 Out-of-core classification of text documents 中演示的那樣。所有樸素貝葉斯分類器均支援樣本加權。

fit 方法不同,首次呼叫 partial_fit 時需要傳入所有預期的類標籤列表。

有關 scikit-learn 中可用策略的概述,另請參見 out-of-core learning 文件。

注意

樸素貝葉斯模型的 partial_fit 方法呼叫會引入一定的計算開銷。建議使用盡可能大的資料塊大小,即在可用記憶體允許的範圍內。