Python貝葉斯文本分類模型從原理到實現(xiàn)_第1頁
Python貝葉斯文本分類模型從原理到實現(xiàn)_第2頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Python貝葉斯文本分類模型從原理到實現(xiàn)樸素貝葉斯分類器是一種有監(jiān)督學(xué)習(xí),常見有兩種模型,多項式模型(multinomialmodel)即為詞頻型和伯努利模型(Bernoullimodel)即文檔型。二者的計算粒度不一樣,多項式模型以單詞為粒度,伯努利模型以文件為粒度,因此二者的先驗概率和類條件概率的計算方法都不同。計算后驗概率時,對于一個文檔d,多項式模型中,只有在d中出現(xiàn)過的單詞,才會參與后驗概率計算,伯努利模型中,沒有在d中出現(xiàn),但是在全局單詞表中出現(xiàn)的單詞,也會參與計算,不過是作為“反方”參與的(避免消除測試文檔時類條件概率中有為0現(xiàn)象而做的取對數(shù)等問題)。一、數(shù)據(jù)集數(shù)據(jù)集是有8個分

2、類的文本數(shù)據(jù)集,使用了結(jié)巴分詞對每個文本分詞,每個單詞當作特征,再利用二元詞串構(gòu)造更多特征,然后去掉停用詞,去掉出現(xiàn)次數(shù)太多和太少的特征,得到了19630個特征。取1998個樣本用于訓(xùn)練,509個用于測試?;谠~袋模型的思路將每個文本轉(zhuǎn)換為向量,訓(xùn)練集和測試集分別轉(zhuǎn)換為矩陣,并用pythonnumpy模塊將其保存為npy格式。數(shù)據(jù)集共使用了19630個單詞作為特征,特征值是詞在文本中出現(xiàn)的次數(shù)。8個分類,分別是1、2、.、8。訓(xùn)練集共1998個樣本,測試集共509個樣本。二、樸素貝葉斯分類器劃分郵件算法樸素貝葉斯分類器,基于貝葉斯定理,是一個表現(xiàn)良好的分類方法。1、公式原理推導(dǎo)主要根據(jù)事件間的

3、相互影響進行公式推斷。1.1、條件概率:P(A|B)=P(A,B)/P(B)A和B是隨機事件,P(A|B)也就是在事件B發(fā)生的前提下事件A發(fā)生的概率。P(A,B)表示A、B都發(fā)生的概率。這樣一來,我們可以通過統(tǒng)計結(jié)果計算條件概率。例如假設(shè)有1000封郵件,垃圾郵件有300封,出現(xiàn)單詞購買的郵件為50封,而即是垃圾郵件又同時出現(xiàn)了購買這個單詞的郵件共有20封。如果把垃圾郵件看成事件A,郵件里出現(xiàn)單詞購買看成事件B,那么P(A)是指垃圾郵件出現(xiàn)的概率,因為沒考慮其他的因素對A的影響,也可以將P(A)看做A的先驗概率,這里:P(A)=300/1000=0.3同理,P(B)=50/1000=0.05P

4、(A,B)是指A和B同時發(fā)生的概率,P(A,B)=20/1000=0.02根據(jù)條件概率的公式,能夠得到P(A|B)=0.02/0.05=0.4因為有B的影響,P(A|B)也叫做A的后驗概率。1.2、相互獨立事件如果事件A和B是相互獨立的,代表著A發(fā)生的可能性對B發(fā)生的可能性沒有影響,B也對A沒有影響,在這種情況下:P(A,B)=P(A)*P(B)。既然A和B之間沒有相互影響,那么:P(A|B)=P(A,B)/P(B)=P(A)P(B|A)=P(A,B)/P(A)=P(B)1.3、貝葉斯定理由P(A|B)=P(A,B)/P(B)很容易推出:P(A|B)=P(B|A)*P(A)/P(B)這也就是貝

