1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        樸素貝葉斯算法基礎(chǔ)原理

        共 6928字,需瀏覽 14分鐘

         ·

        2021-04-25 10:01


        一、從一個(gè)案例開始

        樸素貝葉斯(Native Bayes)算法是基于貝葉斯定理和特征條件獨(dú)立假設(shè)的分類算法。

        貝葉斯定理其實(shí)就是一個(gè)非常簡單的公式,如下所示,這里先不講公式,而是重點(diǎn)關(guān)注他的使用價(jià)值,因?yàn)橹挥欣斫饬硕ɡ淼膽?yīng)用意義,你才會有興趣學(xué)下去。

        在分類算法里面應(yīng)用,可以轉(zhuǎn)換成下面的表達(dá)式,一眼就看明白了

        當(dāng)然,這樣有人可能還是不明白,我們再具體一點(diǎn),加入你有一封郵件,包含:代開,增值稅,發(fā)票,sep,這幾個(gè)詞,要預(yù)測其為垃圾郵件的概率,問題轉(zhuǎn)化成P(垃圾|代開,增值稅,發(fā)票,sep)只要計(jì)算出該表達(dá)式的值即可,應(yīng)用全概率公式,進(jìn)一步轉(zhuǎn)換成下面的等式。

        就這樣,我們把公式和實(shí)際的應(yīng)用聯(lián)系起來了。

        當(dāng)然要計(jì)算上面的概率,需要我們有歷史數(shù)據(jù),于是我從我的郵箱里面復(fù)制了一些垃圾郵件,以及一些正常的郵件,并對數(shù)據(jù)做了一下簡單的處理,打上了垃圾郵件和正常郵件的標(biāo)簽,我們就可以得到歷史數(shù)據(jù),進(jìn)行計(jì)算了。

        分子的概率計(jì)算,即垃圾郵件的條件下,各個(gè)詞的概率:

        P(代開|垃圾)   = 1/5  = 0.2

        P(增值稅|垃圾)= 1/5  = 0.2

        P(發(fā)票|垃圾)    =  4/5 = 0.8

        P(sep|垃圾)     =  5/5 = 1.0

        分母概率計(jì)算,即全集中每個(gè)詞的概率:

        P(代開)   = 1/10  = 0.1

        P(增值稅)= 1/10  = 0.1

        P(發(fā)票)   =  4/10 = 0.4

        P(sep)    =  5/10 = 0.5

        計(jì)算垃圾郵件的概率,一共10個(gè)樣本,5個(gè)垃圾郵件,5個(gè)正常郵件:

        P(垃圾)= 5/10 = 0.5

        匯總計(jì)算最后的垃圾概率:

        P(垃圾|代開,增值稅,發(fā)票,sep) = (0.2*0.2*0.8*1)*0.5/(0.1*0.1*0.4*0.5) = 0.8

         

        我們計(jì)算下正常郵件的概率為多大,按公式直接計(jì)算,結(jié)果為0,但是直接計(jì)算,會導(dǎo)致很多樣本都為0,所以后面會引入拉普拉斯平滑。

        P(正常|代開,增值稅,發(fā)票,sep) = 0

        采用拉普拉斯變換計(jì)算得到,具體定義見后文,專門解決0概率問題:

        P(代開|正常)   = 1/(5+1)  = 0.167

        P(增值稅|正常)= 1/(5+1)  =  0.167

        P(發(fā)票|正常)    = 1/(5+1) =  0.167

        P(sep|正常)     = 1/(5+1) =  0.167

        P(正常|代開,增值稅,發(fā)票,sep) = (0.167*0.167*0.167*0.167)*0.5/(0.1*0.1*0.4*0.5) =0.194

        通過上面的案例,我們應(yīng)該對貝葉斯定理有了一定的了解,并且知道貝葉斯能解決什么問題了,但是要成為高手,這只是開胃菜,還有很多需要學(xué)的,下面我們一一講解。

        當(dāng)然我,我們用Python內(nèi)置的庫,就更簡單了,幾行代碼就搞定了。

        data = ['盡快,完成,工作','可,代開,各,行業(yè),發(fā)票,sep','可,開,發(fā)票,請聯(lián)系,sep','明天,一起,約個(gè)飯','完成,的,非常,棒','項(xiàng)目,效果,很好','有,發(fā)票,薇,sep','有,開票,微,sep','賬單,請,查收','正規(guī),增值稅,發(fā)票,sep']label=[0,1,1,0,0,0,1,1,0,1]

        vectorizer_word = TfidfVectorizer()vectorizer_word.fit(data,)#vectorizer_word.vocabulary_

        train = vectorizer_word.transform(data)test = vectorizer_word.transform(['代開,增值稅,發(fā)票,sep'])

        from sklearn.naive_bayes import MultinomialNBclf = MultinomialNB()clf.fit(train.toarray(), label)clf.predict(test.toarray(),)array([1])clf.predict_proba(test.toarray(),)array([[0.19710234, 0.80289766]])算出來的概率也是0.80

        通過上述案例可以看到,貝葉斯算法的一個(gè)基本流程如下


        二、貝葉斯定理概述

        樸素貝葉斯法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類方法。貝葉斯定理太有用了,不管是在投資領(lǐng)域,還是機(jī)器學(xué)習(xí),或是日常生活中高手幾乎都在用到它。

        生命科學(xué)家用貝葉斯定理研究基因是如何被控制的,教育學(xué)家意識到,學(xué)生的學(xué)習(xí)過程其實(shí)就是貝葉斯法則的運(yùn)用,基金經(jīng)理用貝葉斯法則找到投資策略,谷歌用貝葉斯定理改進(jìn)搜索功能,幫助用戶過濾垃圾郵件,無人駕駛汽車接收車頂傳感器收集到的路況和交通數(shù)據(jù)運(yùn)用貝葉斯定理更新從地圖上獲得的信息,人工智能、機(jī)器翻譯中大量用到貝葉斯定理,比如肝癌的檢測、垃圾郵件的過濾。

        貝葉斯定理由英國數(shù)學(xué)家貝葉斯 ( Thomas Bayes 1702-1761 ) 發(fā)展,用來描述兩個(gè)條件概率之間的關(guān)系,比如 P(A|B) 和 P(B|A)。主要用于文本分類。

        貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎(chǔ),故統(tǒng)稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法

        樸素貝葉斯分類(NBC)是以貝葉斯定理為基礎(chǔ)并且假設(shè)特征條件之間相互獨(dú)立的方法,先通過已給定的訓(xùn)練集,以特征詞之間獨(dú)立作為前提假設(shè),學(xué)習(xí)從輸入到輸出的聯(lián)合概率分布,再基于學(xué)習(xí)到的模型,輸入X求出使得后驗(yàn)概率最大的輸出Y 。 

        設(shè)有樣本數(shù)據(jù)集D={d1,d2,...,dn},對應(yīng)樣本數(shù)據(jù)的特征屬性集為X={x1,x2,...,xd}類變量為Y={y1,y2,...ym} ,即D可以分為ym類別。其中{x1,x2,...,xd} 相互獨(dú)立且隨機(jī),則Y的先驗(yàn)概率P(Y) ,Y的后驗(yàn)概率P(Y|X) ,由樸素貝葉斯算法可得,后驗(yàn)概率可以由先驗(yàn)概率P(Y) ,證據(jù)P(X) ,類條件概率P(X|Y)計(jì)算出

        樸素貝葉斯基于各特征之間相互獨(dú)立,在給定類別為y的情況下,上式可以進(jìn)一步表示為下式:

        由以上兩式可以計(jì)算出后驗(yàn)概率為:

        由于P(X)的大小是固定不變的,因此在比較后驗(yàn)概率時(shí),只比較上式的分子部分即可,因此可以得到一個(gè)樣本數(shù)據(jù)屬于類別yi的樸素貝葉斯計(jì)算:

        對于上述例題,就得到如下的表達(dá)式


        三、零概率問題

        零概率問題,即測試樣例的標(biāo)簽屬性中,出現(xiàn)了模型訓(xùn)練過程中沒有記錄的值,或者某個(gè)分類沒有記錄的值,從而出現(xiàn)該標(biāo)簽屬性值的出現(xiàn)概率 P(wi|Ci) = 0 的現(xiàn)象。因?yàn)?P(w|Ci) 等于各標(biāo)簽屬性值 P(wi|Ci) 的乘積,當(dāng)分類 Ci 中某一個(gè)標(biāo)簽屬性值的概率為 0,最后的 P(w|Ci) 結(jié)果也為 0。很顯然,這不能真實(shí)地代表該分類出現(xiàn)的概率

        解決方法:拉普拉斯修正,又叫拉普拉斯平滑,這是為了解決零概率問題而引入的處理方法。其修正過程:

        浮點(diǎn)數(shù)溢出問題:在計(jì)算 P(w|Ci) 時(shí),各標(biāo)簽屬性概率的值可能很小,而很小的數(shù)再相乘,可能會導(dǎo)致浮點(diǎn)數(shù)溢出。解決方法:對 P(w|Ci) 取對數(shù),把概率相乘轉(zhuǎn)換為相加。


        四、連續(xù)型變量概率計(jì)算

        對于離散型變量,直接統(tǒng)計(jì)頻數(shù)分布就可以了。對于連續(xù)型的變量,為了計(jì)算對應(yīng)的概率,此時(shí)又引入了一個(gè)假設(shè),假設(shè)特征的分布為正態(tài)分布,計(jì)算樣本的均值和方差,然后通過密度函數(shù)計(jì)算取值時(shí)對應(yīng)的概率

        示例如下

        從上面的例子可以看出,樸素貝葉斯假設(shè)樣本特征相互獨(dú)立,而且連續(xù)型的特征分布符合正態(tài)分布,這樣的假設(shè)前提是比較理想化的,所以稱之為"樸素"貝葉斯,因?yàn)閷?shí)際數(shù)據(jù)并不一定會滿足這樣的要求。



        五、Python庫中的貝葉斯

        在scikit-learn庫,根據(jù)特征數(shù)據(jù)的先驗(yàn)分布不同,給我們提供了5種不同的樸素貝葉斯分類算法(sklearn.naive_bayes: Naive Bayes模塊),分別是伯努利樸素貝葉斯(BernoulliNB),類樸素貝葉斯(CategoricalNB),高斯樸素貝葉斯(GaussianNB)、多項(xiàng)式樸素貝葉斯(MultinomialNB)、補(bǔ)充樸素貝葉斯(ComplementNB) 。

        naive_bayes.BernoulliNB

        Naive Bayes classifier for multivariate Bernoulli models.

        naive_bayes.CategoricalNB

        Naive Bayes classifier for categorical features

        naive_bayes.ComplementNB

        The Complement Naive Bayes classifier described in Rennie et al.

        naive_bayes.GaussianNB

        Gaussian Naive Bayes (GaussianNB)

        naive_bayes.MultinomialNB

        Naive Bayes classifier for multinomial models

        這5種算法適合應(yīng)用在不同的數(shù)據(jù)場景下,我們應(yīng)該根據(jù)特征變量的不同選擇不同的算法,下面是一些常規(guī)的區(qū)別和介紹。

        GaussianNB

        高斯樸素貝葉斯,特征變量是連續(xù)變量,符合高斯分布,比如說人的身高,物體的長度。

        這種模型假設(shè)特征符合高斯分布。

        MultinomialNB

        特征變量是離散變量,符合多項(xiàng)分布,在文檔分類中特征變量體現(xiàn)在一個(gè)單詞出現(xiàn)的次數(shù),或者是單詞的 TF-IDF 值等。不支持負(fù)數(shù),所以輸入變量特征的時(shí)候,別用StandardScaler進(jìn)行標(biāo)準(zhǔn)化數(shù)據(jù),可以使用MinMaxScaler進(jìn)行歸一化。

        這個(gè)模型假設(shè)特征復(fù)合多項(xiàng)式分布,是一種非常典型的文本分類模型,模型內(nèi)部帶有平滑參數(shù)。

        ComplementNB

        是MultinomialNB模型的一個(gè)變種,實(shí)現(xiàn)了補(bǔ)碼樸素貝葉斯(CNB)算法。CNB是標(biāo)準(zhǔn)多項(xiàng)式樸素貝葉斯(MNB)算法的一種改進(jìn),比較適用于不平衡的數(shù)據(jù)集,在文本分類上的結(jié)果通常比MultinomialNB模型好,具體來說,CNB使用來自每個(gè)類的補(bǔ)數(shù)的統(tǒng)計(jì)數(shù)據(jù)來計(jì)算模型的權(quán)重。CNB的發(fā)明者的研究表明,CNB的參數(shù)估計(jì)比MNB的參數(shù)估計(jì)更穩(wěn)定。

        BernoulliNB

        模型適用于多元伯努利分布,即每個(gè)特征都是二值變量,如果不是二值變量,該模型可以先對變量進(jìn)行二值化,在文檔分類中特征是單詞是否出現(xiàn),如果該單詞在某文件中出現(xiàn)了即為1,否則為0。在文本分類的示例中,統(tǒng)計(jì)詞語是否出現(xiàn)的向量(word occurrence vectors)(而非統(tǒng)計(jì)詞語出現(xiàn)次數(shù)的向量(word count vectors))可以用于訓(xùn)練和使用這個(gè)分類器。BernoulliNB 可能在一些數(shù)據(jù)集上表現(xiàn)得更好,特別是那些更短的文檔。如果時(shí)間允許,建議對兩個(gè)模型都進(jìn)行評估。

        CategoricalNB

        對分類分布的數(shù)據(jù)實(shí)施分類樸素貝葉斯算法,專用于離散數(shù)據(jù)集, 它假定由索引描述的每個(gè)特征都有其自己的分類分布。對于訓(xùn)練集中的每個(gè)特征 X,CategoricalNB估計(jì)以類y為條件的X的每個(gè)特征i的分類分布。樣本的索引集定義為J=1,…,m,m作為樣本數(shù)。

         

        案例測試

        from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB,ComplementNB from sklearn.datasets        import load_breast_cancerfrom sklearn.model_selection import cross_val_scoreX,y = load_breast_cancer().data,load_breast_cancer().targetnb1= GaussianNB()nb2= MultinomialNB()nb3= BernoulliNB()nb4= ComplementNB()for model in [nb1,nb2,nb3,nb4]:    scores=cross_val_score(model,X,y,cv=10,scoring='accuracy')    print("Accuracy:{:.4f}".format(scores.mean()))    Accuracy:0.9368Accuracy:0.8928Accuracy:0.6274Accuracy:0.8928  from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB,ComplementNB ,CategoricalNBfrom sklearn.datasets        import load_irisfrom sklearn.model_selection import cross_val_scoreX,y = load_iris().data,load_iris().targetgn1 = GaussianNB()gn2 = MultinomialNB()gn3 = BernoulliNB()  gn4 = ComplementNB()gn5 = CategoricalNB(alpha=1)for model in [gn1,gn2,gn3,gn4,gn5]:    scores = cross_val_score(model,X,y,cv=10,scoring='accuracy')    print("Accuracy:{:.4f}".format(scores.mean()))Accuracy:0.9533Accuracy:0.9533Accuracy:0.3333Accuracy:0.6667Accuracy:0.9267 進(jìn)行one-hot變化,可以發(fā)現(xiàn)BernoulliNB分類準(zhǔn)確率還是很高的from sklearn import preprocessing  enc = preprocessing.OneHotEncoder()  # 創(chuàng)建對象

        from sklearn.datasets import load_irisX,y = load_iris().data,load_iris().target

        enc.fit(X) array = enc.transform(X).toarray()

        from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB,ComplementNB ,CategoricalNBfrom sklearn.datasets import load_irisfrom sklearn.model_selection import cross_val_scoreX,y = load_iris().data,load_iris().targetgn1 = GaussianNB()gn2 = MultinomialNB()gn3 = BernoulliNB()gn4 = ComplementNB()for model in [gn1,gn2,gn3,gn4]: scores=cross_val_score(model,array,y,cv=10,scoring='accuracy') print("Accuracy:{:.4f}".format(scores.mean()))Accuracy:0.8933Accuracy:0.9333Accuracy:0.9333Accuracy:0.9400

         

        推薦閱讀:

        理解關(guān)聯(lián)規(guī)則算法

        Python中的高效迭代庫itertools,排列組合隨便求

        萬字長文詳解|Python庫collections,讓你擊敗99%的Pythoner

        Python初學(xué)者必須吃透這69個(gè)內(nèi)置函數(shù)!

        Python字典詳解-超級完整版

        全面理解Python集合,17個(gè)方法全解,看完就夠了

        Python正則表達(dá)式入門到入魔


        掃描關(guān)注本號↓

        瀏覽 80
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            精品人妻系列 | 手机看片福利盒子国产亚洲欧美 | 亚洲成人性爱 | 91久久国产露脸精品国产护士 | 人人草超碰 | 大香蕉伊人在线观看 | 国产一级a毛一级a在线 | 日韩精品一区二区三区中文在线 | 精品自拍偷拍 | 澳门成人网站 |