天天看點

手寫Naive Bayes分類器引入實際問題理論知識實作Reference

手寫Naive Bayes分類器

  • 引入
  • 實際問題
  • 理論知識
    • Naive Bayes
    • 貝葉斯定理
      • 公式
      • 推導
  • 實作
  • Reference

哈哈哈,我又回來了,終于快到了喜大普奔的假期時間,讓我們一起快樂的寫部落格吧。收,回正題。今天我們要來手撕一下Naive Bayes Classifier(樸素貝葉斯分類器)。為什麼說手撕呢,是因為這次我們要自己實作Naive Bayes Classifier 除了對資料的處理以外,都不會使用任何外部庫,來一次硬剛!

引入

我們能否在醫療記錄資料集上建立分類器模型,進而預測被研究對象是否患糖尿病?

實際問題

長期以來,研究人員對 Pima Indians(此處暫譯作皮馬印第安人)都有極大的研究興趣,因為他們是世界上糖尿病發病率最高的人群之一。記錄皮馬印第安人醫療資料及是否患有糖尿病的資料集 pima-indians-diabetes.csv 也成為了一個著名的資料集。

該資料集最初歸National Institute of Diabetes and Digestive and Kidney Diseases所有,記錄了懷孕次數、血壓、BMI、年齡等資訊。

手寫Naive Bayes分類器引入實際問題理論知識實作Reference

在本次實驗中,我們将在訓練集上建立 Naive Bayes 分類器,并在測試集上評估模型的精度。

理論知識

之前在ISL-Chap2剩餘部分筆記的貝葉斯分類器部分大略提過一下貝葉斯分類器,但是由于那篇文章的重點在如何衡量模型好壞,是以主要描述了bayers error rate(衡量貝葉斯分類器的好壞)。這一次,我們來詳細寫一下貝葉斯分類器的原理。

Naive Bayes

首先,我們先回顧一下 Naive Bayes Classifier 的目的。既然是分類器,要做的就是根據一部分資訊( X ⃗ \vec{X} X

)預測其對應的 label ( Y Y Y)。拿我們這次的實際問題舉例,就是把一個人的懷孕次數、血壓、BMI、年齡等資訊作為輸入,扔進訓練好的Naive Bayes Classifier 中,讓它預測這個人有沒有患糖尿病。

手寫Naive Bayes分類器引入實際問題理論知識實作Reference

了解了分類器的目的以後,讓我們換一個角度來思考這個問題。如果我們用機率的思維方式來思考這件事,其實也就變成了,我們要找到給定某個 X ⃗ \vec{X} X

的情況下,label取哪個值的機率更高。拿這次的實際問題舉例,假定我們現在有了一個人的懷孕次數、血壓、BMI、年齡的資料,構成了向量 X ⃗ = ( 1 , 74 , 25.6 , 30 ) \vec{X}=(1, 74, 25.6, 30) X

=(1,74,25.6,30), 我們想要知道她是患糖尿病的機率大還是不患糖尿病的機率大(Y=1還是Y=0的機率大)。

抽象一點,用數學公式表示,也就是找到使得 P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X

)最大的Y。

但是這裡就出現問題了, P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X

)是多少鴨,我們不知道鴨。憋着急,現在就輪到貝葉斯定理閃亮登場了。

P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) {\displaystyle P(A|B)={\frac {P(A)\times P(B|A)}{P(B)}}} P(A∣B)=P(B)P(A)×P(B∣A)​

PS:不了解貝葉斯定理的盆友請手動翻到後面貝葉斯定理的部分哈。

把我們的 P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X

)帶進去也就變成了

P ( Y ∣ X ⃗ ) = P ( Y ) × P ( X ⃗ ∣ Y ) P ( X ⃗ ) {\displaystyle P(Y|\vec{X})={\frac {P(Y)\times P(\vec{X}|Y)}{P(\vec{X})}}} P(Y∣X

)=P(X

)P(Y)×P(X

∣Y)​

我們現在的任務是找出給定 X ⃗ \vec{X} X

的情況下哪個 Y Y Y的 P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X

)最大,但是 P ( X ⃗ ) P(\vec{X}) P(X

)是一個常數,是以其實不需要比較。

那麼我們的任務也就變成了:

找到使 P ( Y ) × P ( X ⃗ ∣ Y ) P(Y)\times P(\vec{X}|Y) P(Y)×P(X

∣Y)最大,即使 ( ∏ i P ( x ( i ) ∣ y ) ) × P ( y ) (\prod_iP(x^{(i)} |y))\times P(y) (i∏​P(x(i)∣y))×P(y)最大的 y y y。(我們假設其互相獨立)