5、葉斯公式了。1.4、樸素貝葉斯分類器(naiveBayesclassifier)首先有以下定理:如果B、C相互獨立,那么P(B|C,A)=P(B|A)。設(shè)有事件A、B1、B2,那么在B1、B2同時發(fā)生的前提下,A發(fā)生的概率是:P(A|B1,B2)=P(B1,B2|A)*P(A)/P(B1,B2)如果B1和B2相互獨立,那么有P(B1,B2|A)=P(B1|B2,A)*P(B2|A)=P(B1|A)*P(B2|A)于是,P(A|B1,B2)=P(B1,B2|A)*P(A)/P(B1,B2)=P(B1|A)*P(B2|A)*P(A)/P(B1,B2)根據(jù)實際需求,假設(shè)某個體有n項特征(可以看著郵件

6、中出現(xiàn)的詞語),分別為F1、F2、Fn?,F(xiàn)有m個類別(可以看著郵件的分類),分別為C1、C2、Cm。貝葉斯分類器就是計算出概率最大的那個分類,也就是求下面這個算式的最大值(即算出每個分類的概率,以最大概率為最終分類):P(C|F1,F2,.,Fn)=P(F1,F2,.,Fn|C)*P(C)/P(F1,F2,.,Fn)由于P(F1,F2,.,Fn)對于所有的類別都是相同的,可以省略,問題就變成了求P(F1,F2,.,Fn|C)*P(C)的最大值。樸素貝葉斯分類器則是更進一步,假設(shè)所有特征都彼此獨立,因此P(F1,F2,.,Fn|C)*P(C)=P(F1|C)*P(F2|C)*.*P(Fn|C)*

7、P(C)樸素貝葉斯分類器假設(shè)所有特征都彼此獨立存在一定的不合理性,不過該分類器一般能取得很好的分類效果。2、判斷郵件是否為垃圾郵件假定我們現(xiàn)在有1000封被標識的郵件作為訓(xùn)練集,訓(xùn)練集一般是人工標識,分為“垃圾郵件”、“正常郵件”。注意,訓(xùn)練集不宜人為地從大量郵件中有意挑揀,而應(yīng)隨機挑揀。然后我們從郵件中選取特征,例如我們把單詞“購買”是否出現(xiàn)在郵件中看作是該郵件的一個特征,訓(xùn)練時候應(yīng)該記錄含有單詞“購買”的垃圾郵件有多少封,含有單詞“購買”的正常郵件有多少封,按照這個思路,我們得到以下表格:特征詞統(tǒng)計正常郵件垃圾郵件匯總購買”105060淘寶”85664開心”60363編程”201535匯總

8、98124222好了,現(xiàn)在有一封郵件需要分類,假設(shè)它有購買、淘寶、開心、編程四個特征,那么其屬于正常郵件的可能性是:10/98*8/98*60/98*20/98*98/222=0.000459屬于垃圾郵件的可能性是:50/124*56/124*3/124*15/124*124/222=0.00029768結(jié)果是該郵件更有可能是正常郵件。如果郵件只有有開心和編程兩個特征,那么其屬于正常郵件的可能性是60/98*20/98*98/222=0.0551571屬于垃圾郵件的可能性是:3/124*15/124*124/222=0.0016346992153443768結(jié)果是該郵件更有可能是正常郵件。3、

9、讓分類器更合理如果我們的統(tǒng)計結(jié)果是這樣的:特征詞統(tǒng)計正常郵件垃圾郵件匯總(求和)“購買”105060“淘寶”85664“開心”63063“編程”201535匯總(求和)101121222具有特征開心的垃圾郵件有0封。如果某封郵件具有購買、淘寶、開心這三個特征,按照上面的思路,該郵件屬于正常郵件的可能性是:10/101*8/101*63/101*101/222=0.00222553屬于垃圾郵件的可能性是:50/121*56/121*0/121*121/222=0這意味著,只要郵件里有“開心”,那么它就不是垃圾郵件(屬于垃圾郵件的可能性為0),這顯然是不合理的。對此,我們可以對P(F1|C)(以及

10、P(F2|C)、P(F3|C)等)做如下處理(加權(quán)平均):P2(F1|C)=(1*0.5+sum(F1)*P(F1|C)/(1+sum(F1)=(0.5+sum(F1)*P(F1|C)/(1+sum(F1)其中,若F1是開心,那么sum(F1)=63+0=63。于是,屬于正常郵件的可能性是:(0.5+10/101*60)/61)*(0.5+8/101*64)/65)*(0.5+63/101*63)/64)*101/222=0.0025593104680632236屬于垃圾郵件的可能性是:(0.5+50/121*60)/61)*(0.5+56/121*64)/65)*(0.5+0/121*63)

