目錄
- 一、基本原理
- 二、案例演示
- 2.1 未平滑處理
- 2.2 Laplace平滑處理
- 三、Python實現
一、基本原理
樸素貝葉斯思想:依靠特征概率去預測分類,針對于代分類的樣本,會求解在該樣本出現的條件下,各個類別出現的概率,哪個類別概率最大則取哪個類別。其核心原理來自于貝葉斯公式:
P ( A ∣ B ) = P ( B ∣ A ) ? P ( A ) P ( B ) P(A|B)=\frac{P(B|A)*P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)?P(A)?
其中, P ( A ) P(A) P(A)稱之為先驗概率, P ( A ∣ B ) P(A|B) P(A∣B)稱之為后驗概率。結合先驗和后驗概率的基本概念,可以將貝葉斯公式轉化理解為:在事件B發生之后,事件A的發生的概率將發生調整,而調整的幅度則是這個調整因子 P ( B ∣ A ) P ( B ) \frac{P(B|A)}{P(B)} P(B)P(B∣A)?。當這個調整因為為1時,則可以理解為事件B的發生不會對事件A造成任何影響,在統計學的角度上稱事件A和事件B相互獨立,即 P ( A B ) = P ( A ) P ( B ) P(AB)=P(A)P(B) P(AB)=P(A)P(B)。
概念 | 定義 |
---|---|
先驗概率 | 基于常識或認識對于某個事件A發生的概率假定 |
后驗概率 | 在某個事件B發生之后,對于事件A發生概率的修正假定 |
接下來,以生活中的案例進一步理解先驗和后驗概率。例如,一位股市小白預測大A明天下跌的概率是50%,那么這里的50%則是先驗概率;再被多次割韭菜之后,這位小白則總結了一套規律,在得知大A今天上漲10%后,預測大A明天下跌概率為80%;那么這里的80%則為后驗概率。
剛剛介紹的均是貝葉斯公式相關的內容,接下來對【樸素】這一詞進行深入說明。通常在該算法應用過程中,事件B作為特征,事件A作為類別,則可轉化為
P ( 類別 ∣ 特征 ) = P ( 特征 ∣ 類別 ) ? P ( 類別 ) P ( 特征 ) P(類別|特征)=\frac{P(特征|類別)*P(類別)}{P(特征)} P(類別∣特征)=P(特征)P(特征∣類別)?P(類別)?
實際案例中,通常特征都會有多個,這里就有個前提假設條件,也正是樸素一詞的來源,它是需要特征之間相互獨立的,上述公式即可分解為
P ( 類別 ∣ 特征 ) = P ( 特 征 1 ∣ 類別 ) ? P ( 特 征 2 ∣ 類別 ) ? . . . P ( 特 征 n ∣ 類別 ) ? P ( 類別 ) P ( 特征 ) P(類別|特征)=\frac{P(特征_{1}|類別)*P(特征_2|類別)*...P(特征_n|類別)*P(類別)}{P(特征)} P(類別∣特征)=P(特征)P(特征1?∣類別)?P(特征2?∣類別)?...P(特征n?∣類別)?P(類別)?,
二、案例演示
以實際案例對樸素貝葉斯算法進行分類加深理解,現有一信貸用戶數據集,特征包含三個方面:信用水平、收入水平、工作穩定性。類別為是否逾期還款。現根據如下數據,預測一名用戶信用水平為Good,收入水平為Low,工作穩定性為Unstable,是否會逾期還款。數據如下所示
用戶ID | 信用水平 | 收入水平 | 工作穩定性 | 是否逾期還款 |
---|---|---|---|---|
1 | Bad | Low | Unstable | Yes |
2 | Bad | High | Stable | No |
3 | Bad | Medium | Stable | Yes |
4 | Good | Low | Stable | No |
5 | Good | High | Unstable | Yes |
6 | Medium | High | Stable | No |
7 | Medium | Low | Unstable | Yes |
8 | Good | Medium | Stable | No |
9 | Medium | Medium | Stable | Yes |
10 | Bad | High | Unstable | No |
2.1 未平滑處理
(1)計算先驗概率
P ( 是否逾期還款 = Y e s ) = 5 / 10 = 0.5 P ( 是否逾期還款 = N o ) = 5 / 10 = 0.5 P(是否逾期還款=Yes)=5/10=0.5\\ P(是否逾期還款=No)=5/10=0.5 P(是否逾期還款=Yes)=5/10=0.5P(是否逾期還款=No)=5/10=0.5
(2)計算條件概率
P ( 信用水平 = G o o d ∣ 是否逾期還款 = Y e s ) = 1 / 5 P ( 收入水平 = L o w ∣ 是否逾期還款 = Y e s ) = 2 / 5 P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = Y e s ) = 3 / 5 P(信用水平=Good|是否逾期還款=Yes)=1/5\\ P(收入水平=Low|是否逾期還款=Yes)=2/5\\ P(工作穩定性=Unstable|是否逾期還款=Yes)=3/5 P(信用水平=Good∣是否逾期還款=Yes)=1/5P(收入水平=Low∣是否逾期還款=Yes)=2/5P(工作穩定性=Unstable∣是否逾期還款=Yes)=3/5
P ( 信用水平 = G o o d ∣ 是否逾期還款 = N o ) = 2 / 5 P ( 收入水平 = L o w ∣ 是否逾期還款 = N o ) = 1 / 5 P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = N o ) = 1 / 5 P(信用水平=Good|是否逾期還款=No)=2/5\\ P(收入水平=Low|是否逾期還款=No)=1/5\\ P(工作穩定性=Unstable|是否逾期還款=No)=1/5 P(信用水平=Good∣是否逾期還款=No)=2/5P(收入水平=Low∣是否逾期還款=No)=1/5P(工作穩定性=Unstable∣是否逾期還款=No)=1/5
(3)預測類別
考慮各特征概率不影響最終類別判斷,在此忽略各特征概率計算
P ( 是否逾期還款 = Y e s ∣ 信用水平 = G o o d , 收入水平 = L o w , 工作穩定性 = U n s t a b l e ) ≈ P ( 信用水平 = G o o d ∣ 是否逾期還款 = Y e s ) ? P ( 收入水平 = L o w ∣ 是否逾期還款 = Y e s ) ? P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = Y e s ) ? P ( 是否逾期還款 = Y e s ) = 1 / 5 ? 2 / 5 ? 3 / 5 ? 1 / 2 = 0.024 P(是否逾期還款=Yes|信用水平= Good,收入水平=Low,工作穩定性=Unstable) \approx \\P(信用水平=Good|是否逾期還款=Yes) *P(收入水平=Low|是否逾期還款=Yes)*\\P(工作穩定性=Unstable|是否逾期還款=Yes)*P(是否逾期還款=Yes)=1/5*2/5*3/5*1/2=0.024 P(是否逾期還款=Yes∣信用水平=Good,收入水平=Low,工作穩定性=Unstable)≈P(信用水平=Good∣是否逾期還款=Yes)?P(收入水平=Low∣是否逾期還款=Yes)?P(工作穩定性=Unstable∣是否逾期還款=Yes)?P(是否逾期還款=Yes)=1/5?2/5?3/5?1/2=0.024
P ( 是否逾期還款 = N o ∣ 信用水平 = G o o d , 收入水平 = L o w , 工作穩定性 = U n s t a b l e ) ≈ P ( 信用水平 = G o o d ∣ 是否逾期還款 = N o ) ? P ( 收入水平 = L o w ∣ 是否逾期還款 = N o ) ? P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = N o ) ? P ( 是否逾期還款 = N o ) = 2 / 5 ? 1 / 5 ? 1 / 5 ? 1 / 2 = 0.008 P(是否逾期還款=No|信用水平= Good,收入水平=Low,工作穩定性=Unstable) \approx \\P(信用水平=Good|是否逾期還款=No) *P(收入水平=Low|是否逾期還款=No)*\\P(工作穩定性=Unstable|是否逾期還款=No)*P(是否逾期還款=No)=2/5*1/5*1/5*1/2=0.008 P(是否逾期還款=No∣信用水平=Good,收入水平=Low,工作穩定性=Unstable)≈P(信用水平=Good∣是否逾期還款=No)?P(收入水平=Low∣是否逾期還款=No)?P(工作穩定性=Unstable∣是否逾期還款=No)?P(是否逾期還款=No)=2/5?1/5?1/5?1/2=0.008
標準化后,逾期概率為75%,故判斷這名用戶將會逾期還款(信用水平為Good,收入水平為Low,工作穩定性為Unstable)
2.2 Laplace平滑處理
當預測樣本出現了訓練集未曾出現的特征組合時,那么在計算特征概率時,數值直接為0,直接影響最終分類識別。例如,如果訓練集中無信用水平為Good+逾期為Yes的樣本,則P(Good|Yes)=0,導致所有信用水平為Good的逾期樣本將無法識別。此時,就需要對計算概率進行修正,修正方式如下:
P s m o o t h ( x i ∣ y ) = c o u n t ( x i , y ) + α c o u n t ( y ) + K ? α P_{smooth}(x_i|y)=\frac{count(x_i,y)+\alpha}{count(y)+K*\alpha} Psmooth?(xi?∣y)=count(y)+K?αcount(xi?,y)+α?
其中, α \alpha α為平滑參數,通常取1; K為當前特征的數量(例如信用水平有Bad/Good/Medium,則K=3)
(1) 平滑處理后的條件概率
P ( 信用水平 = G o o d ∣ 是否逾期還款 = Y e s ) = ( 1 + 1 ) / ( 3 + 5 ) = 1 / 4 P ( 收入水平 = L o w ∣ 是否逾期還款 = Y e s ) = ( 2 + 1 ) / ( 3 + 5 ) = 3 / 8 P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = Y e s ) = ( 3 + 1 ) / ( 2 + 5 ) = 4 / 7 P(信用水平=Good|是否逾期還款=Yes)=(1+1)/(3+5)=1/4\\ P(收入水平=Low|是否逾期還款=Yes)=(2+1)/(3+5)=3/8\\ P(工作穩定性=Unstable|是否逾期還款=Yes)=(3+1)/(2+5)=4/7 P(信用水平=Good∣是否逾期還款=Yes)=(1+1)/(3+5)=1/4P(收入水平=Low∣是否逾期還款=Yes)=(2+1)/(3+5)=3/8P(工作穩定性=Unstable∣是否逾期還款=Yes)=(3+1)/(2+5)=4/7
P ( 信用水平 = G o o d ∣ 是否逾期還款 = N o ) = ( 1 + 2 ) / ( 3 + 5 ) = 3 / 8 P ( 收入水平 = L o w ∣ 是否逾期還款 = N o ) = ( 1 + 1 ) / ( 3 + 5 ) = 1 / 4 P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = N o ) = ( 1 + 1 ) / ( 2 + 5 ) = 2 / 7 P(信用水平=Good|是否逾期還款=No)=(1+2)/(3+5)=3/8\\ P(收入水平=Low|是否逾期還款=No)=(1+1)/(3+5)=1/4\\ P(工作穩定性=Unstable|是否逾期還款=No)=(1+1)/(2+5)=2/7 P(信用水平=Good∣是否逾期還款=No)=(1+2)/(3+5)=3/8P(收入水平=Low∣是否逾期還款=No)=(1+1)/(3+5)=1/4P(工作穩定性=Unstable∣是否逾期還款=No)=(1+1)/(2+5)=2/7
(2) 平滑處理預測
P ( 是否逾期還款 = Y e s ∣ 信用水平 = G o o d , 收入水平 = L o w , 工作穩定性 = U n s t a b l e ) ≈ P ( 信用水平 = G o o d ∣ 是否逾期還款 = Y e s ) ? P ( 收入水平 = L o w ∣ 是否逾期還款 = Y e s ) ? P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = Y e s ) ? P ( 是否逾期還款 = Y e s ) = 1 / 4 ? 3 / 8 ? 4 / 7 ? 1 / 2 ≈ 0.0268 P(是否逾期還款=Yes|信用水平= Good,收入水平=Low,工作穩定性=Unstable) \approx \\P(信用水平=Good|是否逾期還款=Yes) *P(收入水平=Low|是否逾期還款=Yes)*\\P(工作穩定性=Unstable|是否逾期還款=Yes)*P(是否逾期還款=Yes)=1/4*3/8*4/7*1/2\approx0.0268 P(是否逾期還款=Yes∣信用水平=Good,收入水平=Low,工作穩定性=Unstable)≈P(信用水平=Good∣是否逾期還款=Yes)?P(收入水平=Low∣是否逾期還款=Yes)?P(工作穩定性=Unstable∣是否逾期還款=Yes)?P(是否逾期還款=Yes)=1/4?3/8?4/7?1/2≈0.0268
P ( 是否逾期還款 = N o ∣ 信用水平 = G o o d , 收入水平 = L o w , 工作穩定性 = U n s t a b l e ) ≈ P ( 信用水平 = G o o d ∣ 是否逾期還款 = N o ) ? P ( 收入水平 = L o w ∣ 是否逾期還款 = N o ) ? P ( 工作穩定性 = U n s t a b l e ∣ 是否逾期還款 = N o ) ? P ( 是否逾期還款 = N o ) = 3 / 8 ? 1 / 4 ? 2 / 7 ? 1 / 2 ≈ 0.0133 P(是否逾期還款=No|信用水平= Good,收入水平=Low,工作穩定性=Unstable) \approx \\P(信用水平=Good|是否逾期還款=No) *P(收入水平=Low|是否逾期還款=No)*\\P(工作穩定性=Unstable|是否逾期還款=No)*P(是否逾期還款=No)=3/8*1/4*2/7*1/2\approx0.0133 P(是否逾期還款=No∣信用水平=Good,收入水平=Low,工作穩定性=Unstable)≈P(信用水平=Good∣是否逾期還款=No)?P(收入水平=Low∣是否逾期還款=No)?P(工作穩定性=Unstable∣是否逾期還款=No)?P(是否逾期還款=No)=3/8?1/4?2/7?1/2≈0.0133
標準化后,逾期概率為66.7%,故仍判斷這名用戶還是會逾期還款
三、Python實現
接下來以Python的方式實現上述2種處理方式
# 樸素貝葉斯
import numpy as np
import pandas as pd
data = pd.DataFrame({'credit_history':['Bad','Bad','Bad','Good','Good','Medium','Medium','Good','Medium','Bad'],'income_level':['Low','High','Medium','Low','High','High','Low','Medium','Medium','High'],'job_stablity':['Unstable','Stable','Stable','Stable','Unstable','Stable','Unstable','Stable','Stable','Unstable'],'is_delay':['Yes','No','Yes','No','Yes','No','Yes','No','Yes','No']})def cal_prob(data_list,label_list,alpha):all_label = set(np.unique(label_list))category,counts = np.unique(data_list,return_counts=True)retain_label = all_label.difference(category)n = len(all_label)count_dict = dict(zip(category,counts))for label in retain_label:if count_dict.get(label) is None:count_dict[label]=0prob_dict = {key:(value+alpha)/(sum(count_dict.values())+alpha*n) for key,value in count_dict.items()}return prob_dictdelay_prob = cal_prob(data['is_delay'],[],0)# 不使用拉普拉斯平滑處理
credict_yes_prob = cal_prob(data[data['is_delay']=='Yes']['credit_history'],[],0)
income_yes_prob = cal_prob(data[data['is_delay']=='Yes']['income_level'],[],0)
job_yes_stablity = cal_prob(data[data['is_delay']=='Yes']['job_stablity'],[],0)credict_no_prob = cal_prob(data[data['is_delay']=='No']['credit_history'],[],0)
income_no_prob = cal_prob(data[data['is_delay']=='No']['income_level'],[],0)
job_no_stablity = cal_prob(data[data['is_delay']=='No']['job_stablity'],[],0)credict_yes_prob_smooth = cal_prob(data[data['is_delay']=='Yes']['credit_history'],data['credit_history'],1)
income_yes_prob_smooth = cal_prob(data[data['is_delay']=='Yes']['income_level'],data['income_level'],1)
job_yes_stablity_smooth = cal_prob(data[data['is_delay']=='Yes']['job_stablity'],data['job_stablity'],1)credict_no_prob_smooth = cal_prob(data[data['is_delay']=='No']['credit_history'],data['credit_history'],1)
income_no_prob_smooth = cal_prob(data[data['is_delay']=='No']['income_level'],data['income_level'],1)
job_no_stablity_smooth = cal_prob(data[data['is_delay']=='No']['job_stablity'],data['job_stablity'],1)# 未平滑處理:推測一個人信用GOOD,收入水平Low,工作Unstable 情況下是否會逾期還款
predict_yes_delay = delay_prob['Yes']*credict_yes_prob['Good']*income_yes_prob['Low']*job_yes_stablity['Unstable']
predict_no_delay = delay_prob['No']*credict_no_prob['Good']*income_no_prob['Low']*job_no_stablity['Unstable']# 拉普拉斯平滑處理:推測一個人信用GOOD,收入水平Low,工作Unstable 情況下是否會逾期還款
predict_yes_delay_smooth = delay_prob['Yes']*credict_yes_prob_smooth['Good']*income_yes_prob_smooth['Low']*job_yes_stablity_smooth['Unstable']
predict_no_delay_smooth = delay_prob['No']*credict_no_prob_smooth['Good']*income_no_prob_smooth['Low']*job_no_stablity_smooth['Unstable']print('未平滑處理,標準化逾期概率:{}%'.format(round(100*predict_yes_delay/(predict_yes_delay+predict_no_delay),2)))
print('平滑處理,標準化逾期概率:{}%'.format(round(100*predict_yes_delay_smooth/(predict_yes_delay_smooth+predict_no_delay_smooth),2)))