0. 前言
上一篇博客学习了高斯朴素贝叶斯,下面将对多项式朴素贝叶斯作一个说明。
多项式朴素贝叶斯
- 多项式朴素贝叶斯 (MultinomialNB)
基于原始的贝叶斯理论,假设概率服从一个简单的多项式分布。对于多项式分布,举个栗子来说明一下:
假设用X表示投掷一枚硬币的结果,正面的概率P(X=正|Y) = 0.5,反面的概率P(X=反|Y) = 0.5,并且这两种结果是相互独立的,且它们的和为1。这是多项式分布中的特殊的二项分布。只有两种可能的取值,不是正面就是反面。每掷一次硬币的测试过程就是一个样本,样本有两个特征x1:正面,x2:反面。出现哪一面,哪个特征值就为1,反之为0。
对于多项分布,可以以掷骰子为例。假设**X’**表示投骰子的结果, x i {x_i} xi的取值就是[1,2,3,4,5,6],并且这六种结果是相互独立的,在样本的数量足够多的情况下,每一个点数出现的情况都是1/6。这就是多项分布。每投骰子的测试过程就是一个样本,样本有6个特征x1:点数为1,x2:点数为2…出现哪个点数,哪个特征值就为1,反之为0。
从上面所举的例子可以看出,多项式分布处理的是离散型的变量。
naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- alpha:默认为1.0,一般不调
- fit_prior:表示是否学习先验概率。默认True;若设置为false表示不使用先验概率
- class_prior:表示类的先验概率(即,没有条件下的P(Y))。若指定,则不根据数据调整;若不指定,则根据数据计算先验。默认为None。
调用算法库实现
from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import numpy
# 64个特征,多分类问题,类别是10个
# 1. 加载数据集
digits = load_digits()
X = digits.data # 样本
y = digits.target # 标签
print(digits.data.shape)
print(numpy.unique(digits.target))
# 2. 划分数据集
X_trainer, X_test, Y_trainer, Y_test = train_test_split(X, y, test_size=0.3)
# 3. 调用MultinomialNB
mnb = MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
mnb.fit(X_trainer, Y_trainer)
# 4. 查看预测结果
# 4.1 查看预测精确性
mnb_score = mnb.score(X_test, Y_test) # 返回预测的精确性accuracy
print("Score:", mnb_score)
# 4.1 查看预测结果(对应输出每一个类别下的概率)
mnb_prob = mnb.predict_proba(X_test) # 0-9中概率最大的标签是样本的标签
print("Predict_proba:", mnb_prob)
输出结果:
(1797, 64)
[0 1 2 3 4 5 6 7 8 9]
Score: 0.8962962962962963
Predict_proba: [[1.06794923e-056 9.37284134e-054 3.60734387e-063 ... 2.49038164e-124
4.18088597e-045 1.00000000e+000]
[6.73894696e-037 2.61864527e-021 1.83430221e-043 ... 3.57726867e-062
9.42336153e-013 1.00000000e+000]
[1.00000000e+000 1.10548983e-063 5.43411694e-092 ... 3.31558947e-094
1.63483203e-060 4.43732135e-047]
...
[1.55450057e-055 1.38271153e-042 7.07265218e-038 ... 1.33099303e-124
2.82428055e-026 1.00000000e+000]
[3.59738116e-075 6.88579069e-053 2.24071006e-070 ... 6.85916370e-170
1.39585810e-040 6.14328000e-086]
[4.86878099e-093 1.88067499e-063 1.00000000e+000 ... 3.89626668e-130
3.05840801e-033 4.44786653e-062]]
根据精确性来看,预测效果还不错。