11、/64)*121/222=0.0008181611103439531這封郵件還是傾向于正常郵件,不過計算方式更合理了。另外我們也可以通過取對數(shù)的方式進行優(yōu)化。這樣更合理,因為對數(shù)的相乘可以變成相加。4、如何由計算結(jié)果判斷類別如果計算出一封郵件屬于正常郵件的概率是0.05,屬于垃圾郵件的概率是0.006,基本可以肯定這是一封正常郵件。不過,如果一封郵件屬于正常郵件的概率是0.05,屬于垃圾郵件的概率是0.049,那么這封郵件是否該劃分為垃圾郵件?也許在這個時候就要在訓(xùn)練之后再填上一個分類了不確定分類。首先,設(shè)定一個閾值T(大于1),待標注數(shù)據(jù)D,兩個分類C0和C1,如果:P(C0|D)/P(C1

12、|D)>T那么,D屬于類別C0。如果:P(C1|D)/P(C0|D)>T那么,D屬于類別C1。5、如果有多個類別對于樸素貝葉斯分類器而言,多個分類和二分類沒什么差別,就是訓(xùn)練的時候多加個分類而已。三、貝葉斯模型實現(xiàn)樸素貝葉斯的三個常用模型:高斯、多項式、伯努利樸素貝葉斯的基本若一個樣本有n個特征,分別用x1,x2,xn表示,將其劃分到類yk的可能性P(yk|x1,x2,,xn)為:P(yk|x1,x2,,xn)=P(x1|yk)*P(x2|yk)*P(xn|yk)*P(yk)上式中等號右側(cè)的各個值可以通過訓(xùn)練得到。根據(jù)上面的公式可以求的某個數(shù)據(jù)屬于各個分類的可能性(這些可能性之和不

13、一定是1),該數(shù)據(jù)應(yīng)該屬于具有最大可能性的分類中。一般來說,如果一個樣本沒有特征xi,那么P(xi|yk)將不參與計算。不過下面的伯努利模型除外。高斯模型有些特征可能是連續(xù)型變量,比如說人的身高,物體的長度,這些特征可以轉(zhuǎn)換成離散型的值,比如如果身高在160cm以下,特征值為1;在160cm和170cm之間,特征值為2;在170cm之上,特征值為3。也可以這樣轉(zhuǎn)換,將身高轉(zhuǎn)換為3個特征,分別是f1、f2、f3,如果身高是160cm以下,這三個特征的值分別是1、0、0,若身高在170cm之上,這三個特征的值分別是0、0、1。不過這些方式都不夠細膩,高斯模型可以解決這個問題。高斯模型假設(shè)這些一個特

14、征的所有屬于某個類別的觀測值符合高斯分布(正態(tài)分布),也就是:下面看一個sklearn中的示例:(需要安裝sklearn包)>>>fromsklearnimportdatasets>>>iris=datasets.load_iris()>>>iris.feature_names#四個特征的名字'sepallength(cm)','sepalwidth(cm)','petallength(cm)','petalwidth(cm)'>>>iris.dataarra

