伯努利朴素贝叶斯-python sklearn实现 作者:马育民 • 2023-01-11 15:13 • 阅读:10084 # 介绍 伯努利分布朴素贝叶斯(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)。如果没有给出具体的先验概率则自动根据数据来进行计算。 # 例子 男生想女生求婚,男生有四个特征,与女孩嫁不嫁相关,这四个特征是: - 颜值:不帅、帅 - 性格:不好、好 - 个子:高、矮 - 上进:不上进、上进 目前有以下数据: [![](/upload/0/0/1IX4kmXBf9V8.png)](/upload/0/0/1IX4kmXBf9V8.png) 当某男生的特征是:不帅、性格不好、个子矮、不上进,计算出:女生嫁给他的概率 ### 解决 取出前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 原文出处:http://malaoshi.top/show_1IX4l9X4tWMJ.html