關注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 ...