import numpy as np
from sklearn.*****_bayes import multinomialnb, gaussiannb, bernoullinb
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
from sklearn.preprocessing import kbinsdiscretizer
from sklearn.metrics import brier_score_loss as bs,recall_score,roc_auc_score as auc
class_1 =
50000
#多數類為50000個樣本
class_2 =
500#少數類為500個樣本
centers =[[
0.0,
0.0],[
5.0,
5.0]
]#設定兩個類別的中⼼
clusters_std =[3
,1]#設定兩個類別的方差
x, y = make_blobs(n_samples=
[class_1, class_2]
,centers=centers,
cluster_std=clusters_std,
random_state=
0, shuffle=
false
)x.shape
np.unique(y)
array([0
,1])
#檢視所有貝葉斯在樣本不平衡資料集上的表現
name =
["multinomial"
,"gaussian"
,"bernoulli"
]models =
[multinomialnb(
),gaussiannb(
),bernoullinb()]
for name,clf in
zip(name,models)
: xtrain, xtest, ytrain, ytest = train_test_split(x,y
,test_size=
0.3,random_state=
420)
if name !=
"gaussian"
: kbs = kbinsdiscretizer(n_bins=
10, encode=
'onehot'
).fit(xtrain)
xtrain = kbs.transform(xtrain)
xtest = kbs.transform(xtest)
clf.fit(xtrain,ytrain)
y_pred = clf.predict(xtest)
proba = clf.predict_proba(xtest)[:
,1] score = clf.score(xtest,ytest)
print
(name)
print
("\taccuracy:"
.format
(score)
)print
("\trecall:"
.format
(recall_score(ytest,y_pred)))
print
("\tauc:"
.format
(auc(ytest,proba)
))
multinomial
accuracy:
0.990
recall:
0.000
auc:
0.991
gaussian
accuracy:
0.990
recall:
0.438
auc:
0.993
bernoulli
accuracy:
0.987
recall:
0.771
auc:
0.987
從結果上來看:
多項式樸素貝葉斯判斷出了所有的多數類樣本,但放棄了全部的少數類樣本,受到樣本不均衡問題影響最嚴重。
高斯比多項式在少數類的判斷上更加成功⼀些,至少得到了43.8%的recall。
伯努利貝葉斯雖然整體的準確度不如多項式和高斯樸素貝葉斯,但至少成功捕捉出了77.1%的少數類。
可見,伯努利貝葉斯最能夠忍受樣本不均衡問題。
可是,伯努利貝葉斯只能用於處理二項分布資料,在現實中,強行將所有的資料都二值化不會永遠得到好結果,在有多個特徵的時候,更需要乙個個去判斷究竟二值化的閾值該取多少才能夠讓演算法的效果優秀。這樣做無疑是非常低效的。如果目標是捕捉少數類,應該怎麼辦呢?高斯樸素貝葉斯的效果雖然比多項式好,但是也沒有好到可以用來幫助我們捕捉少數類的程度——43.8%,還不如拋硬幣的結果。
因此,孜孜不倦的統計學家們改進了樸素貝葉斯演算法,修正了包括無法處理樣本不平衡在內的傳統樸素貝葉斯的眾多缺點,得到了一些新興貝葉斯演算法,比如補集樸素貝葉斯等。
(機器學習)樸素貝葉斯及其sklearn應用
樸素貝葉斯的常見應用場景 1 文字分類 2 影象識別 貝葉斯決策理論核心思想 d是乙個資料集,x,y x,y x,y 是d的乙個資料點,p1 x,y p 1 x,y p1 x,y 表示 x,y x,y x,y 屬於類別1的概率,p2 x,y p 2 x,y p2 x,y 表示 x,y x,y x,y...
機器學習 貝葉斯
bayes.py包含了所有函式的實現,需要做的是,明白各個函式的功能作用及輸入輸出,在指令碼中完成函式的呼叫,給出要求的格式的結果。from numpy import import csv import random random.seed 21860251 def loaddataset post...
Sklearn實現樸素貝葉斯
sklearn 實現樸素貝葉斯 在scikit learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而be...