介绍
伯努利分布朴素贝叶斯(BernoulliNB),适用于二项分布,即:二分类问题,如:是否、对错
数据集中可以存在 多个特征,但每个特征都是 二分类 的,可以用布尔变量表示,也可以表示为 0,1
或者 -1,1
等任意二分类组合
注意:要求将样本转换为二分类特征向量
声明
class sklearn.naive_bayes.BernoulliNB(
alpha=1.0,
binarize=0.0,
fit_prior=True,
class_prior=None
)
形参解释:
- alpha : 浮点数, 可不填 (默认为1.0)
拉普拉斯或利德斯通平滑的参数λ
,如果设置为0则表示完全没有平滑选项。
注意:平滑相当于人为给概率加上一些噪音,因此λ
设置得越大,伯努利朴素贝叶斯的精确性会越低(虽然影响不是非常大),布里尔分数也会逐渐升高。
- binarize : 浮点数或None,可不填,默认为0
将特征二值化的阈值,如果设定为None,则假定为特征已经被二值化完毕
- fit_prior : 布尔值, 可不填 (默认为True)
是否学习先验概率P(Y=c)
。如果设置为false,则不使用先验概率,而使用统一先验概率(uniform prior),即认为每个标签类出现的概率是1 / n_classes
- class_prior:形似数组的结构,结构为(n_classes, ),可不不填(默认为None)
类的先验概率P(Y=c)。如果没有给出具体的先验概率则自动根据数据来进行计算。
例子
男生想女生求婚,男生有四个特征,与女孩嫁不嫁相关,这四个特征是:
- 颜值:不帅、帅
- 性格:不好、好
- 个子:高、矮
- 上进:不上进、上进
目前有以下数据:
当某男生的特征是:不帅、性格不好、个子矮、不上进,计算出:女生嫁给他的概率
解决
取出前10条记录用于训练,后2条记录用于测试
import numpy as np
#导入朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
'''
训练数据
第一列表示颜值,1表示帅,0表示不帅
第二列表示性格,1表示好,0表示不好
第三列表示身高,1表示高,0表示矮
第四列表示是否上进,1表示上进,0表示不上进
'''
x=np.array([[1,0,0,0],
[0,1,0,1],
[1,1,0,1],
[0,1,1,1],
[1,0,0,1],
[0,0,0,0],
[1,1,1,0],
[0,1,1,1],
[1,1,1,1],
[0,0,1,1]
])
# 训练数据的标签,0表示不嫁,1表示嫁
y=np.array([0,0,1,1,0,0,1,1,1,1])
nb=BernoulliNB()
nb.fit(x,y)
# 测试数据
test_x=np.array([
[1,1,0,0],
[1,1,0,0]]
)
test_y=np.array([0,0])
print("评测模型:", nb.score(test_x,test_y) )
# 预测
prd_x=np.array([
[1,1,1,0],
[1,0,1,0]]
)
pre=nb.predict(prd_x)
pre2=nb.predict_proba(prd_x)
#输出模型预测结果
print("预测结果为:",pre)
#输出模型预测的分类概率
print("预测的概率为:",pre2)
执行结果:
评测模型: 1.0
预测结果为: [1 1]
预测的概率为: [[0.11636364 0.88363636]
[0.44137931 0.55862069]]
参考:
https://blog.csdn.net/gracejpw/article/details/102406860
https://blog.csdn.net/weixin_48077303/article/details/117396838