朴素贝叶斯
朴素贝叶斯概述
贝叶斯算法是统计学分类方法,它是一类利用概率统计知识进行分类的算法。
常见应用场景
-
文本分类/垃圾文本过滤/情感判别
-
多分类实时预测
-
推荐系统
朴素贝叶斯算法原理
朴素贝叶斯-概率公式
-
条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”
-
全概率:设试验E的样本空间为S(样本),A为E的事件,𝐵1,𝐵2,…,𝐵n为S的一个划分,且P(𝐵𝑖 )>0(I =
1,2,…,n),则P(A)=P(𝐴Τ𝐵1)P(𝐵1) + P(𝐴Τ𝐵2)P(𝐵2) +…+ P(𝐴Τ𝐵n)P(𝐵𝑛)
-
贝叶斯:设试验E的样本空间为S。A为E的事件,𝐵1,𝐵2,…,𝐵n为S的一个划分,且P(𝐵𝑖 )>0(I = 1,2,…,n),则
朴素贝叶斯-条件概率示例
双胞胎家庭的小孩性别样本:{男男,男女,女男,女女},求家中至少有一个男孩,家中有一个女孩的概率。
![image-20220717161110739](https://i-blog.csdnimg.cn/blog_migrate/1a0ee93501811e0c2311b4858a600d8d.png)
为什么用P(AB)/P(B)?
因为实际求的内容是在有一个男孩的情况下,有一个女孩的概率是多少,所以是求 家中为一男一女的概率 在 家中至少有一个男孩的概率中的占比.
P(A/B) 读作: 在b条件下a的概率
全概率案例
某保险公司认为投保人可以分为两类:容易出事故人群和谨慎人群。
第一类容易出事故,一年内出事故的概率是0.4,占总人口的20%;
另一类人谨慎,出事故的概率为0.1,占人口的80%。
**现有一个新的投保人,投保此类险种,问:该投保人在购买保单后一年内将出事故的概率**有多大?
![image-20220717161513268](https://i-blog.csdnimg.cn/blog_migrate/cd45ac95887ace9965faba47b0a0c7dd.png)
![image-20220717161529205](https://i-blog.csdnimg.cn/blog_migrate/93670a8ba521c5f06bc3a8c60409c12c.png)
贝叶斯案例
对以往数据分析结果表明,当机器调整得良好时,产品的合格率为98%,而当机器发生某种故障时,其合
格率为55%。每当早上机器开动时,机器调 整良好的概率为95%。试求已知某日早上第一件产品是合格
品时,机器调整良好的概率是多少?
![image-20220719230347211](https://i-blog.csdnimg.cn/blog_migrate/ac0d11b13ca0d50ccb081e4e1b7b229c.png)
朴素贝叶斯分类器
朴素贝叶斯分类器原理:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
**公式化定义:**设定输入空间为𝓍 ⊆ 𝑅𝑛为𝑛
维向量的集合,输出空间为𝒴 = {𝑐1, 𝑐2, ⋯ , 𝑐𝑘}
一共𝑘个类别。训练数据集为:𝑇{ 𝑥1, 𝑦1 , 𝑥2, 𝑦2 , ⋯ , 𝑥𝑁, 𝑦𝑁 }
,并根据先验分贝和条件分布可得联合概率分布。
朴素贝叶斯分类器-流程
- 计算先验概率及条件概率
- 对于给定的实例 进行计算
- 确定实例x的类
朴素贝叶斯-“朴素”
- 贝叶斯和朴素贝叶斯有啥区别?
- 朴素贝叶斯为啥“朴素”?
因为它假定所有的特征在数据集中的作用是同样重要和独立的,正如我们所知,这个假设在现实世界中是很不真实的,因此,说是很“朴素的”
朴素贝叶斯算法是基于贝叶斯定理和“特征条件独立”假设的分类算法
-
首先基于特征条件独立假设学习输入/输出的联合概率分布
-
然后基于此模型,对给定的x,利用贝叶斯定理求出后验概率最大的y
朴素贝叶斯算法原理总结
朴素贝叶斯算法数学公式:
![image-20220717162046522](https://i-blog.csdnimg.cn/blog_migrate/fe79efb997c1da13a7d34a96d244f03a.png)
由联合概率公式推导而来:
- P(Y,X)=P(Y|X)P(X)=P(X|Y)P(Y)
- P(Y)叫做先验概率,P(Y|X)叫做后验概率, P(Y,X)叫做联合概率
在机器学习的视角下,我们把X理解成“具 有某特征”,把Y理解成“类别标签"
![image-20220717162124390](https://i-blog.csdnimg.cn/blog_migrate/ea284701cc427f0bb5dfaa27556c26f7.png)
贝叶斯方法把计算“具有某特征的条件下属 于某类”的概率转换成需要计算“属于某类 的条件下具有某特征”
的概率,属于有监督学习
朴素贝叶斯-贝叶斯示例
问题: 男生想对自己的女友求婚,他身上的四个特点分别是 不帅,性格不好,身高矮,不上进,女生是嫁还是不嫁?
朴素贝叶斯算法的三种模型
- 多项式(高斯)模型:
- 重复的词语我们视为其出现多次
- 统计与判断时,都关注重复次数
- 伯努利模型:
- 将重复的词语都视为其只出现1次
- 这种方式更简化与方便,但丢失了词频的信息,效果可能会差一点
- 混合模型:
- 在计算句子概率时,不考虑重复词语出现的次数,但在统计计算词语的概率时,却考虑重复词语的出现次数
- 这种方式更简化与方便,当丢失了词频的信息,因此效果可能会差一点
![image-20220717162728101](https://i-blog.csdnimg.cn/blog_migrate/98f4c45f8503bccb2ccfdb6cfdfd52ca.png)
朴素贝叶斯算法的三种模型-总结
-
**高斯朴素贝叶斯:**适用于连续型数值,比如身高在160cm以下为一类,160-170cm为一个类,则划分不
够细腻。
-
**多项式朴素贝叶斯:**常用于文本分类,特征是单词,值是单词出现的次数
-
**伯努利朴素贝叶斯:**所用特征为全局特征,只是它计算的不是单词的数量,而是出现则为1,否则为0。
也就是特征等权重
朴素贝叶斯算法-平滑技术
![image-20220717162859224](https://i-blog.csdnimg.cn/blog_migrate/940594060f7e72d12a85c15c595f9df8.png)
扫描一下训练集,发现“正规发票”这个词从未出现过,于是P(“正规发票”|S)=0,于是**整个概率都变成0**了
哪怕训练集再大,也可能有覆盖不到的词语,平滑技术就是为了处理这样的问题。朴实/土,但是直接而有效。
- 对于伯努利模型,P(“正规发票”|S)的一种 平滑算法是:
![image-20220717162948611](https://i-blog.csdnimg.cn/blog_migrate/c1db752496917c818b7376574d0125b9.png)
- 对于多项式模型,P(“正规发票”| S)的一 种平滑算法是:
![image-20220717163005699](https://i-blog.csdnimg.cn/blog_migrate/924c89dfb78e109694945cf67a32d82c.png)
贝叶斯方法与最大似然的关系
- 教派争论
- 最大似然法:不考虑贝叶斯公式的先验概率
- 贝叶斯学派的适用范围更广,关键要先验概率靠谱
- 而频率学派有效的前提也是他们的先验概率同样是经验统计的结果
朴素贝叶斯优缺点
优点:
-
贝叶斯决策能对信息的价值是否需要采集的信息做出科学的判断。
-
对调查结果的可能性加以数量化的评价,而不像一般的决策方法那样,对结果或是完全相信,抑或是完全不信。
-
可以在决策过程中根据具体情况下不断使用,决策逐步完善和更加科学。
-
对小规模的数据表现很好,适合多分类任务,适合增量式训练。
-
对待预测样本进行预测,过程简单速度快(想想邮件分类的问题,预测就是分词后进行概率乘积,在log域直接做加法更快)。
-
对于多分类问题也同样很有效,复杂度也不会有大程度上升。
-
在分布独立这个假设成立的情况下,贝叶斯分类器效果奇好,会略胜于逻辑回归,同时我们需要的样本量也更少一点。
-
对于类别类的输入特征变量,效果非常好。对于数值型变量特征,我们是默认它符合正态分布的
缺点:
-
它需要的数据更多,分析计算十分复杂
-
对输入数据的表达形式很敏感
-
对于测试集中的一个类别变量特征,如果在训练集里没见过,直接算的话概率就是0了,预测功能就失
效了。当然,我们前面的文章提过我们有一种技术叫做『平滑』操作,可以缓解这个问题,最常见的
平滑技术是拉普拉斯估测。
-
朴素贝叶斯算出的概率结果,比较大小还凑合,实际物理含义…恩,别太当真。
-
朴素贝叶斯有分布独立的假设前提,而现实生活中这些predictor很难是完全独立的。
朴素贝叶斯代码实现
朴素贝叶斯-高斯模型
导入模块(参数不用管,可以当做无参数)
from sklearn.naive_bayes import GaussianNB
朴素贝叶斯-伯努利模型
导入模块
from sklearn.naive_bayes import BernoulliNB
模型参数说明
-
alpha:浮点型,可选项,默认1.0,添加拉普拉修/Lidstone平滑参数。(某些特征未出现在测试集中,)
-
binarize:将数据特征二值化的阈值
-
fit_prior:布尔型,可选项,默认True,表示是否学习先验概率,参数为False表示所有类标记具有相同的
先验概率
-
class_prior:类似array,数组大小为(n_classes,),默认None,类先验概率
朴素贝叶斯-混合模型(多项式朴素贝叶斯)
导入模块
from sklearn.naive_bayes import MultinomialNB
模型参数说明
-
alpha:浮点型可选参数,默认为1.0,其实就是添加拉普拉斯平滑,即为上述公式中的λ ,如果这个参数设置为0,就是不添加平滑
-
fit_prior:布尔型可选参数,默认为True。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率,此时的先验概率为P(Y=Ck)=mk/m。其中m为训练集样本总数量,mk为输出为第k类别的训练集样本数。
![image-20220717163550327](https://i-blog.csdnimg.cn/blog_migrate/61678092b3a07b3b373f5675f4ac4514.png)
- class_prior:类似array,数组大小为(n_classes,),可选参数,默认None,类先验概率.
朴素贝叶斯-参数总结
-
朴素贝叶斯分类器一般可调参数比较少
-
集中精力进行数据的预处理,以及特征选择
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
# 多项式朴素贝叶斯
from sklearn.naive_bayes import MultinomialNB
# 伯努利朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
data = datasets.load_iris()
x = data['data']
y = data['target']
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
x_train.shape
y_train.shape
g_nb = GaussianNB().fit(x_train,y_train)
g_nb.score(x_test,y_test)
m_nb = MultinomialNB().fit(x_train,y_train)
m_nb.score(x_test,y_test)
b_nb = BernoulliNB().fit(x_train,y_train)
b_nb.score(x_test,y_test)