sklearn學習03——Bayes

hitsugaya837 2022-01-07 16:02:26 阅读数:154

sklearn bayes


前言

本篇首先介紹樸素貝葉斯分類器的原理(參考西瓜書),最後使用 sklearn 簡單實現它。

一、樸素貝葉斯

1.1、貝葉斯分類器的理論框架

貝葉斯分類器的理論框架基於貝葉斯决策論(Bayesian decision theory),而貝葉斯决策論是概率框架下實施决策的基本方法。對分類任務來說,在所有相關概率都已知的理想情形下,貝葉斯决策論考慮如何基於這些概率和誤判損失來選擇最優的類別標記。

具體來說,若目標是最小化分類錯誤率,則我們要找的就是:對於每個樣本 x,選擇能使後驗概率 P(C | x)最大的類別標記。 即如下公式:
最優分類
其中 h*(x)為貝葉斯最優分類器。然而在現實任務中,後驗概率 P(C | x)通常難以直接獲得,從這個角度來看,機
器學習所要實現的是基於有限的訓練樣本集盡可能准確地估計出後驗概率P(C | x)。所以貝葉斯分類器使用的策略是: 生成式模型,先對聯合概率分布 P(x,C)建模,然後再由此獲得 P(C | x)。

基於條件概率的定義,有:
後驗概率
再根據貝葉斯定理,可將後驗概率轉化為:
後驗概率2
由以上公式可知,最終貝葉斯分類器將 求解後驗概率的問題 轉化為了 求先驗概率P(C)和 類條件概率P(x | C)的問題

1.2、樸素貝葉斯分類器

由 1.1 節最終的後驗概率公式(貝葉斯公式)可知,估計後驗概率的最大困難在於:類條件概率P(x | C)是 x樣本上所有屬性上的聯合概率,這很難從有限的訓練樣本直接估計得到。原因有以下兩點:

  • 基於有限訓練樣本直接估計聯合概率,在計算上鬥爭會遭遇紐合爆炸問題;
  • 在數據上將會遭遇樣本稀疏問題,屬性數越多,問題越嚴重。

西瓜書上的一個舉例:假設樣本的 d 個屬性都是二值的,則樣本空間將有 2^d 種可能的取值,在現實應用中,這個值往往遠大於訓練樣本數 m ,也就是說,很多樣本取值在訓練集中根本沒有出現,直接使用頻率來估計 P(x | C) 顯然不可行,因為 “未被觀測到” 與 “出現概率為零” 通常是不同的。

所以,為了避開這個障礙,樸素貝葉斯分類器采用了 “屬性條件獨立性假設”:對已知類別,假設所有屬性相互獨立。換言之,假設每個屬性獨立地對分類結果發生影響。則基於此假設,後驗概率計算公式可變為如下:
後驗概率3
因為最終計算的是,在樣本 x這個樣本確定的條件下,看它屬於哪一類的概率高,即後驗概率高的那一類作為最終類別,分母均為 P(x),所以分母不需要求了,樸素貝葉斯分類器最終的目標就是:
樸素貝葉斯分類
在實際計算中,上面的公式會做如下略微改動:

  • 由於某些特征屬性的值P(xi | Ci)可能很小,多個特征的 P 值連乘後可能約等於0。可以公式兩邊取 log 然後變乘法為加法,避免類乘問題。
  • P(Ci) 和P(xi | Ci)一般不直接使用樣本的頻率計算出來,一般會使用拉普拉斯平滑。如下公式:
    平滑
    其中,Dc 為該類別的頻數(屬於該類別的有多少個樣本),N 錶示所有類別的可能數(有多少類別)。
    平滑2
    其中,Dc,xi 為該特征對應屬性的頻數,Dc 為該類別的頻數,Ni錶示該特征的可能的屬性數。

1.3、樸素貝葉斯的代碼實現

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from sklearn.datasets import make_blobs
# make_blobs:為聚類產生數據集
# n_samples:樣本點數,n_features:數據的維度,centers:產生數據的中心點,默認值3
# cluster_std:數據集的標准差,浮點數或者浮點數序列,默認值1.0,random_state:隨機種子
X, y = make_blobs(n_samples = 100, n_features=2, centers=2, random_state=2, cluster_std=1.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
plt.show()
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X, y)
rng = np.random.RandomState(0)
X_test = [-6, -14] + [14, 18] * rng.rand(2000, 2)
y_pred = model.predict(X_test)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
lim = plt.axis()
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, s=20, cmap='RdBu', alpha=0.1)
plt.axis(lim)
plt.show()
yprob = model.predict_proba(X_test)
yprob[-8:].round(2)

分類結果

總結

  • 貝葉斯是一種生成式模型,不是直接擬合分類結果,而是擬合出後驗概率公式計算對應分類的概率。
  • 對於小規模數據集,錶現良好。
  • 樸素貝葉斯分類器是建立在特征相互獨立的假設上的。
  • 拉普拉斯修正較好地解决了先驗概率、類條件概率中某一項為 0 ,最後得到 0 值的問題。
版权声明:本文为[hitsugaya837]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071602258927.html