15、y(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.size600#共600/4=150個樣本>>>iris.target_namesarray('setosa','versicolor

16、9;,'virginica',dtype='|S10')>>>iris.targetarray(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.size150>>>fromsklearn.naive_bayesimportGaussianNB>>>clf=GaussianNB()>>>clf.fit(iris.da

17、ta,iris.target)>>>clf.predict(iris.data0)array(0)#預(yù)測正確>>>clf.predict(iris.data149)array(2)#預(yù)測正確>>>data=numpy.array(6,4,6,2)>>>clf.predict(data)array(2)#預(yù)測結(jié)果很合理伯努利模型伯努利模型中,對于一個樣本來說,其特征用的是全局的特征。1)基本原理P(c)=類c下文件總數(shù)/整個訓(xùn)練樣本的文件總數(shù)P(tk|c)=(類c下包含單詞tk的文件數(shù)+1)/(類c下單詞總數(shù)+2)2)舉例使

18、用前面例子中的數(shù)據(jù),模型換成伯努利模型。類yes下總共有3個文件,類no下有1個文件,訓(xùn)練樣本文件總數(shù)為11,因此P(yes)=3/4,P(Chinese|yes)=(3+1)/(3+2)=4/5,條件概率如下:P(Japan|yes)=P(Tokyo|yes)=(0+1)/(3+2)=1/5P(Beijing|yes)=P(Macao|yes)=P(Shanghai|yes)=(1+1)/(3+2)=2/5P(Chinese|no)=(1+1)/(1+2)=2/3P(Japan|no)=P(Tokyo|no)=(1+1)/(1+2)=2/3P(Beijing|no)=P(Macao|no)=

19、P(Shanghai|no)=(0+1)/(1+2)=1/3有了以上類條件概率,開始計算后驗概率,P(yes|d)=P(yes)*P(Chinese|yes)*P(Japan|yes)*P(Tokyo|yes)*(1-P(Beijing|yes)*(1-P(Shanghai|yes)*(1-P(Macao|yes)=3/4*4/5*1/5*1/5*(1-2/5)*(1-2/5)*(1-2/5)=81/156250.005P(no|d)=1/4*2/3*2/3*2/3*(1-1/3)*(1-1/3)*(1-1/3)=16/729心0.022因此,這個文檔不屬于類別china。在伯努利模型中,每個

20、特征的取值是布爾型的,即true和false,或者1和0。在文本分類中,就是一個特征有沒有在一個文檔中出現(xiàn)。如果特征值xi值為1,那么P(xi|yk)=P(xi=1|yk)如果特征值xi值為0,那么P(xi|yk)=1P(xi=1|yk)這意味著,“沒有某個特征”也是一個特征。下面的示例來自sklearn官方文檔:>>>importnumpyasnp>>>X=np.random.randint(2,size=(6,100)>>>Y=np.array(1,2,3,4,4,5)>>>fromsklearn.naive_baye

21、simportBernoulliNB>>>clf=BernoulliNB()>>>clf.fit(X,Y)BernoulliNB(alpha=1.0,binarize=0.0,class_prior=None,fit_prior=True)>>>print(clf.predict(X2)3BernoulliNB()類也有partial_fit()函數(shù)。多項式模型該模型常用于文本分類,特征是單詞,值是單詞的出現(xiàn)次數(shù)。1)基本原理在多項式模型中,設(shè)某文檔d=(t1,t2,tk),tk是該文檔中出現(xiàn)過的單詞,允許重復(fù),則先驗概率P(c)=類c下單

22、詞總數(shù)/整個訓(xùn)練樣本的單詞總數(shù)類條件概率P(tk|c)=(類c下單詞tk在各個文檔中出現(xiàn)過的次數(shù)之和+1)/(類c下單詞總數(shù)+|V|)V是訓(xùn)練樣本的單詞表(即抽取單詞,單詞出現(xiàn)多次,只算一個)|V|則表示訓(xùn)練樣本包含多少種單詞。P(tk|c)可以看作是單詞tk在證明d屬于類c上提供了多大的證據(jù),而P(c)則可以認為是類別c在整體上占多大比例(有多大可能性)。2)舉例給定一組分好類的文本訓(xùn)練數(shù)據(jù),如下:docIddoc類別Inc=Chiniin1ChineseBeijingChines.已yes2ChineseChineseSliaiigliaiyes3ChineseMacaoyes4Tokyo

23、JapanClutieseno給定一個新樣本ChineseChineseChineseTokyoJapan,對其進行分類。該文本用屬性向量表示為d=(Chinese,Chinese,Chinese,Tokyo,Japan,類別集合為Y=yes,no。類yes下總共有8個單詞,類no下總共有3個單詞,訓(xùn)練樣本單詞總數(shù)為11,因此P(yes)=8/11,P(no)=3/11。類條件概率計算如下:P(Chinese|yes)=(5+1)/(8+6)=6/14=3/7P(Japan|yes)=P(Tokyo|yes)=(0+1)/(8+6)=1/14P(Chinese|no)=(1+1)/(3+6)=

24、2/9P(Japan|no)=P(Tokyo|no)=(1+1)/(3+6)=2/9分母中的8,是指yes類別下textc的長度,也即訓(xùn)練樣本的單詞總數(shù),6是指訓(xùn)練樣本有Chinese,Beijing,Shanghai,Macao,Tokyo,Japan共6個單詞,3是指no類下共有3個單詞。有了以上類條件概率,開始計算后驗概率:P(yes|d)=(3/7)3X1/14X1/14X8/11=108/18487720.00058417P(no|d)=(2/9)3X2/9X2/9X3/11=32/2165130.00014780比較大小,即可知道這個文檔屬于類別china。下面的代碼來自sklea

25、rn的示例:>>>importnumpyasnp>>>X=np.random.randint(5,size=(6,100)>>>y=np.array(1,2,3,4,5,6)>>>fromsklearn.naive_bayesimportMultinomialNB>>>clf=MultinomialNB()>>>clf.fit(X,y)MultinomialNB(alpha=1.0,class_prior=None,fit_prior=True)>>>print(clf

26、.predict(X2)3值得注意的是,多項式模型在訓(xùn)練一個數(shù)據(jù)集結(jié)束后可以繼續(xù)訓(xùn)練其他數(shù)據(jù)集而無需將兩個數(shù)據(jù)集放在一起進行訓(xùn)練。在sklearn中,MultinomialNB()類的partial_fit()方法可以進行這種訓(xùn)練。這種方式特別適合于訓(xùn)練集大到內(nèi)存無法一次性放入的情況。在第一次調(diào)用partial_fit()時需要給出所有的分類標號。>>>importnumpy>>>fromsklearn.naive_bayesimportMultinomialNB>>>>clf=MultinomialNB()>>>c

27、lf.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')在多項式模型中,設(shè)某文檔d=(t1,t2,tk),tk是該文檔中出現(xiàn)過的單詞,允許重復(fù)

28、,則先驗概率P(c)=類c下單詞總數(shù)/整個訓(xùn)練樣本的單詞總數(shù)類條件概率P(tk|c)=(類c下單詞tk在各個文檔中出現(xiàn)過的次數(shù)之和+1)/(類c下單詞總數(shù)+|V|)V是訓(xùn)練樣本的單詞表(即抽取單詞,單詞出現(xiàn)多次,只算一個),|V|則表示訓(xùn)練樣本包含多少種單詞。P(tk|c)可以看作是單詞tk在證明d屬于類c上提供了多大的證據(jù),而P(c)則可以認為是類別c在整體上占多大比例(有多大可能性)。在伯努利模型中:P(c)=類c下文件總數(shù)/整個訓(xùn)練樣本的文件總數(shù)P(tk|c)=(類c下包含單詞tk的文件數(shù)+1)/(類c下單詞總數(shù)+2)導(dǎo)入數(shù)據(jù)集importnumpyasnptraining_data=n

29、p.load("d:/pydata/text-classification/training_data.npy")training_labels=np.load("d:/pydata/text-classification/training_labels.npy")test_data=np.load("d:/pydata/text-classification/test_data.npy")test_labels=np.load("d:/pydata/text-classification/test_labels.npy&q

30、uot;)使用多項式貝葉斯>>>fromsklearn.naive_bayesimportMultinomialNB>>>clf=MultinomialNB()>>>clf.fit(training_data,training_labels)#訓(xùn)練模型MultinomialNB(alpha=1.0,class_prior=None,fit_prior=True)>>>predict_labels=clf.predict(test_data)#預(yù)測訓(xùn)練集>>>sum(predict_labels=test_labels)#預(yù)測對了幾個?454>>>len(predict_labels)#訓(xùn)練樣本個數(shù)509>>>454./509#正確率0.8919449901768173#效果不錯>>>fromsklearn.metricsimportconfusion_matrix>>>confusion_matrix(test_labels,predict_labels)#混淆矩陣array(39,0,0,1,0,1,0,0,0,32,1,0,0,4,0,1,0,0,50,0,0,8,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論