stick-learn朴素貝葉斯的三個常用模型:高斯、多項式、伯努利


朴素貝葉斯是一個很不錯的分類器,在使用朴素貝葉斯分類器划分郵件有關於朴素貝葉斯的簡單介紹。

一個樣本有n個特征,分別用x1,x2,...,xn表示,將其划分到類yk的可能性P(yk|x1,x2,...,xn)為:

P(yk|x1,x2,...,xn)=P(yk)ni=1P(xi|yk)

上式中等號右側的各個值可以通過訓練得到。根據上面的公式可以求的某個數據屬於各個分類的可能性(這些可能性之和不一定是1),該數據應該屬於具有最大可能性的分類中。

一般來說,如果一個樣本沒有特征xi,那么P(xi|yk)將不參與計算。不過下面的伯努利模型除外。

以上是朴素貝葉斯的最基本的內容。

高斯模型


有些特征可能是連續型變量,比如說人的身高,物體的長度,這些特征可以轉換成離散型的值,比如如果身高在160cm以下,特征值為1;在160cm和170cm之間,特征值為2;在170cm之上,特征值為3。也可以這樣轉換,將身高轉換為3個特征,分別是f1、f2、f3,如果身高是160cm以下,這三個特征的值分別是1、0、0,若身高在170cm之上,這三個特征的值分別是0、0、1。不過這些方式都不夠細膩,高斯模型可以解決這個問題。高斯模型假設這些一個特征的所有屬於某個類別的觀測值符合高斯分布,也就是:

P(xi|yk)=12πσ2yk√exp((xiμyk)22σ2yk)

下面看一個sklearn中的示例:

>>> from sklearn import datasets >>> iris = datasets.load_iris() >>> iris.feature_names # 四個特征的名字 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] >>> iris.data array([[ 5.1, 3.5, 1.4, 0.2], [ 4.9, 3. , 1.4, 0.2], [ 4.7, 3.2, 1.3, 0.2], [ 4.6, 3.1, 1.5, 0.2], [ 5. , 3.6, 1.4, 0.2], [ 5.4, 3.9, 1.7, 0.4], [ 4.6, 3.4, 1.4, 0.3], [ 5. , 3.4, 1.5, 0.2], ...... [ 6.5, 3. , 5.2, 2. ], [ 6.2, 3.4, 5.4, 2.3], [ 5.9, 3. , 5.1, 1.8]]) #類型是numpy.array >>> iris.data.size 600 #共600/4=150個樣本 >>> iris.target_names array(['setosa', 'versicolor', 'virginica'], dtype='|S10') >>> iris.target array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ......, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) >>> iris.target.size 150 >>> from sklearn.naive_bayes import GaussianNB >>> clf = GaussianNB() >>> clf.fit(iris.data, iris.target) >>> clf.predict(iris.data[0]) array([0]) # 預測正確 >>> clf.predict(iris.data[149]) array([2]) # 預測正確 >>> data = numpy.array([6,4,6,2]) >>> clf.predict(data) array([2]) # 預測結果很合理 

多項式模型


該模型常用於文本分類,特征是單詞,值是單詞的出現次數。

P(xi|yk)=Nykxi+αNyk+αn

其中,Nykxi是類別yk下特征xi出現的總次數;Nyk是類別yk下所有特征出現的總次數。對應到文本分類里,如果單詞word在一篇分類為label1的文檔中出現了5次,那么Nlabel1,word的值會增加5。如果是去除了重復單詞的,那么Nlabel1,word的值會增加1。n是特征的數量,在文本分類中就是去重后的所有單詞的數量。α的取值范圍是[0,1],比較常見的是取值為1。

待預測樣本中的特征xi在訓練時可能沒有出現,如果沒有出現,則Nykxi值為0,如果直接拿來計算該樣本屬於某個分類的概率,結果都將是0。在分子中加入α,在分母中加入αn可以解決這個問題。

下面的代碼來自sklearn的示例:

>>> import numpy as np >>> X = np.random.randint(5, size=(6, 100)) >>> y = np.array([1, 2, 3, 4, 5, 6]) >>> from sklearn.naive_bayes import MultinomialNB >>> clf = MultinomialNB() >>> clf.fit(X, y) MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) >>> print(clf.predict(X[2])) [3] 

值得注意的是,多項式模型在訓練一個數據集結束后可以繼續訓練其他數據集而無需將兩個數據集放在一起進行訓練。在sklearn中,MultinomialNB()類的partial_fit()方法可以進行這種訓練。這種方式特別適合於訓練集大到內存無法一次性放入的情況。

在第一次調用partial_fit()時需要給出所有的分類標號。

>>> import numpy >>> from sklearn.naive_bayes import MultinomialNB >>> clf = MultinomialNB() >>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb']) GaussianNB() >>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb'])) GaussianNB() >>> clf.predict(numpy.array([9,1])) array(['bb'], dtype='|S2') 

伯努利模型


伯努利模型中,對於一個樣本來說,其特征用的是全局的特征。

在伯努利模型中,每個特征的取值是布爾型的,即true和false,或者1和0。在文本分類中,就是一個特征有沒有在一個文檔中出現。

如果特征值xi值為1,那么

P(xi|yk)=P(xi=1|yk)

如果特征值xi值為0,那么

P(xi|yk)=1P(xi=1|yk)

這意味着,“沒有某個特征”也是一個特征。 下面的示例來自sklearn官方文檔:

>>> import numpy as np >>> X = np.random.randint(2, size=(6, 100)) >>> Y = np.array([1, 2, 3, 4, 4, 5]) >>> from sklearn.naive_bayes import BernoulliNB >>> clf = BernoulliNB() >>> clf.fit(X, Y) BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True) >>> print(clf.predict(X[2])) [3] 

BernoulliNB()類也有partial_fit()函數。

多項式模型和伯努利模型在文本分類中的應用


基於naive bayes的文本分類算法給出了很好的解釋。

在多項式模型中:

在多項式模型中, 設某文檔d=(t1,t2,…,tk),tk是該文檔中出現過的單詞,允許重復,則

先驗概率P(c)= 類c下單詞總數/整個訓練樣本的單詞總數

類條件概率P(tk|c)=(類c下單詞tk在各個文檔中出現過的次數之和+1)/(類c下單詞總數+|V|)

V是訓練樣本的單詞表(即抽取單詞,單詞出現多次,只算一個),|V|則表示訓練樣本包含多少種單詞。 P(tk|c)可以看作是單詞tk在證明d屬於類c上提供了多大的證據,而P(c)則可以認為是類別c在整體上占多大比例(有多大可能性)。

在伯努利模型中:

P(c)= 類c下文件總數/整個訓練樣本的文件總數

P(tk|c)=(類c下包含單詞tk的文件數+1)/(類c下單詞總數+2)

參考


http://scikit-learn.org/stable/modules/naive_bayes.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html

http://cn.soulmachine.me/blog/20100528/


免責聲明!

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



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