條件概率
•設A,B爲任意兩個事件,若P(A)>0,我們稱在已知事件A發生的條件下,事件B發生的概率爲條件概率,記爲P(B|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)
全概率公式
•P(Ai)>0,則對任一事件B,有
•全概率公式是用於計算某個“結果” B發生的可能性大小。如果一個結果B的發生總是與某些前提條件Ai 相聯繫,那麼在計算P(B)時,我們就要用Ai 對B作分解,應用全概率公式計算P(B),我們常稱這種方法爲全集分解法。
根據小偷們的資料,計算村子今晚失竊概率的問題:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷
i 作案成功的概率,那麼P(B)就是村子失竊的概率
貝葉斯公式(又稱逆概公式)
P(Ai)>0,則對任一事件B,只要P(B)>0,有
•如果在B發生的條件下探求導致這一結果的各種“原因” Aj 發生的可能性大小P(Aj |B),則要應用貝葉斯公式
若村子今晚失竊,計算哪個小偷嫌疑最大的問題(嫌疑最大就是後驗概率最大)
假設小偷1和小偷2在某村莊的作案數量比爲3:2,前者偷竊成功的概率爲0.02,後者爲0.01,現村莊失竊,求這次失竊是小偷1作案的概率。
【分析】A1={小偷1作案},A2={小偷2作案},B={村莊失竊}
總結:
先驗概率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,非洲人的比例
模型構建:根據資料計算模型參數
亞洲人中膚色=黑的比例,亞洲人中膚色=黃的比例
非洲人中膚色=黑的比例,非洲人中膚色=黃的比例
亞洲人中髮型=卷的比例,亞洲人中髮型=直的比例
非洲人中髮型=卷的比例,非洲人中髮型=直的比例
假設新來了一個人【[黑,卷],地區=?】,請用樸素貝葉斯模型預測這個人的地區。Y表示地區,X表示特徵向量,根據貝葉斯公式,並假設特徵間獨立的假設有:
和特徵間獨立的假設(樸素),得
根據計算結果,模型會將這個人的地區預測爲非洲。
樸素:假設特徵間是獨立的(忽略膚色和髮型的聯繫),從而變成了“低配版的貝葉斯模型”,稱爲“樸素貝葉斯”。
優點:是可以減少需要估計的參數的個數;缺點:會犧牲一定的分類準確率。
如果是貝葉斯模型的話,模型參數總數爲:
是指數增長的,實際是不可行的;而樸素貝葉斯模型參數總數爲:
通過樸素貝葉斯就可以避免線性增長。
訓練:先根據數據集,計算標記(地區)的先驗概率,再計算每一個特徵(膚色和髮型)的條件概率,這些概率值就是模型參數,因此樸素貝葉斯的訓練成本很低。
預測:當一個【黑,卷】來報道時,假設特徵間是獨立的,樸素貝葉斯模型會預測他的老家是非洲的,原理就是
“非洲人的概率 非洲人裏膚色爲黑的比例 非洲人裏髮型爲卷的比例 > 亞洲人的概率 亞洲人裏膚色爲黑的比例 亞洲人裏髮型爲卷的比例”。
樸素貝葉斯模型會將實例預測爲後驗概率最大的類。
繼續上文的引例,考慮一個這樣的問題:
假設某人的地區完全依靠其膚色的就能確定,髮型是一個對判斷地區沒有參考價值的特徵,假設P(卷|非洲)=0, P(卷|亞洲)=0.001,當來了一個【黑,卷】人的時候,我們算出
然後被預測爲亞洲人,傻了吧?
原因:出現某個模型參數爲0時,0乘任何數都=0,直接影響到後驗概率的計算結果。
解決這一問題的方法是使用平滑操作,改造先驗概率公式:
改造每個特徵的條件概率公式(這裏只列舉了2個):
在隨機變量各個取值的頻數上賦予一個正數,當λ=1時,稱爲拉普拉斯平滑
拉普拉斯平滑
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中,都只定製化地實現了在文本分類領域的算法