大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(十五):分類模型(一)
大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(十七):分類模型(三)
二恕曲、樸素貝葉斯
1. 回顧概率
-
概率
是可能性判別的大小哺呜,概率值越大事件
越可能發(fā)生来涨,反之則越不可能發(fā)生软族。
-
條件概率
统翩,在一定條件(事件
發(fā)生的情況)下,事件
發(fā)生的概率山叮。
-
聯(lián)合概率
蔫敲,事件
和事件
共同發(fā)生的概率。
-
條件概率和聯(lián)合概率有如下關(guān)系:
-
全概率公式:
- 綜合以上情況驻谆,可以得到貝葉斯公式:
->
- 貝葉斯公式用來描述兩個條件概率之間的關(guān)系卵凑。
- 從上面的公式可以看出,貝葉斯公式的分子可以看作聯(lián)合概率胜臊,而分母可以看作全概率勺卢。
2. 樸素貝葉斯的基本思想
- 首先樸素貝葉斯Naive Bayes中樸素Naive的含義是,數(shù)據(jù)中的特征相互獨(dú)立象对。
- 假設(shè)1000個微信好友中黑忱,真實(shí)賬號比例
,虛假賬號比例
勒魔,且已知特征:
:日志數(shù)量/注冊天數(shù)甫煞,離散化:
![]()
:好友數(shù)量/注冊天數(shù),離散化:
![]()
- 如果某賬號狀態(tài):
落入?yún)^(qū)間1,
落入?yún)^(qū)間1,
落入?yún)^(qū)間0
- 已知條件:
真實(shí)賬號落入
的比例為0.5:
/ 虛假賬號落入
的比例為0.1:
真實(shí)賬號落入的比例為0.7:
/ 虛假賬號落入
的比例為0.2:
真實(shí)賬號落入的比例為0.2:
/ 虛假賬號落入
的比例為0.2:
- 根據(jù)貝葉斯公式:
- 由于樸素貝葉斯中特征是相互獨(dú)立的抚吠,內(nèi)部轉(zhuǎn)化后:
- 將已知條件帶入后,可以分別獲得真實(shí)賬號和虛假賬號的值:
- 由于真實(shí)賬號的值大于虛假賬號的值弟胀,所以更傾向認(rèn)為賬號是真實(shí)賬號楷力。
3. 拉普拉斯平滑
- 回到樸素貝葉斯公式:
- 假設(shè)條件概率
導(dǎo)致
并造成整個公式為0。
- 為了避免這種情況孵户,需要將全部條件概率加1萧朝。
4. 代碼實(shí)現(xiàn)
>>>import os
>>>import pandas as pd
>>>import numpy as np
>>>from sklearn.model_selection import train_test_split
>>>from sklearn.naive_bayes import GaussianNB,BernoulliNB
>>>from sklearn.metrics import accuracy_score,recall_score,f1_score
>>>models = []
>>>models.append(("GaussianNB",GaussianNB()))
>>>models.append(("BernoulliNB",BernoulliNB()))
>>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
>>>X_tt,X_validation,Y_tt,Y_validation = train_test_split(df.JobLevel,df.JobSatisfaction,test_size=0.2)
>>>X_train,X_test,Y_train,Y_test = train_test_split(X_tt,Y_tt,test_size=0.25)
>>>data = df[["JobSatisfaction","JobLevel"]]
>>>for clf_name,clf in models:
>>> clf.fit(np.array(X_train).reshape(-1,1),np.array(Y_train).reshape(-1,1))
>>> xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
>>> for i in range(len(xy_lst)):
>>> X_part = xy_lst[i][0]
>>> Y_part = xy_lst[i][1]
>>> Y_pred = clf.predict(np.array(X_part).reshape(-1,1))
>>> print(i)
>>> print(clf_name,"-ACC",accuracy_score(Y_part,Y_pred))
>>> print(clf_name,"-REC",recall_score(Y_part,Y_pred,average='macro'))
>>> print(clf_name,"-F1",f1_score(Y_part,Y_pred,average='macro'))
>>> print("="*40)
0
GaussianNB -ACC 0.3253968253968254
GaussianNB -REC 0.25
GaussianNB -F1 0.12275449101796408
========================================
1
GaussianNB -ACC 0.2755102040816326
GaussianNB -REC 0.25
GaussianNB -F1 0.10799999999999998
========================================
2
GaussianNB -ACC 0.30952380952380953
GaussianNB -REC 0.25
GaussianNB -F1 0.11818181818181818
========================================
0
BernoulliNB -ACC 0.3253968253968254
BernoulliNB -REC 0.25
BernoulliNB -F1 0.12275449101796408
========================================
1
BernoulliNB -ACC 0.2755102040816326
BernoulliNB -REC 0.25
BernoulliNB -F1 0.10799999999999998
========================================
2
BernoulliNB -ACC 0.30952380952380953
BernoulliNB -REC 0.25
BernoulliNB -F1 0.11818181818181818
========================================
5. 生成模型與判別模型
- 生成模型:通過求輸入與輸出的聯(lián)合概率分布,再求解類別歸類的概率夏哭,比如樸素貝葉斯模型检柬。
- 判別模型:不通過聯(lián)合概率分布,直接可以獲得輸出對應(yīng)最大分類的概率竖配,比如KNN何址。
- 生成模型相對判別模型對數(shù)據(jù)的要求更高酱固,速度也更快。
- 判別模型相對生成模型對數(shù)據(jù)的容忍程度更高头朱,使用范圍更廣。