带你彻彻底底搞懂朴素贝叶斯公式
https://zhuanlan.zhihu.com/p/54287889
本文參考了該博客的實例,但該博客中的樸素貝葉斯公式計算錯誤,評論中的也不對,所以,重新寫一篇。
一. 樸素貝葉斯
? ? ? 樸素貝葉斯中的樸素一詞的來源就是假設(shè)各特征之間相互獨立。這一假設(shè)使得樸素貝葉斯算法變得簡單,但有時會犧牲一定的分類準(zhǔn)確率。
? ? 首先給出貝葉斯公式:
? ? 換成分類任務(wù)的表達式:
? ? ?我們最終求的p(類別|特征)即可!就相當(dāng)于完成了我們的任務(wù)。
則,樸素貝特斯公式為:二. 實例解析
首先,給出數(shù)據(jù)如下:
現(xiàn)在給我們的問題是,如果一對男女朋友,男生想女生求婚,男生的四個特點分別是不帥,性格不好,身高矮,不上進,請你判斷一下女生是嫁還是不嫁?
這是典型的二分類問題,按照樸素貝葉斯的求解,轉(zhuǎn)換為P(嫁|不帥、性格不好、矮、不上進)和P(不嫁|不帥、性格不好、矮、不上進)的概率,最終選擇嫁與不嫁的答案。
這里我們根據(jù)貝特斯公式:
由此,我們將(嫁|不帥、性格不好、矮、不上進)轉(zhuǎn)換成三個可求的P(嫁)、P(不帥、性格不好、矮、不上進|嫁)、P(不帥、性格不好、矮、不上進)。進一步分解可以得:
P(不帥、性格不好、矮、不上進)=P(嫁)P(不帥|嫁)P(性格不好|嫁)P(矮|嫁)P(不上進|嫁)+P(不嫁)P(不帥|不嫁)P(性格不好|不嫁)P(矮|不嫁)P(不上進|不嫁)。
P(不帥、性格不好、矮、不上進|嫁)=P(不帥|嫁)P(性格不好|嫁)P(矮|嫁)P(不上進|嫁)
將上面的公式整理一下可得:
?P(嫁)=1/2、P(不帥|嫁)=1/2、P(性格不好|嫁)=1/6、P(矮|嫁)=1/6、P(不上進|嫁)=1/6。
?P(不嫁)=1/2、P(不帥|不嫁)=1/3、P(性格不好|不嫁)=1/2、P(矮|不嫁)=1、P(不上進|不嫁)=2/3
?但是由貝葉斯公式可得:對于目標(biāo)求解為不同的類別,貝葉斯公式的分母總是相同的。所以,只求解分子即可:
于是,對于類別“嫁”的貝葉斯分子為:P(嫁)P(不帥|嫁)P(性格不好|嫁)P(矮|嫁)P(不上進|嫁)=1/2 *?1/2 *?1/6 *?1/6 *?1/6=1/864?????
對于類別“不嫁”的貝葉斯分子為:P(不嫁)P(不帥|不嫁)P(性格不好|不嫁)P(矮|不嫁)P(不上進|不嫁)=1/2 *?1/3 *?1/2 *?1* 2/3=1/18。
經(jīng)代入貝葉斯公式可得:P(嫁|不帥、性格不好、矮、不上進)=(1/864) / (1/864+1/18)=1/49=2.04%
P(不嫁|不帥、性格不好、矮、不上進)=(1/18) / (1/864+1/18)=48/49=97.96%
則P(不嫁|不帥、性格不好、矮、不上進) >?P(嫁|不帥、性格不好、矮、不上進),則該女子選擇不嫁!
三. 樸素貝葉斯的優(yōu)缺點
優(yōu)點:
? (1) 算法邏輯簡單,易于實現(xiàn)(算法思路很簡單,只要使用貝葉斯公式轉(zhuǎn)化即可!)
(2)分類過程中時空開銷小(假設(shè)特征相互獨立,只會涉及到二維存儲)
缺點:
? ? ? 樸素貝葉斯假設(shè)屬性之間相互獨立,這種假設(shè)在實際過程中往往是不成立的。在屬性之間相關(guān)性越大,分類誤差也就越大。
四. 樸素貝葉斯實戰(zhàn)
? ? sklearn中有3種不同類型的樸素貝葉斯:
- 高斯分布型:用于classification問題,假定屬性/特征服從正態(tài)分布的。
- 多項式型:用于離散值模型里。比如文本分類問題里面我們提到過,我們不光看詞語是否在文本中出現(xiàn),也得看出現(xiàn)次數(shù)。如果總詞數(shù)為n,出現(xiàn)詞數(shù)為m的話,有點像擲骰子n次出現(xiàn)m次這個詞的場景。
- 伯努利型:最后得到的特征只有0(沒出現(xiàn))和1(出現(xiàn)過)。
- from sklearn.naive_bayes import GaussianNB
- from sklearn.model_selection import cross_val_score
- from sklearn import datasets
- iris = datasets.load_iris()
- gnb = GaussianNB()
- scores=cross_val_score(gnb, iris.data, iris.target, cv=10)
- print("Accuracy:%.3f"%scores.mean())
???輸出:?Accuracy:0.953?
? 4.2 Kaggle比賽之“舊金山犯罪分類預(yù)測”
? ? ? ?題目數(shù)據(jù):第一種獲取方式:Kaggle網(wǎng)站上;第二種獲取方式:百度網(wǎng)盤
????????題目背景:『水深火熱』的大米國,在舊金山這個地方,一度犯罪率還挺高的,然后很多人都經(jīng)歷過大到暴力案件,小到東西被偷,車被劃的事情。當(dāng)?shù)鼐揭彩桥Φ厝タ偨Y(jié)和想辦法降低犯罪率,一個挑戰(zhàn)是在給出犯罪的地點和時間的之后,要第一時間確定這可能是一個什么樣的犯罪類型,以確定警力等等。后來干脆一不做二不休,直接把12年內(nèi)舊金山城內(nèi)的犯罪報告都丟帶Kaggle上,說『大家折騰折騰吧,看看誰能幫忙第一時間預(yù)測一下犯罪類型』。犯罪報告里面包括日期,描述,星期幾,所屬警區(qū),處理結(jié)果,地址,GPS定位等信息。當(dāng)然,分類問題有很多分類器可以選擇,我們既然剛講過樸素貝葉斯,剛好就拿來練練手好了。
?????(1) 首先我們來看一下數(shù)據(jù)
- import pandas as pd??
- import numpy as np??
- from sklearn import preprocessing??
- from sklearn.metrics import log_loss??
- from sklearn.cross_validation import train_test_split
- train = pd.read_csv('/Users/liuming/projects/Python/ML數(shù)據(jù)/Kaggle舊金山犯罪類型分類/train.csv', parse_dates = ['Dates'])??
- test = pd.read_csv('/Users/liuming/projects/Python/ML數(shù)據(jù)/Kaggle舊金山犯罪類型分類/test.csv', parse_dates = ['Dates'])??
- train??
?我們依次解釋一下每一列的含義:
- Date: 日期
- Category: 犯罪類型,比如 Larceny/盜竊罪 等.
- Descript: 對于犯罪更詳細的描述
- DayOfWeek: 星期幾
- PdDistrict: 所屬警區(qū)
- Resolution: 處理結(jié)果,比如說『逮捕』『逃了』
- Address: 發(fā)生街區(qū)位置
- X and Y: GPS坐標(biāo)
????????train.csv中的數(shù)據(jù)時間跨度為12年,包含了將近90w的記錄。另外,這部分數(shù)據(jù),大家從上圖上也可以看出來,大部分都是『類別』型,比如犯罪類型,比如星期幾。
? ? (2)特征預(yù)處理
? ? ? ?sklearn.preprocessing模塊中的 LabelEncoder函數(shù)可以對類別做編號,我們用它對犯罪類型做編號;pandas中的get_dummies( )可以將變量進行二值化01向量,我們用它對”街區(qū)“、”星期幾“、”時間點“進行因子化。
- #對犯罪類別:Category; 用LabelEncoder進行編號??
- leCrime = preprocessing.LabelEncoder()??
- crime = leCrime.fit_transform(train.Category)? ?#39種犯罪類型??
- #用get_dummies因子化星期幾、街區(qū)、小時等特征??
- days=pd.get_dummies(train.DayOfWeek)??
- district = pd.get_dummies(train.PdDistrict)??
- hour = train.Dates.dt.hour??
- hour = pd.get_dummies(hour)??
- #組合特征??
- trainData = pd.concat([hour, days, district], axis = 1)? #將特征進行橫向組合??
- trainData['crime'] = crime? ?#追加'crime'列??
- days = pd.get_dummies(test.DayOfWeek)??
- district = pd.get_dummies(test.PdDistrict)??
- hour = test.Dates.dt.hour??
- hour = pd.get_dummies(hour)??
- testData = pd.concat([hour, days, district], axis=1)??
- trainData?
????特征預(yù)處理后,訓(xùn)練集feature,如下圖所示:
? ?(3) 建模
- from sklearn.naive_bayes import BernoulliNB
- import time
- features=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION',??
- 'NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']??
- X_train, X_test, y_train, y_test = train_test_split(trainData[features], trainData['crime'], train_size=0.6)??
- NB = BernoulliNB()??
- nbStart = time.time()??
- NB.fit(X_train, y_train)??
- nbCostTime = time.time() - nbStart??
- #print(X_test.shape)??
- propa = NB.predict_proba(X_test)? ?#X_test為263415*17; 那么該行就是將263415分到39種犯罪類型中,每個樣本被分到每一種的概率??
- print("樸素貝葉斯建模%.2f秒"%(nbCostTime))??
- predicted = np.array(propa)??
- logLoss=log_loss(y_test, predicted)??
- print("樸素貝葉斯的log損失為:%.6f"%logLoss)??
輸出:樸素貝葉斯建模0.55秒 樸素貝葉斯的log損失為:2.582561
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">點贊</span><span class="count">62</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打賞開始--><!--打賞結(jié)束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章舉報</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/fisherming"><img src="https://profile.csdnimg.cn/C/0/A/3_fisherming" class="avatar_pic" username="fisherming"><img src="https://g.csdnimg.cn/static/user-reg-year/1x/3.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/fisherming" data-report-click="{"mod":"popu_379"}" target="_blank">baidu-liuming</a></span></div><div class="text"><span>發(fā)布了119 篇原創(chuàng)文章</span> · <span>獲贊 151</span> · <span>訪問量 27萬+</span></div></div><div class="right-message"><a href="https://im.csdn.net/im/main.html?userName=fisherming" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信</a><a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">關(guān)注</a></div></div></div> </article>
總結(jié)
以上是生活随笔為你收集整理的带你彻彻底底搞懂朴素贝叶斯公式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树--信息增益,信息增益比,Geni
- 下一篇: SVD(奇异值分解)小结