一、貝葉斯理論基礎
1. 貝葉斯思想的核心
貝葉斯算法由 18 世紀英國數學家托馬斯?貝葉斯提出,其核心是解決 “逆概” 問題 —— 區別于 “正向概率” 已知條件求結果概率的思路,逆概是通過觀測到的結果,反推導致該結果的原因概率。
比如在日常生活中,“正向概率” 類似 “已知袋子里有 10 個白球和 5 個黑球,摸出黑球的概率是多少”;而 “逆概” 則是 “閉著眼睛摸出 3 個黑球和 2 個白球,推測袋子里黑白球的比例大概是多少”,這也是貝葉斯方法的核心應用場景。
2. 貝葉斯公式的邏輯理解
貝葉斯公式是算法的數學核心,雖然不用公式表達,但可以通過邏輯拆解理解:我們想知道 “在觀測到結果 B 的情況下,原因 A 發生的概率”,這個概率取決于三個關鍵部分 —— 原因 A 本身發生的概率(先驗概率)、在原因 A 發生時結果 B 出現的概率(條件概率),以及結果 B 整體發生的總概率(證據概率)。
在實際對比不同原因的可能性時,結果 B 的總概率往往是固定的,所以可以忽略這部分,只通過 “先驗概率 × 條件概率” 的大小來判斷哪個原因更可能。
3. 經典實例加深理解
(1)學生性別與穿著的推斷
假設某學校男生占 60%、女生占 40%,且男生全部穿長褲,女生一半穿長褲、一半穿裙子。當看到一個穿長褲的學生時,如何推斷其是女生的概率?
首先,計算 “穿長褲” 這個結果的總可能性:既包括男生穿長褲的情況,也包括女生穿長褲的情況。男生穿長褲的比例是 60%×100%=60%,女生穿長褲的比例是 40%×50%=20%,所以穿長褲的總比例是 60%+20%=80%。
而 “穿長褲的女生” 占比是 20%,因此 “穿長褲的學生是女生” 的概率就是 20%÷80%=25%,這就是通過貝葉斯邏輯計算出的逆概結果。
(2)拼寫糾正的應用
當用戶輸入一個不在字典里的錯誤單詞(比如 “tlp”),需要推測其真實想輸入的單詞時,貝葉斯邏輯同樣適用。
我們把用戶輸入的錯誤單詞當作 “觀測結果”,把可能的正確單詞(比如 “top”“tip”)當作 “可能的原因”。判斷哪個原因更合理,需要考慮兩點:一是正確單詞本身在日常使用中出現的頻率(先驗概率),比如 “top” 比 “tip” 更常用,所以 “top” 的先驗概率更高;二是錯誤單詞與正確單詞的相似程度(條件概率),“tlp” 和 “top” 只相差一個字母,比和 “tip” 的差異更小,所以 “tlp 由 top 錯誤生成” 的條件概率更高。
綜合這兩點,就能推斷出用戶更可能想輸入 “top”。
(3)垃圾郵件分類的邏輯
面對一封未知郵件,判斷它是否為垃圾郵件,也可以用貝葉斯思路解決。
首先,“先驗概率” 可以通過郵件庫計算:比如收集 1000 封郵件,其中 300 封是垃圾郵件,那么 “郵件是垃圾郵件” 的先驗概率就是 30%,“是正常郵件” 的先驗概率是 70%。
接著,處理郵件內容這個 “觀測結果”:郵件由多個單詞組成,我們需要計算 “在垃圾郵件中出現這些單詞的概率”(條件概率)。由于樸素貝葉斯假設 “單詞之間相互獨立”,所以不需要考慮單詞的順序,只需分別統計每個單詞在垃圾郵件中出現的頻率,再將這些頻率相乘,就能得到整體的條件概率。
最后,對比 “垃圾郵件先驗概率 × 垃圾郵件條件概率” 和 “正常郵件先驗概率 × 正常郵件條件概率” 的大小,哪個結果更大,就將郵件歸為哪一類。
二、三種核心樸素貝葉斯模型
樸素貝葉斯根據特征數據的類型不同,分為三種常用模型,每種模型的適用場景、參數特點和使用邏輯都有明顯區別:
1. 多項式樸素貝葉斯(MultinomialNB)
這種模型主要適用于離散型數據,尤其是像文本這樣需要統計 “特征出現次數” 的場景。比如在文本分類中,統計每篇文章里每個單詞出現的次數,這些 “次數” 就是離散型特征,適合用多項式模型處理。
它的關鍵參數有三個:一是 “alpha”,作用是添加拉普拉斯平滑 —— 如果某個單詞在某類文本中從未出現,直接計算會出現 “零概率”,導致結果偏差,alpha 設為 1.0(默認值)時會自動修正這種情況,設為 0 則不添加平滑;二是 “fit_prior”,默認是 True,表示計算時會考慮先驗概率,如果設為 False,會假設所有類別的先驗概率相同;三是 “class_prior”,可以手動設置每個類別的先驗概率,默認是 None,此時模型會根據樣本數據自動計算。
在 sklearn 中,只需通過 “from sklearn.naive_bayes import MultinomialNB” 就能導入模型,再用 “MultinomialNB ()” 初始化即可。
2. 高斯樸素貝葉斯(GaussianNB)
當特征是連續型數據(比如身高、體重、溫度等具體數值)時,適合用高斯模型。因為連續型數據無法像離散數據那樣統計 “出現次數”,高斯模型會假設特征服從正態分布(也就是常見的 “鐘形曲線” 分布),通過計算數據在分布中的概率密度,來得到條件概率。
它的核心參數是 “priors”,作用是手動設置每個類別的先驗概率,默認是 None,此時模型會用 “極大似然法”—— 也就是根據樣本中各類別的占比,自動計算先驗概率。
導入方式是 “from sklearn.naive_bayes import GaussianNB”,初始化時直接調用 “GaussianNB ()” 即可,參數設置相對簡單。
3. 伯努利樸素貝葉斯(BernoulliNB)
這種模型針對的是二值離散型數據,也就是特征的取值只有 0 和 1 兩種情況(比如 “某個單詞在文章中是否出現”—— 出現記為 1,不出現記為 0)。它關注的是 “特征是否存在”,而不是 “特征出現多少次”,這是它和多項式模型的核心區別。
它的參數除了和多項式模型類似的 “alpha”“fit_prior”“class_prior” 外,還有一個關鍵參數 “binarize”:如果輸入的特征不是二值數據,這個參數可以設定一個閾值,將特征轉換為 0 和 1(比如設為 0,那么小于 0 的數記為 0,大于等于 0 的數記為 1);如果特征已經是二值化的數據,把 “binarize” 設為 None 即可,默認值是 0。
導入和初始化方式為 “from sklearn.naive_bayes import BernoulliNB” 和 “BernoulliNB ()”。
三、樸素貝葉斯的核心 API(基于 sklearn)
不管是哪種樸素貝葉斯模型,在 sklearn 中都有一套通用的 API,用于完成模型訓練、預測和評估,具體功能如下:
fit(X, Y):這是模型訓練的核心方法,需要傳入兩個參數 ——X 是特征數據(比如文本的單詞次數矩陣、連續型的數值特征),Y 是對應的類別標簽(比如文本的 “正面 / 負面”、郵件的 “垃圾 / 正常”)。調用這個方法后,模型會根據數據學習到特征和類別的關聯規律。
predict(X):用于對新的特征數據 X 進行類別預測,輸出的是每個樣本對應的類別標簽。比如訓練好垃圾郵件分類模型后,傳入一封新郵件的特征,調用這個方法就能得到 “垃圾郵件” 或 “正常郵件” 的預測結果。
predict_proba(X):和 predict 類似,但輸出的不是具體類別,而是每個樣本屬于各個類別的概率值。比如預測某封郵件時,可能輸出 “屬于垃圾郵件的概率是 85%,屬于正常郵件的概率是 15%”,概率值的總和為 1,能更直觀地看到模型的判斷依據。
predict_log_proba(X):功能和 predict_proba 類似,但輸出的是概率的對數值。因為當多個概率相乘時,數值可能會非常小,容易出現 “計算下溢”(數值過小無法準確存儲),取對數后可以避免這個問題,同時不影響不同類別概率的相對大小。
score(X, Y):用于評估模型的性能,需要傳入測試集的特征 X 和對應的真實標簽 Y,輸出的是模型在測試集上的準確率(正確預測的樣本數占總樣本數的比例)。比如測試集有 100 個樣本,模型預測對了 92 個,score 方法就會返回 0.92,表示準確率為 92%。
四、實踐應用:手寫數字識別(課堂練習)
基于 sklearn 提供的手寫數字數據集,我們可以用樸素貝葉斯實現數字識別任務,具體步驟如下:
1. 導入所需工具和數據集
首先需要導入相關的庫:高斯樸素貝葉斯模型(因為手寫數字的特征是像素值,屬于連續型數據)、手寫數字數據集加載工具、數據集劃分工具,以及準確率評估工具。
手寫數字數據集(load_digits)包含了很多手寫數字的圖像數據,每個圖像的像素值被整理成了特征,類別標簽是 0-9 的數字,我們需要先加載這個數據集,把特征和標簽分別提取出來 ——X 表示特征矩陣(每個樣本對應一行像素值),Y 表示每個樣本的真實數字標簽。
2. 劃分訓練集和測試集
為了驗證模型的泛化能力(對新數據的預測效果),需要將數據集分成兩部分:訓練集用于訓練模型,測試集用于評估模型。通常會按照 “8:2” 或 “7:3” 的比例劃分,這里以 8:2 為例,用 train_test_split 工具將 X 和 Y 分別拆分為訓練集(X_train、Y_train)和測試集(X_test、Y_test),同時設置 random_state 保證每次劃分的結果一致,方便復現。
3. 模型訓練與預測
初始化高斯樸素貝葉斯模型,然后調用 fit 方法,傳入訓練集的 X_train 和 Y_train,讓模型學習像素值和數字標簽之間的關聯。訓練完成后,調用 predict 方法,傳入測試集的 X_test,得到模型對測試集的預測標簽 Y_pred。
4. 模型評估
最后用 accuracy_score 工具,將測試集的真實標簽 Y_test 和預測標簽 Y_pred 傳入,計算模型的準確率。通過這個準確率,我們可以判斷模型的識別效果 —— 比如準確率達到 90% 以上,說明模型在手寫數字識別任務上表現較好。
五、學習收獲與總結
通過本次學習,我不僅掌握了樸素貝葉斯的理論邏輯,還能通過實際代碼實現具體任務,主要有以下幾點收獲:
算法優勢明確:樸素貝葉斯的 “特征獨立假設” 雖然簡化了現實情況,但大大降低了計算復雜度,尤其是在數據量不大或特征維度較高(如文本)的場景中,效率很高,而且對小樣本數據的適應性較好,不需要大量數據就能訓練出有一定效果的模型。
模型選擇有章可循:核心是根據特征數據的類型匹配模型 —— 如果是離散型的計數數據(如單詞出現次數),選多項式樸素貝葉斯;如果是連續型數據(如像素值、溫度),選高斯樸素貝葉斯;如果是二值化數據(如特征是否存在),選伯努利樸素貝葉斯,不用再盲目嘗試不同模型。
參數設置需注意細節:拉普拉斯平滑(alpha 參數)是避免 “零概率” 問題的關鍵,實際應用中很少會設為 0,默認的 1.0 是比較安全的選擇;先驗概率的設置也會影響模型效果,如果有領域知識可以手動設置 class_prior,沒有的話讓模型自動計算(默認 None)即可。