天天看點

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

樸素貝葉斯

文章目錄

  • 樸素貝葉斯
    • 1、機率基礎
      • 随機事件
      • 樣本空間
      • 機率
      • 聯合機率
      • 條件機率
      • 獨立性
      • 全機率公式
      • 貝葉斯公式
    • 2、樸素貝葉斯
    • 3、拉普拉斯平滑處理
    • 4、算法處理流程
    • 5、sklearn中的樸素貝葉斯
      • 高斯樸素貝葉斯
      • 多項式樸素貝葉斯
      • 伯努利樸素貝葉斯
    • 6、python實作
      • 高斯樸素貝葉斯
      • 多項式樸素貝葉斯——用于文本分類
      • 伯努利樸素貝葉斯
    • 7、樸素貝葉斯算法的優缺點

樸素貝葉斯模型(Naive Bayesian Model,NBM)

樸素貝葉斯分類器是一個以貝葉斯定理為基礎 的多分類的分類器。 對于給定資料,首先基于特征的條件獨立性假設,學習輸入輸出的聯合機率分布,然後基于此模型,對給定的輸入X,利用貝葉斯定理求出後驗機率最大的輸出Y。

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

1、機率基礎

随機事件

随機事件是在随機試驗中,可能出現也可能不出現,而在大量重複試驗中具有某種規律性的事件叫做随機事件(簡稱事件)。

例如,當我們抛硬币的時候,設出現正面為事件A,則事件A可能發生,也可能不發生。

樣本空間

随機試驗E的所有基本結果組成的集合為E的樣本空間。樣本空間的元素稱為樣本點或基本事件。習慣用S表示。

機率

機率,亦稱“或然率”,它是反映随機事件出現的可能性(likelihood)大小。習慣用P(A)來表示事件A的機率。

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

從面積的角度,也可以這樣表示:

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

聯合機率

聯合機率是指在多元的機率分布中多個随機變量分别滿足各自條件的機率。假設X和Y都服從正态分布,那麼P{X<4,Y<0}就是一個聯合機率,表示X<4,Y<0兩個條件同時成立的機率。表示兩個事件共同發生的機率。A與B的聯合機率表示為 P(AB) 或者P(A,B),或者P(A∩B)。

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯
機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

條件機率

條件機率是指事件A在另外一個事件B已經發生條件下的發生機率。條件機率表示為:P(A|B),讀作“在B的條件下A的機率”。

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

獨立性

設A,B為随機事件,若同時發生的機率等于各自發生的機率的乘積,則A,B互相獨立。

一般地,設A1,A2,…,An是n(n≥2) 個事件,如果對于其中任意2個,任意3個,…,任意n個事件的積事件的機率,都等于各事件機率之積,則稱A1,A2,…,An互相獨立。

定義

若AB兩事件滿足等式

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

則稱事件A與B互相獨立。

全機率公式

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

貝葉斯公式

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

2、樸素貝葉斯

樸素貝葉斯表達式:

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

目标函數為

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

3、拉普拉斯平滑處理

缺陷:受樣本個數限制,若某個屬性值在訓練集中沒有與某個同類同時出現過,則連乘公式結果則必為零,其他屬性取任意值都不能改變這一結論。

修正:拉普拉斯平滑處理

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

N表示訓練集樣本的類别數,Ni表示訓練集樣本在第 i 個屬性上的取值個數

4、算法處理流程

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

5、sklearn中的樸素貝葉斯

在sklearn庫中,實作了三個樸素貝葉斯分類器,如下表所示:

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

差別在于假設某一特征的所有屬于某個類别的觀測值符合特定分布,如高斯樸素貝葉斯:分類問題的特征包括人的身高,身高符合高斯分布,這類問題适合高斯樸素貝葉斯。

高斯樸素貝葉斯

  • 機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯
    是連續變量時,我們可以使用高斯樸素貝葉斯(Gaussian Naive Bayes)完成分類任務。
  • 當處理連續資料時,一種經典的假設是:與每個類相關的連續變量的分布是基于高斯分布的

高斯貝葉斯的公式如下:

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯
機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

多項式樸素貝葉斯

多項式樸素貝葉斯:适用于特征為離散變量時的多分類情景

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

伯努利樸素貝葉斯

适用于二分類情景

設實驗E隻有兩個可能的結果,A與非A,則稱E為伯努利實驗

