python 樸素貝葉斯之多項式貝葉斯

2021-10-04 19:37:00 字數 3060 閱讀 7298

關注csdn部落格:程志偉的部落格

多項式貝葉斯可能是除了高斯之外,最為人所知的貝葉斯演算法了。它也是基於原始的貝葉斯理論,但假設概率分布是

服從乙個簡單多項式分布。多項式分布**於統計學中的多項式實驗,這種實驗可以具體解釋為:實驗包括n次重複

試驗,每項試驗都有不同的可能結果。在任何給定的試驗中,特定結果發生的概率是不變的。

1. 多項式分布擅長的是分型別變數

2.sklearn中的多項式樸素貝葉斯不接受負值的輸入

1. 匯入需要的模組和庫

rom sklearn.preprocessing import minmaxscaler

from sklearn.*****_bayes import multinomialnb

from sklearn.model_selection import train_test_split

from sklearn.datasets import make_blobs

from sklearn.metrics import brier_score_loss

2. 建立資料集

class_1 = 500

class_2 = 500 #兩個類別分別設定500個樣本

centers = [[0.0, 0.0], [2.0, 2.0]] #設定兩個類別的中心

clusters_std = [0.5, 0.5] #設定兩個類別的方差

x, y = make_blobs(n_samples=[class_1, class_2],

centers=centers,

cluster_std=clusters_std,

random_state=0, shuffle=false)

xtrain, xtest, ytrain, ytest = train_test_split(x,y

,test_size=0.3

,random_state=420)

3. 歸一化,確保輸入的矩陣不帶有負數

mms = minmaxscaler().fit(xtrain)

xtrain_ = mms.transform(xtrain)

xtest_ = mms.transform(xtest)

4. 建立乙個多項式樸素貝葉斯分類器吧

mnb = multinomialnb().fit(xtrain_, ytrain)

#重要屬性:呼叫根據資料獲取的,每個標籤類的對數先驗概率log(p(y))

#由於概率永遠是在[0,1]之間,因此對數先驗概率返回的永遠是負值

mnb.class_log_prior_

out[54]: array([-0.69029411, -0.69600841])

np.unique(ytrain)

out[55]: array([0, 1])

(ytrain == 1).sum()/ytrain.shape[0]

out[56]: 0.49857142857142855

mnb.class_log_prior_.shape

out[57]: (2,)

#可以使用np.exp來檢視真正的概率值

np.exp(mnb.class_log_prior_)

out[58]: array([0.50142857, 0.49857143])

#重要屬性:返回乙個固定標籤類別下的每個特徵的對數概率log(p(xi|y))

mnb.feature_log_prob_

out[59]: 

array([[-0.76164788, -0.62903951],

[-0.72500918, -0.6622691 ]])

mnb.feature_log_prob_.shape

out[60]: (2, 2)

#重要屬性:在fit時每個標籤類別下包含的樣本數。當fit介面中的sample_weight被設定時,該介面返回的值也會受

到加權的影響

mnb.class_count_

out[61]: array([351., 349.])

mnb.class_count_.shape

out[62]: (2,)

5.那分類器的效果如何

mnb.score(xtest_,ytest)

out[63]: 0.5433333333333333

brier_score_loss(ytest,mnb.predict_proba(xtest_)[:,1],pos_label=1)

out[64]: 0.24977828412546027

6.效果不太理想,思考一下多項式貝葉斯的性質,我們能夠做點什麼呢

#來試試看把xtiain轉換成分型別資料吧

#注意我們的xtrain沒有經過歸一化,因為做啞變數之後自然所有的資料就不會又負數了

from sklearn.preprocessing import kbinsdiscretizer

kbs = kbinsdiscretizer(n_bins=10, encode='onehot').fit(xtrain)

xtrain_ = kbs.transform(xtrain)

xtest_ = kbs.transform(xtest)

xtrain_.shape

out[67]: (700, 20)

mnb = multinomialnb().fit(xtrain_, ytrain)

mnb.score(xtest_,ytest)

out[69]: 0.9966666666666667

brier_score_loss(ytest,mnb.predict_proba(xtest_)[:,1],pos_label=1)

out[70]: 0.0014593932778211862

可以看出,多項式樸素貝葉斯的基本操作和**都非常簡單。同樣的資料,如果採用啞變數方式的分箱處理,多項式

貝葉斯的效果會突飛猛進

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...

樸素貝葉斯

1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...

樸素貝葉斯

機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...