樸素貝葉斯

條件概率

•設A,B爲任意兩個事件,若P(A)>0,我們稱在已知事件A發生的條件下,事件B發生的概率爲條件概率,記爲P(B|A),並定義
P(BA)=P(AB)P(A P(B|A) = \frac{P(AB)}{P(A}

乘法公式

•如果P(A)>0,則P(AB)=P(A)P(B|A)

•如果P(A1…An-1)>0,則P(A1…An)= P(A1) P(A2|A1) P(A3|A1A2)…P(An|A1…An-1)

全概率公式

Ui=1nAi=Ω,AiAj=(i!=j) U_{i=1}^{n} A_i = \Omega ,A_iA_j = 空集(一切i!=j)

•P(Ai)>0,則對任一事件B,有
P(B)=i=1nP(Ai)P(BAi) P(B) = \sum_{i=1}^{n}P(A_i)P(B|A_i)
•全概率公式是用於計算某個“結果” B發生的可能性大小。如果一個結果B的發生總是與某些前提條件Ai 相聯繫,那麼在計算P(B)時,我們就要用Ai 對B作分解,應用全概率公式計算P(B),我們常稱這種方法爲全集分解法。

根據小偷們的資料,計算村子今晚失竊概率的問題:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷
i 作案成功的概率,那麼P(B)就是村子失竊的概率

貝葉斯公式(又稱逆概公式)
Ui=1nAi=Ω,AiAj=(i!=j) U_{i=1}^{n} A_i = \Omega ,A_iA_j = 空集(一切i!=j)
P(Ai)>0,則對任一事件B,只要P(B)>0,有
P(AjB)=p(AjB)i=1nP(Ai)P(BAi) P(A_j|B) =\frac{p(A_jB)}{ \sum_{i=1}^{n}P(A_i)P(B|A_i)}
•如果在B發生的條件下探求導致這一結果的各種“原因” Aj 發生的可能性大小P(Aj |B),則要應用貝葉斯公式

若村子今晚失竊,計算哪個小偷嫌疑最大的問題(嫌疑最大就是後驗概率最大)

假設小偷1和小偷2在某村莊的作案數量比爲3:2,前者偷竊成功的概率爲0.02,後者爲0.01,現村莊失竊,求這次失竊是小偷1作案的概率。

【分析】A1={小偷1作案},A2={小偷2作案},B={村莊失竊}
P(A1)=3/5,P(A2)P(BA1)=0.02,P(BA2)=0.01P(A1B)=p(A1B)i=12P(Ai)P(BAi)=3/4P(A2B)=p(A2B)i=12P(Ai)P(BAi)=1/4 P(A_1)=3/5,P(A_2)\\ P(B|A_1)=0.02,P(B|A_2)=0.01\\ P(A_1|B)=\frac{p(A_1B)}{ \sum_{i=1}^{2}P(A_i)P(B|A_i)}=3/4\\ P(A_2|B)=\frac{p(A_2B)}{ \sum_{i=1}^{2}P(A_i)P(B|A_i)}=1/4\\

總結:

先驗概率P(A):在不考慮任何情況下,A事件發生的概率
條件概率P(B|A):A事件發生的情況下,B事件發生的概率
後驗概率P(A|B):在B事件發生之後,對A事件發生的概率的重新評估
全概率:如果A和A’構成樣本空間的一個劃分,那麼事件B的概率爲:A和A’的概率分別乘以B對這兩個事件的概率之和。

樸素貝葉斯的直觀理解

案例:

有一個訓練集包含100個人,其中有60個非洲人(黑卷47,黑直1,黃卷11,黃直1),有40個亞洲人(黑卷1,黃卷4,黃直*35),請訓練樸素貝葉斯模型。

膚色x1={黑,黃}, 髮型x2={卷,直}; 地區label={亞,非}

先計算先驗概率:

亞洲人的比例m,非洲人的比例
P()=60100,P()=40/100 P(非洲) = \frac{60}{100},P(亞洲) = 40/100
模型構建:根據資料計算模型參數

亞洲人中膚色=黑的比例,亞洲人中膚色=黃的比例

P()=1/40,P()=39/40 P(黑|亞洲) = 1/40,P(黃|亞洲)=39/40\\
非洲人中膚色=黑的比例,非洲人中膚色=黃的比例
P()=48/60,p()=12/60 P(黑|非洲)=48/60,p(黃|非洲)=12/60
亞洲人中髮型=卷的比例,亞洲人中髮型=直的比例
P()=5/40,p()=35/40 P(卷|亞洲)=5/40,p(直|亞洲)=35/40
非洲人中髮型=卷的比例,非洲人中髮型=直的比例

P()=58/60,p()=2/60 P(卷|非洲)=58/60,p(直|非洲)=2/60

假設新來了一個人【[黑,卷],地區=?】,請用樸素貝葉斯模型預測這個人的地區。Y表示地區,X表示特徵向量,根據貝葉斯公式,並假設特徵間獨立的假設有:

P(YX)=P(Y)P(XY)P(X)P(YX)=P(Y)P(X(1)Y)P(X(2)Y)P(X) P(Y|X) = \frac{P(Y)*P(X|Y)}{P(X)} \to^{樸素貝葉斯} P(Y|X)=\frac{P(Y)*P(X^{(1)}|Y)*P(X^{(2)}|Y)}{P(X)}

和特徵間獨立的假設(樸素),得
P()=P()P()P()=6010048605860P()=P()P()P()=40100140540 P(非洲|黑卷) = P(非洲)P(黑|非洲)P(卷|非洲)=\frac{60}{100}\frac{48}{60}\frac{58}{60}\\ P(亞洲|黑卷) = P(亞洲)P(黑|亞洲)P(卷|亞洲)=\frac{40}{100}\frac{1}{40}\frac{5}{40}\\

根據計算結果,模型會將這個人的地區預測爲非洲。

樸素:假設特徵間是獨立的(忽略膚色和髮型的聯繫),從而變成了“低配版的貝葉斯模型”,稱爲“樸素貝葉斯”。

優點:是可以減少需要估計的參數的個數;缺點:會犧牲一定的分類準確率。

如果是貝葉斯模型的話,模型參數總數爲:
len{,}len{,}len{,} len\{亞洲,非洲\}*len\{黑,黃\}*len\{卷,直\}
是指數增長的,實際是不可行的;而樸素貝葉斯模型參數總數爲:
len{,}(len{,}+len{,}) len\{亞洲,非洲\}*(len\{黑,黃\}+len\{卷,直\})
通過樸素貝葉斯就可以避免線性增長。

訓練:先根據數據集,計算標記(地區)的先驗概率,再計算每一個特徵(膚色和髮型)的條件概率,這些概率值就是模型參數,因此樸素貝葉斯的訓練成本很低。

預測:當一個【黑,卷】來報道時,假設特徵間是獨立的,樸素貝葉斯模型會預測他的老家是非洲的,原理就是

“非洲人的概率 非洲人裏膚色爲黑的比例 非洲人裏髮型爲卷的比例 > 亞洲人的概率 亞洲人裏膚色爲黑的比例 亞洲人裏髮型爲卷的比例”。

樸素貝葉斯模型會將實例預測爲後驗概率最大的類。

繼續上文的引例,考慮一個這樣的問題:

假設某人的地區完全依靠其膚色的就能確定,髮型是一個對判斷地區沒有參考價值的特徵,假設P(卷|非洲)=0, P(卷|亞洲)=0.001,當來了一個【黑,卷】人的時候,我們算出
P()P()P()=0P()P()P()=0.00001 P(非洲)P(黑|非洲)P(卷|非洲)=0\\ P(亞洲)P(黑|亞洲)P(卷|亞洲)=0.00001\\
然後被預測爲亞洲人,傻了吧?

原因:出現某個模型參數爲0時,0乘任何數都=0,直接影響到後驗概率的計算結果。

解決這一問題的方法是使用平滑操作,改造先驗概率公式:
P()=60+λ100+len{,}λ=60+λ100+2λ P(非洲) = \frac{60+\lambda}{100+len\{亞洲,非洲\}*\lambda}=\frac{60+\lambda}{100+2*\lambda}
改造每個特徵的條件概率公式(這裏只列舉了2個):
P()=48+λ60+len{,}λ=48+λ60+2λP()=2+λ60+len{,}λ=2+λ60+2λ P(黑|非洲) = \frac{48+\lambda}{60+len\{黑,白\}*\lambda}=\frac{48+\lambda}{60+2*\lambda}\\ P(直|非洲) = \frac{2+\lambda}{60+len\{直,卷\}*\lambda}=\frac{2+\lambda}{60+2*\lambda}
在隨機變量各個取值的頻數上賦予一個正數,當λ=1時,稱爲拉普拉斯平滑
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

拉普拉斯平滑

θyi=Nyi+αNy+αn \overline \theta_{y_i} = \frac{N_{y_i}+\alpha}{N_y+\alpha_n}

17: 15+2 (拉普拉斯平滑)

10: 9+1 (拉普拉斯平滑)

代碼實現

import pandas as pd

def tokey(col_name,category,y): #定義寫key的函數,比如產生 'X1=3|Y=1'
    return col_name+"="+str(category)+"|Y="+str(y)

df = pd.read_csv("datas/bayes_lihang.txt")
lam = 1 #平滑因子
P = {} #用於存儲所有概率的字典
Y = df["Y"].value_counts().keys() #獲取類別種類的list
col_names = df.columns.tolist()[:-1] #獲取特徵列名
for y in Y: #遍歷每個類別
    df2 = df[df["Y"]==y] #獲取每個類別下的DF
    p = (df2.shape[0]+lam)/(df.shape[0]+len(Y)*lam) #計算先驗概率
    P[y] = p #將先驗概率加入P
    for col_name in col_names: #遍歷每個特徵
        categorys = df2[col_name].value_counts().keys() #獲取每個特徵下特徵值種類的list
        for category in categorys: #遍歷每個特徵值
            p = (df2[df2[col_name]==category].shape[0]+lam)/(df2.shape[0]+len(categorys)*lam) #計算在某類別下,特徵=某特徵的條件概率
            P[tokey(col_name,category,y)] = p  #將條件概率加到P
print(P) 
X = [2,"S"] #待測數據
res = []  #用於存儲屬於某一類別的後驗概率
for y in Y: #遍歷類別
    p = P[y] #獲取先驗概率
    for i in range(len(X)): #遍歷特徵
        p*=P[tokey(col_names[i],X[i],y)]  #獲取條件概率
    print(p)
    res.append(p)  #將後驗概率加入res
    
import numpy as np
np.argmax(res) #返回最大的後驗概率對應的類別

多項式樸素貝葉斯:

當特徵是離散變量時,使用多項式模型

高斯樸素貝葉斯:

當特徵是連續變量時,使用高斯模型

伯努利樸素貝葉斯:

伯努利模型和多項式模型是一致的,但要求特徵是二值化的(1,0)

注意:當特徵中既有連續變量又有離散變量時,一般將連續變量離散化後使用多項式模型

•在機器學習中,樸素貝葉斯分類器是一系列以假設特徵之間強獨立(樸素)下運用貝葉斯定理爲基礎的簡單概率分類器。

•高度可擴展的,求解過程只需花費線性時間

•目前來說,樸素貝葉斯在文本分類(textclassification)的領域的應用多,無論是sklearn還是Spark Mllib中,都只定製化地實現了在文本分類領域的算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章