伯努利樸素貝葉斯,适用于離散變量,其假設各個特征Xi在各個類别下y下是服從n重伯努利分布(二項分布)的,因為伯努利實驗僅有兩個結果,是以算法會首先對特征值進行二值化處理(假設二值化的結果為1和0)

機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

6、python實作

  • naive Bayes is a decent classifier, but a bad estimator

高斯樸素貝葉斯

  • 構造方法:sklearn.naive_bayes.GaussianNB

GaussianNB 類構造方法無參數,屬性值有:

  • class_prior_

    #每一個類的機率

  • theta_

    #每個類中各個特征的平均

  • sigma_

    #每個類中各個特征的方差

注:GaussianNB 類無score 方法

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB

np.random.seed(0)
X = np.random.randint(0, 10, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

gnb = GaussianNB() 
gnb.fit(X, y)
# 每個類别的先驗機率。P(y)
print("機率:", gnb.class_prior_)
# 每個類别樣本的數量。
print("樣本數量:", gnb.class_count_) 
# 每個類别的标簽。
print("标簽", gnb.classes_) 
# 每個特征在每個類别下的均值。 
print("均值:", gnb.theta_) 
# 每個特征在每個類别下的方差。 
print("标準差:", gnb.sigma_)

# 測試集
X_test = np.array([[6, 3]])
print("預測結果:", gnb.predict(X_test)) 
print("預測結果機率:", gnb.predict_proba(X_test))
print("預測結果:", np.argmax(gnb.predict_proba(X_test)))
           
機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

多項式樸素貝葉斯——用于文本分類

構造方法:

sklearn.naive_bayes.MultinomialNB(alpha=1.0 #平滑參數 
   , fit_prior=True    #學習類的先驗機率 
   , class_prior=None)    #類的先驗機率 
           
from sklearn.naive_bayes import MultinomialNB

np.random.seed(0)
X = np.random.randint(0, 4, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

mnb = MultinomialNB() 
mnb.fit(X, y)
# 每個類别的樣本數量。
print(mnb.class_count_)
# 每個特征在每個類别下發生(出現)的次數。 
print(mnb.feature_count_)
# 每個類别下,每個特征所占的比例(機率),即P(x}y)。注意,該值為機率 
# 取對數之後的結果,如果需要檢視原有的機率,需要使用指數還原。 
print(np.exp(mnb.feature_log_prob_))
           
機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

伯努利樸素貝葉斯

from sklearn.naive_bayes import BernoulliNB

np.random.seed(0)
X = np.random.randint(-5, 5, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

bnb = BernoulliNB()
bnb.fit(X, y)
# 每個特征在每個類别下發生(出現)的次數。因為伯努利分布隻有兩個值,
# 我們隻需要計算出現的機率P(x=1|y),不出現的機率P(x=0|y)使用1減去P(x=1|y)即可。 
print("數值1出現次數:", bnb.feature_count_)
# 每個類别樣本所占的比重,即P(y)。注意,該值為機率取對數之後的結果,如果需要檢視
# 原有的機率,需要使用指數還原。
print("類别占比p(y):", np.exp(bnb.class_log_prior_))
# 每個類别下,每個特征(值為1)所占的比例(機率),即P(x}y)。注意,該值為機率 
#取對數之後的結果,如果需要檢視原有的機率,需要使用指數還原。
print("特征機率:", np.exp(bnb.feature_log_prob_))
           
機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

7、樸素貝葉斯算法的優缺點

樸素貝葉斯是典型的生成學習方法,由訓練資料學習聯合機率分布,并求得後驗機率分布。

樸素貝葉斯一般在小規模資料上的表現很好,适合進行多分類任務

算法優點

相比較與其他算法,樸素貝葉斯算法具有下面兩大優勢:

  • 在訓練集資料較少的情況下,也能夠實作預測,且效果不錯
  • 算法訓練速度非常快
    機器學習筆記--4、樸素貝葉斯及python實作樸素貝葉斯

算法缺點

  • 屬性獨立性的條件同時也是樸素貝葉斯分類器的不足之處。
  • 資料集屬性的獨立性在很多情況下是很難滿足的,因為資料集的屬性之間往往都存在着互相關聯,如果在分類過程中出現這種問題,會導緻分類的效果大大降低

詳細代碼我将放在GitHub上,需要的小朋友們可自行下載下傳:點此進入GitHub

前文回顧:

機器學習筆記 – 1、認識機器學習

機器學習筆記 – 2、回歸分析及python實作

機器學習筆記 – 3、KNN及python實作