多项式贝叶斯可能是除了高斯之外,最为人所知的贝叶斯算法了。它也是基于原始的贝叶斯理论,但假设概率分布是
服从一个简单多项式分布。多项式分布来源于统计学中的多项式实验,这种实验可以具体解释为:实验包括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.49857142857142855mnb.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.9966666666666667brier_score_loss(Ytest,mnb.predict_proba(Xtest_)[:,1],pos_label=1)
 Out[70]: 0.0014593932778211862

可以看出,多项式朴素贝叶斯的基本操作和代码都非常简单。同样的数据,如果采用哑变量方式的分箱处理,多项式
贝叶斯的效果会突飞猛进