應(yīng)用貝葉斯網(wǎng)絡(luò)分類器進行分類主要分成兩階段。第一階段是貝葉斯網(wǎng)絡(luò)分類器的學(xué)習(xí),即從樣本數(shù)據(jù)中構(gòu)造分類器,包括結(jié)構(gòu)學(xué)習(xí)和CPT 學(xué)習(xí);第二階段是貝葉斯網(wǎng)絡(luò)分類器的推理,即計算類結(jié)點的條件概率,對分類數(shù)據(jù)進行分類。這兩個階段的時間復(fù)雜性均取決于特征值間的依賴程度,甚至可以是NP 完全問題,因而在實際應(yīng)用中,往往需要對貝葉斯網(wǎng)絡(luò)分類器進行簡化。根據(jù)對特征值間不同關(guān)聯(lián)程度的假設(shè),可以得出各種貝葉斯分類器,Naive Bayes、TAN、BAN、GBN 就是其中較典型、研究較深入的貝葉斯分類器。
貝葉斯分類器的分類原理是通過某對象的先驗概率,利用貝葉斯公式計算出其后驗概率,即該對象屬于某一類的概率,選擇具有最大后驗概率的類作為該對象所屬的類。也就是說,貝葉斯分類器是最小錯誤率意義上的優(yōu)化。目前研究較多的貝葉斯分類器主要有四種,分別是:Naive Bayes、TAN、BAN和GBN。
貝葉斯分類器
貝葉斯分類器的分類原理是通過某對象的先驗概率,利用貝葉斯公式計算出其后驗概率,即該對象屬于某一類的概率,選擇具有最大后驗概率的類作為該對象所屬的類。也就是說,貝葉斯分類器是最小錯誤率意義上的優(yōu)化。目前研究較多的貝葉斯分類器主要有四種,分別是:Naive Bayes、TAN、BAN和GBN。
訓(xùn)練
和所有監(jiān)督算法一樣,貝葉斯分類器是利用樣本進行訓(xùn)練的,每個樣本包含了一個特征列表和對應(yīng)的分類。假定我們要對一個分類器進行訓(xùn)練,使其能夠正確的判斷出:一個包含“python”的文檔究竟是編程語言的,還是關(guān)于蛇的。
分類器記錄了它迄今為止見過的所有特征,以及這些特征與某個特定分類相關(guān)的數(shù)字概率。分類器逐一接受樣本的訓(xùn)練。 當(dāng)經(jīng)過某個樣本的訓(xùn)練之后,分類器會更新該樣本中特征與分類的概率,同時還會生成一個新的概率,即:在一篇屬于某個分類的文檔中,含有指定單詞的概率。例如
從上表中我們可以看到,經(jīng)過訓(xùn)練之后,特征與各種分類的關(guān)聯(lián)性更加明確了。單詞“constrictor”屬于蛇的分類概率更大,而單詞“dynamic”屬于編程語言的概率更大。
另一方便,有些特征的所屬分類則沒有那么明確。比如:單詞“and”出現(xiàn)在兩個分類中的概率是差不多的(單詞and幾乎會出現(xiàn)在每一篇文檔中,不管它屬于哪一個分類。)分類器在經(jīng)過訓(xùn)練之后。只會保留一個附有相應(yīng)概率的特征列表,與某些其他的分類方法不同,此處的原始數(shù)據(jù)在訓(xùn)練之后,就沒有必要再加以保存了。
分類
當(dāng)一個貝葉斯分類器經(jīng)過訓(xùn)練之后,我們就可以利用它來對新的項目進行自動分類了。假定我們有一篇新的文檔,包含了“l(fā)ong” “dynamic” 和 “source”。
樸素貝葉斯分類器是通過下面的公式將概率組合起來的: P( Category | Document) = P ( Document | Category ) * P( Category) / P(Document)
此處:
P( Document | Category) = P (Word1 | Category ) * P( Word2) / P(Category )
p( Document | Category) 的取值來自于上表,比如 P( dynamic | language) = 0.6
p(Category) 的取值則等于某個分類出現(xiàn)的總體概率,因為“ language ” 有一般的機會都會出現(xiàn),所以 P(language ) 的值為0.5 。無論是哪個分類,只要其P( Category | Document) 的值相對較高,它就是我們預(yù)期的分類。
我們需要一個定義一個特征提取函數(shù),該函數(shù)的作用是將我們用以訓(xùn)練或分類的數(shù)據(jù)轉(zhuǎn)化成一個特征列表。
docclass.getwords(‘python is a dynamic language’) {‘python’:1,‘dymaic’:1,‘language’:1}
上述函數(shù)可用于創(chuàng)建一個新的分類器,針對字符串進行訓(xùn)練: cl = docclass.nativebayes(docclass.getwords)cl.setdb(‘test.db’) cl.train(‘pythons are constrictors’,‘snake’) cl.train(‘python has dynamic types’,‘language’)cl.train(‘python was developed as a scripting language’,‘language’)
然后進行分類 cl.classify(‘dynamic programming’) u‘language’ cl.classify(‘boa constrictors’) u‘snake’
對于允許使用的分類數(shù)量,此處并沒有任何的限制,但是為了使分類器有一個良好的表現(xiàn),我們需要為每個分類提供大量的樣本。
貝葉斯分類器優(yōu)點和缺點
樸素貝葉斯分類器與其他方法相比最大的優(yōu)勢或許就在于,它在接受大數(shù)據(jù)量訓(xùn)練和查詢時所具備的的高速度。即使選用超大規(guī)模的訓(xùn)練集,針對每個項目通常也只會有相對較少的特征數(shù),并且對項目的訓(xùn)練和分類頁僅僅是針對特征概率的數(shù)學(xué)運算而已。
尤其當(dāng)訓(xùn)練量逐漸遞增時則更加如此--在不借助任何舊有訓(xùn)練數(shù)據(jù)的前提下,每一組新的訓(xùn)練數(shù)據(jù)都有可能會引起概率值變化。對于一個如垃圾郵件過濾這樣的應(yīng)用程序而言,支持增量式訓(xùn)練的能力是非常重要的,因為過濾程序時常要對新到的郵件進行訓(xùn)練,然后必須即可進行相應(yīng)的調(diào)整;更何況,過濾程序也未必有權(quán)限訪問已經(jīng)收到的所有郵件信息。
樸素貝葉斯分類器的另一大優(yōu)勢是,對分類器實際學(xué)習(xí)狀況的解釋還是相對簡單的。由于每個特征的概率值都被保存了起來,因此我們可以在任何時候查看數(shù)據(jù)庫,找到最合適的特征來區(qū)分垃圾郵件和非垃圾郵件,或是編程語言和蛇。保存在數(shù)據(jù)庫中的這些信息都很有價值,它們有可能被用于其他的應(yīng)用程序,或者作為構(gòu)筑這些應(yīng)用程序的一個良好基礎(chǔ)。
樸素貝葉斯分類器的最大缺陷就是,它無法處理基于特征組合所產(chǎn)生的變化結(jié)果。假設(shè)有如下這樣一個場景,我們正在嘗試從非垃圾郵件中鑒別出垃圾郵件來:假設(shè)我們構(gòu)建的是一個Web應(yīng)用程序,因為單詞“online”市場會出現(xiàn)在你的工作郵件中。而你的好友則在一家藥店工作,并且喜歡給你發(fā)一些他碰巧在工作中遇到的奇聞趣事。同時,和大多數(shù)不善于嚴(yán)密保護自己郵件地址的人一樣,偶爾你也會收到一封包含單詞”online pharmacy“的垃圾郵件。
也許你已經(jīng)看出此處的難點--我們往往會告訴分類器”onlie“和”pharmacy“是出現(xiàn)在非垃圾郵件中的,因此這些單詞相對于非垃圾郵件的概率會高一些。當(dāng)我們告訴分類器有一封包含單詞”onlie pharmacy“ 的郵件屬于垃圾郵件時,則這些單詞的概率又會進行相應(yīng)的調(diào)整,這就導(dǎo)致了一個經(jīng)常性的矛盾。由于特征的概率是單獨給出的,因此分類器對于各種組合的情況一無所知。在文檔分類中,這通常不是什么大問題,因為一封包含單詞”online pharmacy“的郵件中可能還會有其他的特征可以說明它是垃圾郵件,但是在面對其他問題時,理解特征的組合可能是至關(guān)重要的。
評論
查看更多