這裡需要提示一下,在實際操作中我們如果真的把這麼多小于1的 float 乘起來,由于精度的問題,很有可能就會得到 0。是以為了避免這種情況,我們對整個式子取 l o g log log。這樣式子就變成了:

( ∑ i l o g p ( x ( i ) ∣ y ) ) + l o g p ( y ) (\sum_ilog p(x^{(i)}|y)) + logp(y) (i∑​logp(x(i)∣y))+logp(y)

走到這裡,我們就可以開始模組化了。把式子拆開來看,我們需要給 l o g p ( y ) log p(y) logp(y)以及每個 l o g p ( x ( i ) ∣ y ) logp(x^{(i)}|y) logp(x(i)∣y)模組化。

l o g p ( y ) log p(y) logp(y)比較好辦,隻要在 training set 裡面數一下就好了(有多少人患糖尿病,有多少人未患糖尿病)

l o g p ( x ( i ) ∣ y ) logp(x^{(i)}|y) logp(x(i)∣y)會相對複雜一點,因為我們并不知道它的分布究竟是怎樣的。但是我們其實可以不用太擔心這個小模型的精度,因為我們的最終目的其實是把 y y y 分開。也就是說,隻要取正确那一類的得分大于取其他類的得分就好。(本次實驗中,我們對所有的 p ( x ( i ) ∣ y ) p(x^{(i)}|y) p(x(i)∣y) 使用Gaussian distribution,也就是正态分布)

f ( x ) = 1 σ 2 π   e − ( x − μ ) 2 2 σ 2 f(x) = {1 \over \sigma\sqrt{2\pi} }\,e^{- {{(x-\mu )^2 \over 2\sigma^2}}} f(x)=σ2π

​1​e−2σ2(x−μ)2​

貝葉斯定理

公式

P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) {\displaystyle P(A|B)={\frac {P(A)\times P(B|A)}{P(B)}}} P(A∣B)=P(B)P(A)×P(B∣A)​

推導

其實它的推導并不麻煩,這裡我們通過條件機率公式來推導

已知:

P ( A ∣ B ) = P ( A ∩ B ) P ( B ) {\displaystyle P(A|B)={\frac {P(A\cap B)}{P(B)}}} P(A∣B)=P(B)P(A∩B)​

也就可以得出:

P ( A ∩ B ) = P ( A ) × P ( B ∣ A ) = P ( B ) × P ( A ∣ B ) {P(A\cap B) = P(A)\times P(B|A) = P(B)\times P(A|B)} P(A∩B)=P(A)×P(B∣A)=P(B)×P(A∣B)

接下來把 P ( B ) P(B) P(B)移一下項,就可以得到貝葉斯公式啦。

實作

這裡我會把思路捋一遍,就不貼代碼了,如果有實在需要代碼的盆友,請私信。

手寫Naive Bayes分類器引入實際問題理論知識實作Reference
calculate p(y=1), p(y=0)
for i in [0,9]:
	select 20% as test set, the rest as a training set
	use training set calculate:
		mu(i), sigma(i), y=1
		mu(i), sigma(i), y=0
	in test set calculate:
		p(y=0|x), p(y=1|x)
		compare p(y=0|x) and p(y=1|x), choose the higher one as prediction
	compare real label(test set) and prediction(test set) to calculate accuracy
caculate average of accuracy
           

Reference

1.WHY ARE THE PIMA INDIANS SICK? STUDIES ON ARIZONA TRIBE SHOW EXCESSIVE RATES OF DIABETES, OBESITY AND KIDNEY DISEASE

https://www.washingtonpost.com/archive/lifestyle/wellness/1993/03/30/why-are-the-pima-indians-sick-studies-on-arizona-tribe-show-excessive-rates-of-diabetes-obesity-and-kidney-disease/1f978958-e73b-483a-9af9-47d9efdad534/?noredirect=on&utm_term=.435be284734b

2.pima-indians-diabetes.csv

https://www.kaggle.com/kumargh/pimaindiansdiabetescsv

3.ISL-Chap2剩餘部分筆記(回歸問題、分類問題,如何衡量模型的好壞)

https://blog.csdn.net/qq_31584013/article/details/85511593

4.條件機率

https://zh.wikipedia.org/wiki/條件機率

繼續閱讀