您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)大數(shù)據(jù)中樸素貝葉斯法的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBM),本案例采用樸素貝葉斯模型。樸素貝葉斯法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類方法,本節(jié)對此算法作了重點分析。
一、 垃圾消息識別算法-樸素貝葉斯
和決策樹模型相比,樸素貝葉斯分類器(Naive Bayes Classifier, NBC)發(fā)源于古典數(shù)學(xué)理論,有著堅實的數(shù)學(xué)基礎(chǔ),以及穩(wěn)定的分類效率。同時,NBC模型所需估計的參數(shù)較少,對缺失數(shù)據(jù)不太敏感,算法也比較簡單。
理論上,NBC模型與其他分類方法相比具有最小的誤差率。但是實際上并非總是如此,這是因為NBC模型假設(shè)屬性之間相互獨(dú)立,這個假設(shè)在實際應(yīng)用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。
這個在250多年前發(fā)明的算法,在信息領(lǐng)域內(nèi)有著無與倫比的地位。貝葉斯分類是一系列分類算法的總稱,這類算法均以貝葉斯定理為基礎(chǔ),故統(tǒng)稱為貝葉斯分類。樸素貝葉斯算法(Naive Bayesian) 是其中應(yīng)用最為廣泛的分類算法之一。
1.實現(xiàn)基礎(chǔ)機(jī)器學(xué)習(xí)貝葉斯分類的核心
分類是將一個未知樣本分到幾個預(yù)先已知類的過程。數(shù)據(jù)分類問題的解決是一個兩步過程:第一步,建立一個模型,描述預(yù)先的數(shù)據(jù)集或概念集。通過分析由屬性描述的樣本(或?qū)嵗?、對象等)來?gòu)造模型。假定每一個樣本都有一個預(yù)先定義的類,由一個被稱為類標(biāo)簽的屬性確定。為建立模型而被分析的數(shù)據(jù)元組形成訓(xùn)練數(shù)據(jù)集,該步也稱作有指導(dǎo)的學(xué)習(xí)。
在眾多的分類模型中,應(yīng)用最為廣泛的兩種分類模型是決策樹模型和樸素貝葉斯模型。決策樹模型通過構(gòu)造樹來解決分類問題。首先利用訓(xùn)練數(shù)據(jù)集來構(gòu)造一棵決策樹,一旦樹建立起來,它就可為未知樣本產(chǎn)生一個分類。
在分類問題中使用決策樹模型有很多的優(yōu)點,決策樹便于使用,而且高效;根據(jù)決策樹可以很容易地構(gòu)造出規(guī)則,而規(guī)則通常易于解釋和理解;決策樹可很好地擴(kuò)展到大型數(shù)據(jù)庫中,同時它的大小獨(dú)立于數(shù)據(jù)庫的大??;決策樹模型的另外一大優(yōu)點就是可以對有許多屬性的數(shù)據(jù)集構(gòu)造決策樹。決策樹模型也有一些缺點,比如處理缺失數(shù)據(jù)時的困難,過度擬合問題的出現(xiàn),以及忽略數(shù)據(jù)集中屬性之間的相關(guān)性等。
解決這個問題的方法一般是建立一個屬性模型,對于不相互獨(dú)立的屬性,把他們單獨(dú)處理。例如中文文本分類識別的時候,我們可以建立一個字典來處理一些詞組。如果發(fā)現(xiàn)特定的問題中存在特殊的模式屬性,那么就單獨(dú)處理。
這樣做也符合貝葉斯概率原理,因為我們把一個詞組看作一個單獨(dú)的模式,例如英文文本處理一些長度不等的單詞,也都作為單獨(dú)獨(dú)立的模式進(jìn)行處理,這是自然語言與其他分類識別問題的不同點。
實際計算先驗概率時候,因為這些模式都是作為概率被程序計算,而不是自然語言被人來理解,所以結(jié)果是一樣的。
在屬性個數(shù)比較多或者屬性之間相關(guān)性較大時,樸素貝葉斯模型的分類效率比不上決策樹模型。但這點有待驗證,因為具體的問題不同,算法得出的結(jié)果不同,同一個算法對于同一個問題,只要模式發(fā)生變化,也存在不同的識別性能。這點在很多國外論文中已經(jīng)得到公認(rèn),算法對于屬性的識別情況決定于很多因素,例如訓(xùn)練樣本和測試樣本的比例影響算法的性能。
決策樹對于文本分類識別,要看具體情況。在屬性相關(guān)性較小時,樸素貝葉斯模型的性能相對較好。屬性相關(guān)性較大的時候,決策樹算法性能較好。
2.樸素貝葉斯分類的表達(dá)式描述
貝葉斯定理由英國數(shù)學(xué)家貝葉斯 ( Thomas Bayes 1702-1761 ) 發(fā)展,用來描述兩個條件概率之間的關(guān)系,比如 P(A|B) 和 P(B|A)。按照乘法法則,可以立刻導(dǎo)出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B)。如上公式也可變形為:P(B|A) = P(A|B)*P(B) / P(A)。
通常,事件A在事件B(發(fā)生)的條件下的概率,與事件B在事件A的條件下的概率是不一樣的;然而,這兩者是有確定的關(guān)系,貝葉斯法則就是這種關(guān)系的陳述。貝葉斯法則是關(guān)于隨機(jī)事件A和B的條件概率和邊緣概率的。其中P(A|B)是在B發(fā)生的情況下A發(fā)生的可能性。
在貝葉斯法則中,每個名詞都有約定俗成的名稱:
Pr(A)是A的先驗概率或邊緣概率。之所以稱為“先驗”是因為它不考慮任何B方面的因素。
Pr(A|B)是已知B發(fā)生后A的條件概率,也由于得自B的取值而被稱作A的后驗概率。
Pr(B|A)是已知A發(fā)生后B的條件概率,也由于得自A的取值而被稱作B的后驗概率。
Pr(B)是B的先驗概率或邊緣概率,也作標(biāo)準(zhǔn)化常量(normalized constant)。
按這些術(shù)語,Bayes法則可表述為:
后驗概率 = (似然度 * 先驗概率)/標(biāo)準(zhǔn)化常量,也就是說,后驗概率與先驗概率和似然度的乘積成正比。
另外,比例Pr(B|A)/Pr(B)也有時被稱作標(biāo)準(zhǔn)似然度(standardised likelihood),Bayes法則可表述為:
后驗概率 = 標(biāo)準(zhǔn)似然度 * 先驗概率。
二、 進(jìn)行分布式貝葉斯分類學(xué)習(xí)時的全局計數(shù)器
在單機(jī)環(huán)境中完成基于簡單貝葉斯分類算法的機(jī)器學(xué)習(xí)案例時,只需要完整加載學(xué)習(xí)數(shù)據(jù)后套用貝葉斯表達(dá)式針對每個單詞計算統(tǒng)計比率信息即可,因為所需的各種參數(shù)均可以在同一個數(shù)據(jù)文件集中直接匯總統(tǒng)計獲取,但是當(dāng)該業(yè)務(wù)遷移到MapReduce分布式環(huán)境中后,情況發(fā)生了本質(zhì)的變化。從圖14.9貝葉斯分類表達(dá)式在垃圾消息識別中的使用方式:
可以看出,在進(jìn)行數(shù)據(jù)學(xué)習(xí)統(tǒng)計時需要計算幾個主要比例參數(shù):可以看出,在進(jìn)行數(shù)據(jù)學(xué)習(xí)統(tǒng)計時需要計算幾個主要比例參數(shù):
所有消息中包含某個特定單詞的比率;
消息為垃圾消息的比率;
消息為垃圾消息并且垃圾消息中存在特定單詞的比例。
因此,需要對所有的學(xué)習(xí)數(shù)據(jù)匯總,至少需要明確學(xué)習(xí)數(shù)據(jù)中消息的總數(shù),學(xué)習(xí)數(shù)據(jù)中垃圾消息的數(shù)量,學(xué)習(xí)數(shù)據(jù)中有效消息的數(shù)量等數(shù)據(jù),由于MapReduce任務(wù)的數(shù)據(jù)輸入來源來自于HDFS,而HDFS會將超大的數(shù)據(jù)文件自動切分成大小相等的塊存放到不同的數(shù)據(jù)節(jié)點,同時MapRedece任務(wù)也將滿足“數(shù)據(jù)在哪個節(jié)點,計算任務(wù)就在哪個節(jié)點啟動”的基本原則,因此整個學(xué)習(xí)數(shù)據(jù)的分析統(tǒng)計任務(wù)會并行在不同的Java虛擬機(jī)甚至不同的任務(wù)計算節(jié)點中,使用傳統(tǒng)的共享變量方式來解決這個匯總統(tǒng)計問題就成了不可能完成的任務(wù)。
要想使用MapReduce完成計數(shù)器的功能可以有以下幾種選擇:
(1)使用MapReduce內(nèi)置的Counter組件,MapReduce的Counter計數(shù)器會自動記錄一些通用的統(tǒng)計信息,如本次MapReduce總共處理的數(shù)據(jù)分片數(shù)量等,開發(fā)人員也可以自定義不同類型的Counter計數(shù)器并在Map或Reduce任務(wù)中設(shè)置/累加/計數(shù)器的值,但是MapReduce內(nèi)置的Counter計數(shù)器工具有一個明顯的缺陷,它并不支持Map任務(wù)中累加計數(shù)器的值后在Reduce中直接獲取。
也就是說,在Reduce任務(wù)中第一次獲取相關(guān)計數(shù)器的值永遠(yuǎn)都為0,盡管在整個任務(wù)結(jié)束后,MapReduce會將對應(yīng)計數(shù)器在Map和Reduce兩個任務(wù)過程中分別設(shè)置的值進(jìn)行最終的累加操作,由于在本案例中需要在Reduce任務(wù)中獲取有效/垃圾消息的總數(shù)量以計算比率信息,而這些數(shù)量需要在Map任務(wù)中統(tǒng)計,因此MapReduce內(nèi)置的Counter計數(shù)器并不是適合本案例的應(yīng)用環(huán)境。
(2)Hadoop生態(tài)中的特殊組件Zookeeper對這類跨越節(jié)點的統(tǒng)一計數(shù)器提供了API支持,但是如果僅僅是因為需要設(shè)置少量幾個以數(shù)字形式存在的計數(shù)器就額外部署一套Zookeeper集群顯然開銷太大,因此這種解決方法也不適用于當(dāng)前案例。
(3)自行實現(xiàn)簡單的統(tǒng)一計數(shù)器。統(tǒng)一計數(shù)器的實現(xiàn)比較簡單,僅需在單獨(dú)的節(jié)點中定義數(shù)字變量,在需要設(shè)置、累加或獲取計數(shù)器時通過都通過網(wǎng)絡(luò)訪問這個節(jié)點中的這些數(shù)字變量。在普通環(huán)境中,實現(xiàn)這樣一個計數(shù)器服務(wù)相對較為繁瑣,因為需要大量的網(wǎng)絡(luò)數(shù)據(jù)交換操作,但是在實現(xiàn)了自定義的RPC調(diào)用組件之后,基于網(wǎng)絡(luò)的數(shù)據(jù)設(shè)置和獲取操作就顯得異常簡單,就類似于在本機(jī)上完成一次普通Java方法一樣方便,因此可以按照以下的結(jié)構(gòu)來完成計數(shù)器服務(wù)的實現(xiàn):
注意:由于多個數(shù)據(jù)處理節(jié)點會并發(fā)的向計數(shù)器服務(wù)發(fā)起設(shè)值請求,因此需要注意計數(shù)器變量的安全性,在最為簡單的設(shè)計中,使計數(shù)器服務(wù)的設(shè)置值、累加值、獲取值方法保持同步即可。
三、數(shù)據(jù)清洗分析結(jié)果存儲
MapReduce是典型的非實時數(shù)據(jù)處理引擎,這就意味著不能將其作為需要實時反饋的場景。所以MapReduce任務(wù)只能在后臺完成復(fù)雜數(shù)據(jù)的處理操作,供終端實時運(yùn)算提供支撐的中間結(jié)果,而且由于HDFS文件系統(tǒng)的Metadata檢索服務(wù)和數(shù)據(jù)網(wǎng)絡(luò)傳輸都需要大量的IO開銷,如果中間結(jié)果集的量級并不需要分布式的文件存儲支持而又使用HDFS存儲中間結(jié)果,反倒會對最終的服務(wù)效率帶來消極影響。因此在完成好數(shù)據(jù)的統(tǒng)一清洗分析后,中間結(jié)果一般都選擇以下的幾種保存策略:
如果清洗后的結(jié)果是量級較小的規(guī)則性數(shù)據(jù),則可以將其直接存放到Redis之類的Key-Value高速緩存體系中;
如果清洗后的結(jié)果集比較大,那么可以在Reduce任務(wù)中將其存放到傳統(tǒng)的RDBMS中,供業(yè)務(wù)系統(tǒng)使用SQL語句完成實時查詢;
如果清洗后的結(jié)果仍然是海量數(shù)據(jù),則可以將其存放到HBase之類的分布式數(shù)據(jù)庫中以提供高效的大數(shù)據(jù)實施查詢。
本項目采用Redis緩存數(shù)據(jù),并使用了Redis連接池。和RDBMS一樣,Redis也可以通過連接池方式提高數(shù)據(jù)訪問效率和吞吐量,其原理如下:
感謝各位的閱讀!關(guān)于“大數(shù)據(jù)中樸素貝葉斯法的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。