#效果不太好,多项式更擅长分类型数据,归一化之后成为了连续型数据
#所以可以进行分箱,转换为分类型数据
from sklearn.preprocessing import KBinsDiscretizer
kbs=KBinsDiscretizer(n_bins=10,encode="onehot").fit(Xtrain)
Xtrain_=kbs.transform(Xtrain)
Xtest_=kbs.transform(Xtest)
#没有进行归一化时因为分箱后都是0和1
mnb=MultinomialNB().fit(Xtrain_,ytrain)
mnb.score(Xtest_,ytest)
#探索样本不均衡问题
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.datasets import make_blobs
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import brier_score_loss as bs,recall_score,roc_auc_score as auc
#创建数据集
class1=50000
class2=500
centers=[[0.0,0.0],[5.0,5.0]]
std=[3,1]
X,y=make_blobs(n_samples=[class1,class2],
centers=centers,
cluster_std=std,
random_state=0,
shuffle=False)
names=["Multinomial","Gaussian","Bernoulli"]
models=[MultinomialNB(),GaussianNB(),BernoulliNB()]
for clf,name in zip(models,names):
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("\tBrier:{:.3f}".format(bs(ytest,proba,pos_label=1)))
print("\tAccuracy:{:.3f}".format(score))
print("\tRecall:{:.3f}".format(recall_score(ytest,y_pred)))
print("\tAUC:{:.3f}".format(auc(ytest,proba)))
从结果上来看,多项式朴素贝叶斯判断出了所有的多数类样本,但放弃了全部的少数类样本,受到样本不均衡问题影
响最严重。高斯比多项式在少数类的判断上更加成功一些,至少得到了43.8%的recall。伯努利贝叶斯虽然整体的准
确度和布里尔分数不如多项式和高斯朴素贝叶斯和,但至少成功捕捉出了77.1%的少数类。可见,伯努利贝叶斯最能
够忍受样本不均衡问题。
可是,伯努利贝叶斯只能用于处理二项分布数据,在现实中,强行将所有的数据都二值化不会永远得到好结果,在我
们有多个特征的时候,我们更需要一个个去判断究竟二值化的阈值该取多少才能够让算法的效果优秀。这样做无疑是
非常低效的。那如果我们的目标是捕捉少数类,我们应该怎么办呢?高斯朴素贝叶斯的效果虽然比多项式好,但是也
没有好到可以用来帮助我们捕捉少数类的程度——43.8%,还不如抛硬币的结果。因此,孜孜不倦的统计学家们改进
了朴素贝叶斯算法,修正了包括无法处理样本不平衡在内的传统朴素贝叶斯的众多缺点,得到了新兴贝叶斯算法:补
集朴素贝叶斯
sklearn.metrics.roc_auc_score(y_true, y_score, *, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None)
二分类
y_true:样本的真实标签,形状(样本数,)
y_score:预测为1的概率值,形状(样本数,)
sklearn.metrics.recall_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')
输入参数:
y_true:真实标签。
y_pred:预测标签。
labels:可选参数,是一个list。二分类时,用不上这个参数。
pos_label:字符串或者int类型,默认值是1.
average:字符串类型,取值为 [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]。默认为二分类,给出正样本的召回率,也就是pos_label默认参数1时的召回率。
sample_weight:(没用它)
zero_division:
输出:
正样本召回率,浮点型。