描述
樸素貝葉斯分類器與線性模型非常相似的一種分類器,但它的訓練速度往往更快。這種高效率所付出的代價是,樸素貝葉斯模型的泛化能力要比線性分類器(如LogisticRegression 和 LinearSVC)稍差。
樸素貝葉斯模型高效的原因:它通過單獨查看每個特征來學習參數,并從每個特征中收集簡單的類別統計數據。
scikit-learn 中實現了三種樸素貝葉斯分類器:GaussianNB、BernoulliNB 和 MultinomialNB。GaussianNB 可 應 用 于 任 意 連 續 數 據, 而BernoulliNB 假定輸入數據為二分類數據,MultinomialNB 假定輸入數據為計數數據(即每個特征代表某個對象的整數計數,比如一個單詞在句子里出現的次數)。BernoulliNB 和MultinomialNB 主要用于文本數據分類。
分類器
GaussianNB
高斯樸素貝葉斯(GaussianNB)是一種基于貝葉斯定理的概率分類器,特別適用于連續數據或特征變量符合高斯分布的情況。在機器學習中,GaussianNB經常被用于分類任務,如文本分類、垃圾郵件檢測等。
當特征變量是連續的,它們的先驗概率通常假設為高斯分布。這意味著在給定類別中,特征的值遵循正態分布。高斯樸素貝葉斯利用每個特征的均值和方差來估計每個類別的條件概率。對于給定的特征值,GaussianNB遵循以下公式:
P ( x i = X i ( t e s t ) ∣ Y = C k ) = ( 1 / s q r t ( 2 ? p i ? σ k 2 ) ) ? e x p ( ? ( X i ( t e s t ) ? μ k ) 2 / ( 2 ? σ k 2 ) ) P(x_i = X_i(test) | Y = C_k) = (1 / sqrt(2 * pi * σ_k^2)) * exp(- (X_i(test) - μ_k)^2 / (2 * σ_k^2)) P(xi?=Xi?(test)∣Y=Ck?)=(1/sqrt(2?pi?σk2?))?exp(?(Xi?(test)?μk?)2/(2?σk2?))
μ k μ_k μk?和 σ k 2 σ_k^2 σk2?分別是正態分布的期望和方差。GaussianNB的目標是最大化 P ( x i = X i ( t e s t ) ∣ Y = C k ) P(x_i = X_i(test) | Y = C_k) P(xi?=Xi?(test)∣Y=Ck?),以確定樣本更接近哪個類別的值。
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digitsdigits = load_digits() # 是一種8x8的圖像像素數據,目的識別數字
X_train,X_test,Y_train,Y_test = train_test_split(digits.data,digits.target,random_state=42)
gnb = GaussianNB().fit(X_train,Y_train)print(gnb.score(X_train,Y_train),gnb.score(X_test,Y_test)) # 打印訓練、測試得分
var_smoothing 參數:為了保證估計的穩定性,在估計方差時會將所有特征的方差中最大的方差以一定比例添加到估計的方差中。這個比例由var_smoothing參數控制,默認值為1e-9 (目的是排除極大值對模型的干擾)
BernoulliNB
伯努利樸素貝葉斯分類器是一種基于樸素貝葉斯原理的機器學習算法,專門用于處理二項分布數據。在伯努利模型中,特征的條件概率分布假設滿足二項分布,即每個特征都是二分類的,可以用布爾變量表示。這種分類器適用于離散數據,尤其是二進制或布爾特征的情況。
伯努利樸素貝葉斯分類器在處理文本數據時表現良好,尤其是在文檔較短的數據集上。與多項式樸素貝葉斯分類器相比,伯努利樸素貝葉斯更注重特征的存在與否,而不是特征的出現頻率。
binarize參數:用于將樣本特征二值化(映射為布爾值)的閾值。如果為None,則假定輸入已經由二分類向量組成。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNBtrain_text=['I love this book','This book is great','I hate this book']
train_label =[1,1,0] # 1 表示正面評論,0表示負面評論vectorizer = CountVectorizer(binary=True) # 分詞向量器
train_feature = vectorizer.fit_transform(train_text)
test_feature = vectorizer.transform(['I like this book','This book is terrible'])clf = BernoulliNB().fit(train_feature,train_label)
clf.predict(test_feature)
MultinomialNB
多項式樸素貝葉斯分類器適用于具有離散特征的分類(例如,文本分類的詞頻)。多項式分布通常需要整數特征計數。
MultinomialNB在文本分類領域有著廣泛的應用,如垃圾郵件檢測、情感分析、新聞分類等。它特別適合處理高維稀疏數據,如文本數據,并且對噪聲數據有一定的魯棒性?1。此外,MultinomialNB還可以用于多標簽分類任務,即一個樣本可能屬于多個類別?。
注意:MultinomialNB的訓練集數據不能為負數
# 文本處理方式與BernoulliNB 的例子相識
# 這里舉一個鳶尾花的例子
import pandas as pd
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNBiris = pd.read_csv(r'..\..\seaborn-data\iris.csv') # 加載數據
iris_class_dic = {'setosa':0, 'versicolor':1, 'virginica':2}
iris_class = ['setosa', 'versicolor', 'virginica']
iris_tz_array=iris.select_dtypes(include='number')
iris_class_array=iris['species'].map(iris_class_dic)X_train,X_test,Y_train,Y_test = train_test_split(iris_tz_array,iris_class_array,random_state=42)
mnb = MultinomialNB().fit(X_train,Y_train)
print(mnb.score(X_train,Y_train),mnb.score(X_test,Y_test)) #打印得分(結果還可以)
iris_class[int(mnb.predict([[5,2.8,1,0.3]])[0])] # 預測新類型
優點、缺點和參數
MultinomialNB 和 BernoulliNB 都只有一個參數 alpha,用于控制模型復雜度。alpha 的工作原理是,算法向數據中添加 alpha 這么多的虛擬數據點,這些點對所有特征都取正值。這可以將統計數據“平滑化”(smoothing)。alpha 越大,平滑化越強,模型復雜度就越低。算法性能對 alpha 值的魯棒性(健壯性,系統在受到外部擾動或內部參數攝動等不確定性因素干擾時,系統扔保持其結構和功能穩定。)相對較好,也就是說,alpha 值對模型性能并不重要。但調整這個參數通常都會使精度略有提高。
GaussianNB 主要用于高維數據,而另外兩種樸素貝葉斯模型則廣泛用于稀疏計數數據,比如文本。MultinomialNB 的性能通常要優于 BernoulliNB,特別是在包含很多非零特征的數據集(即大型文檔)上。
樸素貝葉斯模型的訓練和預測速度都很快,訓練過程也很容易理解。該模型對高維稀疏數據的效果很好,對參數的魯棒性也相對較好。樸素貝葉斯模型是很好的基準模型,常用于非常大的數據集,在這些數據集上即使訓練線性模型可能也要花費大量時間。