Python機器學習筆記(1)——貝葉斯分類器—MultinomialNB


一、內容大綱

1,貝葉斯定理

一、貝葉斯定理

假設對於某個數據集,隨機變量C表示樣本為C類的概率,F1表示測試樣本某特征出現的概率,套用基本貝葉斯公式,則如下所示:

上式表示對於某個樣本,特征F1出現時,該樣本被分為C類的條件概率。那么如何用上式來對測試樣本分類呢?

舉例來說,有個測試樣本,其特征F1出現了(F1=1),那么就計算P(C=0|F1=1)和P(C=1|F1=1)的概率值。前者大,則該樣本被認為是0類;后者大,則分為1類。

對該公示,有幾個概念需要熟知:

先驗概率(Prior)。P(C)是C的先驗概率,可以從已有的訓練集中計算分為C類的樣本占所有樣本的比重得出。

證據(Evidence)。即上式P(F1),表示對於某測試樣本,特征F1出現的概率。同樣可以從訓練集中F1特征對應樣本所占總樣本的比例得出。

似然(likelihood)。即上式P(F1|C),表示如果知道一個樣本分為C類,那么他的特征為F1的概率是多少。

對於多個特征而言,貝葉斯公式可以擴展如下:

分子中存在一大串似然值。當特征很多的時候,這些似然值的計算是極其痛苦的。現在該怎么辦?

二、朴素貝葉斯算法

朴素貝葉斯算法,是基於貝葉斯定理與特征條件獨立假設的分類與方法;
為了簡化計算,朴素貝葉斯算法做了一假設:“朴素的認為各個特征相互獨立”。這么一來,上式的分子就簡化成了:

P(C)P(F1|C)P(F2|C)...P(Fn|C)。

這樣簡化過后,計算起來就方便多了。

這個假設是認為各個特征之間是獨立的,看上去確實是個很不科學的假設。因為很多情況下,各個特征之間是緊密聯系的。然而在朴素貝葉斯的大量應用實踐實際表明其工作的相當好。

其次,由於朴素貝葉斯的工作原理是計算P(C=0|F1...Fn)和P(C=1|F1...Fn),並取最大值的那個作為其分類。而二者的分母是一模一樣的。因此,我們又可以省略分母計算,從而進一步簡化計算過程。

另外,貝葉斯公式推導能夠成立有個重要前期,就是各個證據(evidence)不能為0。也即對於任意特征Fx,P(Fx)不能為0。而顯示某些特征未出現在測試集中的情況是可以發生的。因此實現上通常要做一些小的處理,例如把所有計數進行+1(加法平滑(additive smoothing,又叫拉普拉斯平滑(Laplace smothing))。而如果通過增加一個大於0的可調參數alpha進行平滑,就叫Lidstone平滑。

例如,在所有6個分為C=1的影評樣本中,某個特征F1=1不存在,則P(F1=1|C=1) = 0/6,P(F1=0|C=1) = 6/6。

經過加法平滑后,P(F1=1|C=1) = (0+1)/(6+2)=1/8,P(F1=0|C=1) = (6+1)/(6+2)=7/8。

注意分母的+2,這種特殊處理使得2個互斥事件的概率和恆為1。

最后,我們知道,當特征很多的時候,大量小數值的小數乘法會有溢出風險。因此,通常的實現都是將其轉換為log:

log[P(C)P(F1|C)P(F2|C)...P(Fn|C)] = log[P(C)]+log[P(F1|C)] + ... +log[P(Fn|C)]

將乘法轉換為加法,就徹底避免了乘法溢出風險。

此處,以python iris數據為例,從python導入from sklearn.datasets import load_iris

上述訓練集中共8個樣本,其中C=0的5個,C=1的3個。現在,假設給你一個測試樣本"花萼長度(F1)=4.6,花瓣長度(F2)=1.5",使用加一平滑進行朴素貝葉斯的分類過程如下:

P(C=0)=5/8, P(C=1)=3/8。特征F1="4.6", F2="1.5"。

分為C=0的概率:P(F1=1, F2=1|C=0) = P(C=0)P(F1=4.6|C=0)P(F2=1.5|C=0) = 5/8 * (1+1)/(5+2) * (1+1)/(5+2) = 5/8 * 2/7 * 2/7 = 0.05。

分為C=1的概率:P(F1=1, F2=1|C=1) = P(C=1)P(F1=4.6|C=0)P(F2=1.5|C=0) = 3/8 * (1+1)/(3+2) * (2+1)/(3+2) = 3/8 * 2/5 * 3/5 = 0.09。

分為C=1的概率更大。因此將該樣本分為C=1類。

三、數據模型的建立

3.1 Iris花分類

# 導入pd、np庫
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 導入數據源
from sklearn.datasets import load_iris
#導入交叉驗證庫
from sklearn.model_selection import train_test_split
#導入GaussianNB庫
from sklearn.naive_bayes import GaussianNB

iris = load_iris()
#設置特征X
X = iris.data
#設置目標Y
y = iris.target

#將數據集拆分為訓練集和測試集,其中訓練集為原數據集的60%,測試集為40%。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=524)

#建立高斯朴素貝葉斯模型。
clf=GaussianNB()

#使用訓練集對模型進行訓練
clf.fit(X_train,y_train)
GaussianNB(priors=None)

#使用測試集數據檢驗模型准確率
clf.score(X_test,y_test)

#給一組數據[5.9,3.2,5.1,2.1]進行預測
clf.predict([[5.9,3.2,5.1,2.1]])
文章部分轉載:https://www.cnblogs.com/qianyin123/p/9553820.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM