在樣本夠大的情況下,貝氏分類器時常都會有不錯的表現,尤其是在垃圾郵件分類、文字分類等等的應用。上個單元,我們已經認識了貝氏分類器的基本原理。這個單元,我們以大家所熟悉的鳶尾花分類為例,帶大家一起實作高斯貝氏分類器、多項式貝氏分類器以及伯努力貝氏分類器! 文末提供程式檔案,歡迎大家下載跟著一起操作唷!
(一) 引入模組
同樣的,第一個步驟,我們要先引入一些高手們幫我們寫好方便我們使用的套件。前三行程式碼就是我們這次貝氏分類器的主角,分別代表著三種不同的貝氏分類器,都在sklearn的naive_bayes底下,待會都會派上用場唷!
其他的模組就是我們今天所需要的資料、拆分訓練集與測試集的工具,以及我們平時常用的一些資料運算分析及畫圖的模組。
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
(二) 下載資料
在這裡,我們採用Sklearn裡所提供的鳶尾花分類資料集,透過花萼及花瓣的長度與寬度當作特徵,來進行鳶尾花種類的分類。在下載好資料後,我們要進行特徵X的提取以及目標y的提取。
iris=datasets.load_iris()
X=iris.data
y=iris.target
(三)將資料拆分成訓練集與測試集
為了避免過度配適的問題,我們通常都會把資料至少拆分成訓練集與測試集。而透過train_test_split這個工具,我們可以很方便的隨機將我們的資料以不同比例拆分成訓練集與測試集。以下例來說,test_size=0.3就代表著測試集包含30%的樣本數,而訓練集包含70%的樣本數。另外,因為這個拆分都是隨機的,因此我們可以透過固定random_state的方式,來讓後續分析都採用同一種的拆分方法,這樣才不會造成當我們在優化模型時,分不清正貢獻的來源到底是因為我們的調整,還是因為樣本的不同。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
(四)模型建立與分析
萬事俱備後,我們就可以開始進行模型的建構囉! 以下我們分別針對高斯貝氏分類器、多項式貝氏分類器以及伯努力貝氏分類器進行建模與分析。
1. 高斯貝氏分類器 GaussianNB
高斯分類器主要用於特徵為連續變數時,比方說特徵長度為幾公分、重量為幾公斤等等。在這個模型下,假設特徵資料服從常態分配。
在Python中,我們只要把模型設定為GaussianNB(),並對我們的訓練集資料進行fit,模型就建構完成了!
最後我們用predict對測試集的資料進行測試,就可以得知在這個模型底下,測試集樣本的分類結果。
modelg=GaussianNB()
modelg.fit(X_train,y_train)
modelg.predict(X_test)
另外,還記得我們在理論篇中提到的機率標準化嗎? 在這裡,我們可以透過predict_proba()來看每個樣本在各個類別下發生的機率。
modelg.predict_proba(X_test)
最後,透過score()我們就可以得知在這個模型下樣本分類的正確程度。
modelg.score(X_test,y_test)
2. 多項式貝氏分類器 MultinomialNB
多項式貝氏分類器主要用在離散變數,比方說次數、類別等等。而在個模型中,會多一個$\alpha$參數,也就是平滑化的處理。機率計算公式如下:
$$ P(Y_i)=\frac{N_{Y_i}+\alpha}{N+K_\alpha} $$
$$P(X_j|Y_i)=\frac{N_{Y_i,x_j}+\alpha}{N_{Y_i}+n\alpha} $$
同樣的,我們可以先把模型設定為MultinomialNB(),括號裡可以放入參數,比方說alpha。在不設定的情況下,alpha預設為1.0。然後對我們訓練集的資料進行建模,模型就完成囉! 最後一樣用predict來看對測試集資料的預測結果!
modelm=MultinomialNB()
modelm.fit(X_train,y_train)
modelm.predict(X_test)
另外在預測機率以及準確分數的部分,基本上都跟高斯貝氏分類器一樣,在此就不贅述囉!
modelm.predict_proba(X_test)
modelm.score(X_test,y_test)
3. 伯努力貝氏分類器 Bernoulli Naive Bayes
伯努力貝氏分類器主要適用於二元的特徵,比方說特徵是否出現、特徵大小、特徵長短等等這種二元的分類。
$$ P(X_j|Y_i)=P_{Y_i}^{X_j}(1-P_{Y_i})^{X_j} $$
在這裡特別要注意的是,伯努力貝氏分類器的模型裡特徵的部分僅接受二元分類,亦即非0即1。那像我們鳶尾花的案例中,所有特徵都是數值該怎麼辦呢? 這時,我們就可以在BernoulliNB裡面放入參數binarize,並可依據專案的邏輯或資料的特性來設定某個數值。比方說在下圖中我設定3,那模型就會自動將我們特徵數值中大於3的歸一類,小於3的也歸一類,自動轉換成二元特徵。而若是沒有設定的話,模型會自動當作我們的資料已經是分類好的二元特徵了! 其他建模跟預測分析的部分,就跟上述步驟一樣,在此不多敘述。
modelb = BernoulliNB(binarize=3)
modelb.fit(X_train,y_train)
modelb.predict(X_test)
modelb.predict_proba(X_test)
modelb.score(X_test,y_test)
值得注意的是,細心的讀者可能會發現,如果我們的特徵有好幾個,scale都不一樣,那在binarize的部分全部都設定3會不會太偏頗了? 是的,一點也沒錯! 所以,這個binarize其實是可以放入多個數值以符合特徵的特性唷,舉例如下:
modelb = BernoulliNB(binarize=[5.8,3,4.35,1.3])
到了這邊,相信大家都學會如何在Python中使用貝氏分類器,並且了解到什麼樣的資料適合什麼類型的分類器! 如果還想了解更多細節,歡迎直接參考sklearn的官方文檔唷! 事不遲疑,快把這個模型套用到你的資料上試試看吧!
程式檔案,歡迎於此下載。