本筆記為參加阿里云“天池龍珠計劃 機(jī)器學(xué)習(xí)訓(xùn)練營”所做的學(xué)習(xí)記錄,代碼及知識內(nèi)容均來源于訓(xùn)練營,本人稍作擴(kuò)充诊县。
具體活動內(nèi)容請移步阿里云天池龍珠計劃; 同時感謝公眾號“機(jī)器學(xué)習(xí)煉丹術(shù)”的介紹、推廣和組織。
模擬離散數(shù)據(jù)集--貝葉斯分類
Step1: 庫函數(shù)導(dǎo)入 + Step2: 數(shù)據(jù)導(dǎo)入&分析 + Step3: 模型訓(xùn)練&可視化 + Step4: 原理簡析
import random
import numpy as np
# 使用基于類目特征的樸素貝葉斯
from sklearn.naive_bayes import CategoricalNB
from sklearn.model_selection import train_test_split
Step2: 數(shù)據(jù)導(dǎo)入&分析
# 模擬數(shù)據(jù)
rng = np.random.RandomState(1)
# 隨機(jī)生成600個100維的數(shù)據(jù)弱左,每一維的特征都是[0, 4]之前的整數(shù)
X = rng.randint(5, size=(600, 100))
y = np.array([1, 2, 3, 4, 5, 6] * 100)
data = np.c_[X, y]
# X和y進(jìn)行整體打散
random.shuffle(data)
X = data[:,:-1]
y = data[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
所有的數(shù)據(jù)特征都是離散特征,我們引入基于離散特征的樸素貝葉斯分類器炕淮。
Step3: 模型訓(xùn)練&預(yù)測
clf = CategoricalNB(alpha=1)
clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print("Test Acc : %.3f" % acc)
# Output:
# Test Acc : 0.633
# 隨機(jī)數(shù)據(jù)測試拆火,分析預(yù)測結(jié)果,貝葉斯會選擇概率最大的預(yù)測結(jié)果
# 比如這里的預(yù)測結(jié)果是6涂圆,6對應(yīng)的概率最大们镜,由于我們是隨機(jī)數(shù)據(jù)
# 讀者運行的時候,可能會出現(xiàn)不一樣的結(jié)果润歉。
x = rng.randint(5, size=(1, 100))
print(clf.predict_proba(x))
print(clf.predict(x))
# Output:
# [[0.01365523 0.01227424 0.18555745 0.34259751 0.42150813 0.02440744]]
# [5]
Step4: 原理簡析
4.1 結(jié)果分析
可以看到測試的數(shù)據(jù)的結(jié)果模狭,貝葉斯會選擇概率最大的預(yù)測結(jié)果,比如這里的預(yù)測結(jié)果是5踩衩,5對應(yīng)的概率最大嚼鹉,由于我們是隨機(jī)數(shù)據(jù)贩汉,讀者運行的時候,可能會出現(xiàn)不一樣的結(jié)果锚赤。
這里的測試數(shù)據(jù)的準(zhǔn)確率沒有任何意義匹舞,因為數(shù)據(jù)是隨機(jī)生成的,不一定具有貝葉斯先驗性线脚,這里只是作為一個列子引導(dǎo)大家如何使用赐稽。
alpha=1這個參數(shù)表示什么?
我們知道貝葉斯法一定要計算兩個概率:條件概率: ??(??(??)=??(??)|??=????) 和類目 ???? 的先驗概率: ??(??=????) 浑侥。
對于離散特征:我們可以看出就是對每一個變量的多加了一個頻數(shù)alpha姊舵。當(dāng)alphaλ=0時,就是極大似然估計
寓落。通常取值alpha=1括丁,這就是拉普拉斯平滑(Laplace smoothing)
,這又叫做貝葉斯估計
零如,主要是因為如果使用極大似然估計躏将,如果某個特征值在訓(xùn)練數(shù)據(jù)中沒有出現(xiàn),這時候會出現(xiàn)概率為0的情況考蕾,導(dǎo)致整個估計都為0祸憋,因為引入貝葉斯估計。
其中:
???? :表示第j個特征的個數(shù)肖卧。
?????? :表示第i個樣本的第j維元素蚯窥。
???? :第i個樣本的label。
4.2 樸素貝葉斯算法
樸素貝葉斯法 = 貝葉斯定理 + 特征條件獨立塞帐。
輸入 ??∈???? 空間是n維向量集合拦赠,輸出空間 ??={??1,??2,...,????} . 所有的X和y都是對應(yīng)空間上的隨機(jī)變量. ??(??,??) 是X和Y的聯(lián)合概率分別.訓(xùn)練數(shù)據(jù)集(由 ??(??,??) 獨立同分布產(chǎn)生):
??={(??1,??1),(??2,??2),...,(????,????)}
計算測試數(shù)據(jù)x的列表,我們需要依次計算 ??(??=????|??=??) 葵姥,取概率最大的值荷鼠,就是x對應(yīng)的分類。
??(??=????|??=??) 我們一般這樣解釋榔幸,當(dāng)給定 (??=??) 的條件下允乐, ??=???? 的概率,這就是條件概率. 這就簡單了削咆,我們只需要每個的x牍疏,計算其對應(yīng)的 ????,??∈[1,2,...,??] 的概率,選擇最大的概率作為這個x的類別進(jìn)行了.
通過貝葉斯公式進(jìn)行變形拨齐,得到預(yù)測的概率計算公式:
我們只需要計算以下兩個概率即可鳞陨,又由于樸素貝葉斯假設(shè)條件獨立,我們可以單獨計算每個特征的條件概率: ??(??(??)=??(??)|??=????) 和類目 ???? 的先驗概率: ??(??=????) 瞻惋。為了更好的理解這個公式厦滤,看下圖解釋:
其中:
當(dāng)涉及到多個條件時援岩,樸素貝葉斯有一個提前的假設(shè),我們稱之為 條件獨立性假設(shè)(或者 簡單假設(shè):Naive):公式如下
??(??,??|??) = ??(??|??)???(??|??)
這個公式是樸素貝葉斯的基礎(chǔ)假設(shè)掏导,即各個條件概率是相互獨立的窄俏,A不影響B(tài),B不影響A碘菜。 而對這里來說,假設(shè) ??=[??1,??2,...,????]
由此原式可以等價為:
我們來看一個實例限寞,更好的理解貝葉斯的計算過程忍啸,根據(jù)天氣和是否是周末預(yù)測一個人是否會出門。
4.3 樸素貝葉斯的優(yōu)缺點
優(yōu)點: 樸素貝葉斯算法主要基于經(jīng)典的貝葉斯公式進(jìn)行推導(dǎo)履植,具有很好的數(shù)學(xué)原理计雌。而且在數(shù)據(jù)量很小的時候表現(xiàn)良好,數(shù)據(jù)量很大的時候也可以進(jìn)行增量計算玫霎。由于樸素貝葉斯使用先驗概率估計后驗概率凿滤,具有很好的模型的可解釋性。
缺點: 樸素貝葉斯模型與其他分類方法相比具有最小的理論誤差率庶近。但是實際上并非總是如此翁脆,這是因為樸素貝葉斯模型給定輸出類別的情況下,假設(shè)屬性之間相互獨立鼻种,這個假設(shè)在實際應(yīng)用中往往是不成立的反番,在屬性個數(shù)比較多或者屬性之間相關(guān)性較大時,分類效果不好叉钥。而在屬性相關(guān)性較小時罢缸,樸素貝葉斯性能最為良好。對于這一點投队,有半樸素貝葉斯之類的算法通過考慮部分關(guān)聯(lián)性適度改進(jìn)枫疆,例如為了計算量不至于太大,我們假定每個屬性只依賴另外的一個敷鸦。解決特征之間的相關(guān)性息楔,我們還可以使用數(shù)據(jù)降維(PCA)的方法,去除特征相關(guān)性轧膘,再進(jìn)行樸素貝葉斯計算钞螟。
參考資料:
B站@up主-風(fēng)巽- 的 樸素貝葉斯----模型原理