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

關注微信公共號:小程在線

關注CSDN博客:程志偉的博客

多項式貝葉斯可能是除了高斯之外,最爲人所知的貝葉斯算法了。它也是基於原始的貝葉斯理論,但假設概率分佈是
服從一個簡單多項式分佈。多項式分佈來源於統計學中的多項式實驗,這種實驗可以具體解釋爲:實驗包括n次重複
試驗,每項試驗都有不同的可能結果。在任何給定的試驗中,特定結果發生的概率是不變的。

1. 多項式分佈擅長的是分類型變量

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

 

1. 導入需要的模塊和庫
rom sklearn.preprocessing import MinMaxScaler
from sklearn.naive_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

可以看出,多項式樸素貝葉斯的基本操作和代碼都非常簡單。同樣的數據,如果採用啞變量方式的分箱處理,多項式
貝葉斯的效果會突飛猛進

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章