【机器学习原理】朴素贝叶斯分类算法
作者:互联网
文章目录
一、朴素贝叶斯公式
- 条件概率
- 先验概率
- 后验概率
- 似然度
1. 从统计角度看分类问题
我们知道,选择题一般有A、B、C、D四个选项,假设答案在四项上的分布是相同的,即如果有100道选择题,答案分别为A、B、C、D的题目都分别出现了25次,那么不管题目内容是什么,随便蒙对答案的概率就为25%。
也许你已做过无数道选择题,但可能从未想过如果你不是答题人而是出题人,那么选择题在你看来会不会有什么不同?截然不同。做选择题时,你需要在四个选项中找到唯一正确的答案,但出选择题时,你却是已经知道正确的答案,需要再凑三个选项,最后还要把正确选项藏在其中。
第一个问题,虽然三个选项原则上应该尽可能地都具有迷惑性,但受制于各种限制,实际可能迷惑程度不一。譬如还是A、B、C、D四个选项,虽然答题者不能肯定你究竟把正确答案藏在哪儿,但能肯定选项C不会是答案,那么这时答题者再求助于骰子,就只需要三选一,正确率从25%一下提升到了33.3%,如果发现连选项A也站不住脚,那么正确率就飙升到了50%。
你也许会想,这种方式是不是对奋斗者有点太不公平了?说是天道酬勤,你看纯靠瞎蒙的正确率能达到25%,但排除一个错误选项后正确率也只不过33.3%,而且同样还是输多赢少。可是要知道,这背后却是“一点儿不用功”和“用了一点儿功”的天壤之别,说明奋斗的价值不到10%,不公平!
为了维护天道酬勤的正义性,我们是得想想办法。如果有一个办法,能够让你在排除一个选项之后,正确率提升到50%,是不是就能比较好地解决这个“不公平”?不过,真的有这样违反常识的办法吗?
也许。这关乎出题人要解决的第二问题,究竟要把正确答案藏在A、B、C、D哪个字母后面。是的,选择题的出题者同样也需要做选择题,而且同样也是四选一。我们先不去深究出题人和答题人冥冥之中是否存在着某种诡谲的对等公平,设想一下你就是出题老师,你已经为这道选择题拟好了四个选项,那么,你要怎么安排四个选项的位置呢?
从没有人深究过这个不算问题的问题,更谈不上可靠的实际调查数据,所以从这里开始我们只能假设了。假设出题人存在某种偏好,譬如说已经将一个混淆选项填入字母C,那下意识地就习惯把另一个混淆选项填入字母D,那么,我们就能利用这个心理习惯来提高正确率。
我们把“C和D一起成为混淆选项”套用一个严肃点儿的词叫相关性,这是统计工作中经常出现的一个现象,虽然两个对象之间并不存在逻辑和因果关系,但如果我们对某位出题人的出题情况进行统计,发现C和D就是没理由地经常“出双入对”,也就是发现如果C是错误选项,那么D很有可能也是错误选项,套用一个术语,那就是出现了C和D的共享频率很高的现象。
统计数据背后的因果关系需要交由后续工作进行研究,但所发现的关联现象是能够直接派上用场的。例如在基于上面的假设做选择题时,已经排除了选项C,那不妨顺手划掉选项D,在A和B之间用硬币决出最终的答案。这就是概率统计的魔术,统计学在机器学习中扮演着非常重要的角色,甚至有人断言机器学习的实质就是计算机加统计学,通过统计样本的概率分布情况来进行预测。这样的解释也许会降低机器学习的神秘感,但能更好地理解其中的运作原理。
2. 贝叶斯公式的基本思想
朴素贝叶斯由两部分组成,“朴素”是一种带有假设的限定条件,“贝叶斯”则指的是贝叶斯公式。合起来,朴素贝叶斯指的就是在“朴素”假设条件下运用“贝叶斯公式”。
- P ( x ) P(x) P(x):这是概率统计中最基本的符号,表示X出现的概率。如在掷骰子的游戏中, P ( 6 ) P(6) P(6)就是指骰子出现数字“6”的概率。这个概率显然为 1 / 6 1/6 1/6。
- P ( X ∣ Y ) P(X|Y) P(X∣Y):这是条件概率的符号,比上面的概率符号中间多了一竖,代表条件。 P ( X ∣ Y ) P(X|Y) P(X∣Y)的意思是在 Y Y Y发生的条件下, X X X发生的概率。它是贝叶斯公式的主角。
我们用P(D)代表选项D为错误选项的概率,在正确答案均匀分布时,概率值为25%。那么P(D|C)就代表选项C为错误选项时,D为错误选项的概率。这与单纯的P(D)有什么不同呢?别忘了,这位老师有一点癖好,选择了C为错误选项之后,会顺手把D也作为错误选项。现在的已知条件是选项C已经确定是错误选项了,在这种前提条件下,选项D是错误选项的概率,也即P(D|C)的值就远远超过了25%。这就是条件概率的意义。
贝叶斯的基本逻辑
贝叶斯公式的核心是条件概率,譬如P(B|A),就表示当A发生时,B发生的概率,如果P(B|A)的值越大,说明一旦发生了A,B就越可能发生。两者可能存在较高的相关性。
因果性很简单,就是A→B,但如果A和B满足相关性,情况则要复杂一些,譬如最经典的数据挖掘案例“尿布和啤酒”,年轻的爸爸会在买尿布的时候顺便买啤酒,这时尿布和啤酒就呈相关性,如果我们用P(尿布)来表示买尿布的概率的话,一旦P(尿布)的值增加,那么P(啤酒|尿布)的值也会增加。其意义是,当尿布的销量增加时,啤酒的销量也会增加,这就是相关性,但相关性不是因果性,二者虽然同时增长,但并不存在因果关系。
3. 用贝叶斯公式进行选择
贝叶斯公式预测的核心思想就5个字——“看起来更像”。
**第一轮的分级:**是已知类别而统计特征,即某一特征在该类中的出现概率,是把类别分解成特征概率的过程。
**第二轮的还原:**是已知特征而推测类别,这里将第一轮的结果用上,是把知道统计情况的特征还原成某一类的过程。
说到这里,就不能不提“先验”和“后验”了,这两个词儿看起来相当哲学,也确实是康德的《纯粹理性批判》中的主角。对于这里的“验”,主张认知的人将其解释成经验,主张实践的人将其解释成“实验”,在我看来,先验和后验不妨认为是两位诸葛亮,先验这位是事前诸葛亮,后验这位是事后诸葛亮。就以空城计来说,诸葛亮布阵的时候,是根据司马懿一贯的个性,断定他不敢进城,这是先验。等到司马懿真的来了,在城下犹豫不决,要退不退,诸葛亮一看就知道事妥了,这是后验。
贝叶斯版的预测未来
先验和后验是怎么用于预测的呢?这里我想展示一下我在中学时学会的看发型猜女同学的“技术”。假设我的班上一共有10位女同学,其中一位叫安吉利,中学时女生个子都差不多高,又穿着一样的校服,光看背影猜中谁是安吉利的概率是10%,基本靠蒙了,这就是先验概率,先记作P(安吉利)。但是有一天我突然发现,安吉利同学特别喜欢扎马尾,不过扎马尾又不是什么独占的发明专利,而且这个年龄阶段的女孩子又都爱扎马尾,所以,不是所有扎马尾的女同学都叫安吉利。
怎么办呢?我又利用上课的时间统计了一下,班上女同学一共有三种发型,扎马尾的概率大概为30%,记作P(马尾)。而安吉利同学真的非常喜欢扎马尾,她扎马尾的概率高达70%,记作P(马尾|安吉利)。这里我们用上了前面介绍的条件概率,P(马尾|安吉利)的意思是,在女同学是安吉利的前提条件下发型是马尾的概率,在贝叶斯公式中这又称为似然度(Likelihood)。有了这三个统计数据,我心里就有底了,往后见到扎马尾的女同学,有两成多的概率就是我们的安吉利。
其中的奥秘就是贝叶斯公式。也许你已经察觉,扎马尾的女同学中她是安吉利的概率也是一种条件概率,记作P(安吉利|马尾),这就是后验概率。根据贝叶斯公式,我们有:
P
(
马
尾
)
⋅
P
(
安
吉
利
∣
马
尾
)
=
P
(
安
吉
利
)
⋅
P
(
马
尾
∣
安
吉
利
)
P(马尾)·P(安吉利|马尾)= P(安吉利)·P(马尾|安吉利)
P(马尾)⋅P(安吉利∣马尾)=P(安吉利)⋅P(马尾∣安吉利)
代入我们牺牲宝贵的上课时间得到的统计数据,则可算出:
P
(
安
吉
利
∣
马
尾
)
=
10
%
×
70
%
/
30
%
=
23.3
%
P(安吉利|马尾)=10\%×70\%/30\%=23.3\%
P(安吉利∣马尾)=10%×70%/30%=23.3%
前面我们说,用先验和后验进行选择判断要分成两个阶段,现在有了似然度就好解释了。先验概率是已经知道的,而我们通过经验或实验要了解的就是这个似然度,知道似然度再加上先验,我们就能知道后验概率了。
二、朴素贝叶斯分类的算法原理
1. 朴素贝叶斯分类算法的基本思路
先从一个最简化的例子看分类问题。假设有两个类:C1和C2,C1有特征A和B, C2有特征A和C,请问怎么区分这两个类?很简单,看看是否存在B,存在就是C1,否则就是C2。
在问题变得复杂一点儿,在100个C1样本中,样本出现特征不稳定的现象,只有70%的样本拥有特征B,怎么办?确实复杂了一点儿,但也有办法,可以看看是否具有特征C来进行排除。
不错,不过这只是开胃小菜。“复杂的现实环境”又稍微热了下身,让剩下30%的样本拥有了特征C。你感觉这下子恐怕是不能用简单的判断进行分类了,不过多加判断也许还能抗得住。然而,这只是开始,现实的特征可能成百上千个,类与类的特征更是我中有你、你中有我,这种犬牙交错的形势如果要纯手工写判断,恐怕手腕是要罢工起义的——好在我们有统计。
先回忆一下,分类问题的一项样本的数据记录大概是以下这种形式:
[
特
征
X
1
的
值
,
特
征
X
2
的
值
,
特
征
X
3
的
值
,
…
,
类
别
C
1
]
[特征X_1的值,特征X_2的值,特征X_3的值,…,类别C_1]
[特征X1的值,特征X2的值,特征X3的值,…,类别C1]
[
特
征
X
1
的
值
,
特
征
X
2
的
值
,
特
征
X
3
的
值
,
…
,
类
别
C
2
]
[特征X_1的值,特征X_2的值,特征X_3的值,…,类别C_2]
[特征X1的值,特征X2的值,特征X3的值,…,类别C2]
这里我们先考虑简单一点儿的情况,特征值只是用1和0来表示布尔类型的有和无。那么类C1大概可以表示为01101。这是最理想的情况,现在引入“复杂的现实环境”,发现类C1的部分样本为00110,再次陷入简单逻辑无法划分的难题,那么交给统计可以怎么解决这个问题呢?
不妨反过来想,我们需要什么才能解决这个问题。前面提到概率,如果我们知道特征X1值为1时,该样本属于类别C1的概率;特征X2值为1时,该样本属于类别C1的概率,以此类推,然后最终算出该样本对于各个类的概率值,哪个概率最大就可能是哪个类。
根据这个方法,我们实际要求解的就是类别C1的后验概率:
P
(
类
别
C
1
∣
特
征
X
1
,
特
征
X
2
,
特
征
X
3
,
…
)
P(类别C_1|特征X_1,特征X_2,特征X_3,…)
P(类别C1∣特征X1,特征X2,特征X3,…)
这个式子的意思是,在特征X1、特征X2、特征X3等共同发生的条件下,类别C1发生的概率。我们已经知道,可以通过似然度来求得后验概率。某个特征的似然度表示如下:
P
(
特
征
X
∣
类
别
C
1
,
特
征
X
2
,
特
征
X
3
,
…
)
P(特征X|类别C_1,特征X_2,特征X_3,…)
P(特征X∣类别C1,特征X2,特征X3,…)
朴素+贝叶斯
“朴素”是英文naive的中文翻译。
统计对象之间的关系也自然可能是相关的,可能是不相关的;相关的话,可能是正相关,也可能是负相关,相关的程度还有强弱……总之其中关系千丝万缕,甚至千奇百怪。可这样一来要一一弄清楚,调查难度很大,计算难度更大,这里我们为了利用贝叶斯公式计算,就很“朴素”地认为,或者说很“naive”地认为特征之间都是彼此独立的,使得贝叶斯公式的计算可以大大简化。
2.朴素贝叶斯分类算法的数学解析
贝叶斯公式:
P
(
y
∣
x
)
=
P
(
y
)
P
(
x
∣
y
)
p
(
x
)
(6-1)
P(y|x)=\frac{P(y)P(x|y)}{p(x)}\tag{6-1}
P(y∣x)=p(x)P(y)P(x∣y)(6-1)
- P(A)这种形式的意思为A出现的概率
- P(A|B)这种形式称作条件概率,为在B出现的条件下A出现的概率。
在贝叶斯公式中: - P(y)称为先验概率,
- P(y|x)称为后验概率,
- P(x|y)则称作似然度。
似然度也是朴素贝叶斯分类算法所需要“学习”的对象。
现在我们把y看作某个类,而把x当作特征,相应的贝叶斯公式为:
P ( y ∣ x 1 , ⋯ , x n ) = P ( y ) P ( x 1 , ⋯ , x n ∣ y ) p ( x 1 , ⋯ , x n ) (6-2) P(y|x_1,\cdots,x_n)=\frac{P(y)P(x_1,\cdots,x_n|y)}{p(x_1,\cdots,x_n)}\tag{6-2} P(y∣x1,⋯,xn)=p(x1,⋯,xn)P(y)P(x1,⋯,xn∣y)(6-2)
现在面临的困难在于数据采集总是有缺失和不全,所以特征x越多,这两个问题就会越突出,要统计这些特征同时出现的概率就越困难。
为此,朴素贝叶斯做了一个“朴素”的假设,即特征与特征之间是相互独立、互不影响的。如此一来,式子就能化简。某个特征的似然度就可以简化为:
P ( x i ∣ y , x 1 , ⋯ , x i − 1 , x i + 1 , ⋯ , x n ) = P ( x i ∣ y ) (6-3) P(x_i|y,x_1,\cdots,x_{i-1},x_{i+1},\cdots,x_n)=P(x_i|y)\tag{6-3} P(xi∣y,x1,⋯,xi−1,xi+1,⋯,xn)=P(xi∣y)(6-3)
可以看出,在“朴素”的假设条件下,要取得某个特征的似然度就简单很多。机器学习和统计中经常使用这种简化技巧,避免处理过于复杂的情况,其他比较知名的应用例子还包括马尔可夫链。
在“朴素”的假设条件下,求后验概率也变得简单,可以用以下方法:
P ( y ∣ x 1 , ⋯ , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) (6-4) P(y|x_1,\cdots,x_n)\propto P(y)\prod_{i=1}^nP(x_i|y)\tag{6-4} P(y∣x1,⋯,xn)∝P(y)i=1∏nP(xi∣y)(6-4)
这里没有采用等号,而是使用了一个“∝”符号。这是“正比于”的意思。为什么只需要“正比于”而不必“等于”呢?这与朴素贝叶斯算法的学习目标有关。
朴素贝叶斯算法利用后验概率进行预测,核心方法是通过似然度预测后验概率,而学习的过程就是不断提高似然度的过程。既然后验概率已经正比于似然度,那么提高似然度的同时,自然也就达到了提高后验概率的目的。这也是为了更方便实用而进行简化的例子。与后验概率的完整等式比较可知,如果采用等式,就仍然需要统计特征共同出现的概率:
P ( y ∣ x 1 , ⋯ , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , ⋯ , x n ) (6-5) P(y|x_1,\cdots,x_n)=\frac {P(y)\prod_{i=1}^nP(x_i|y)}{P(x_1,\cdots,x_n)}\tag{6-5} P(y∣x1,⋯,xn)=P(x1,⋯,xn)P(y)∏i=1nP(xi∣y)(6-5)
上式出现了一个有点像安全出口的符号“∏”,不过这不是什么出口,这是连乘号,有了这个符号, A1、 A2、 A3、…、 An几个元素相乘,就可以简写为∏Ai,不必再写成长长的一串了。在概率里,相乘意味着求两个事件同时发生的概率,连乘就是这几个事件共同发生的概率。
朴素贝叶斯的优化方法
朴素贝叶斯的数学背景基本就这么多了,你可能会疑惑:怎么本章没看见“老熟人”假设函数和损失函数呢?这与朴素贝叶斯算法的学习过程有关。朴素贝叶斯算法与其说是学习什么,不如说是要查找一个统计结果,通过比较不同特征与类之间的似然关系,最后把似然度最大的那个类作为预测结果。用数学表达式来描述也许更清楚:
y
^
=
a
r
g
m
a
x
y
P
(
y
)
∏
i
=
1
n
P
(
x
i
∣
y
)
(6-6)
\hat{y} = arg \underset{y}{max}P(y)\prod_{i=1}^nP(x_i|y) \tag{6-6}
y^=argymaxP(y)i=1∏nP(xi∣y)(6-6)
-
a
r
g
m
a
x
y
arg\underset{y}{max}
argymax:样子像是在求最大符号max前面加了串字母“arg”,这是“参数”的英文简写。 arg max符号也确实与参数有关,意思是参数取得什么值时,这个函数才能达到最大值,返回的是这个参数的值。譬如这里的
a
r
g
m
a
x
y
arg\underset{y}{max}
argymax,意思就是后面的
P
(
y
)
∏
i
=
1
n
P
(
x
i
∣
y
)
P(y)\prod_{i=1}^nP(x_i|y)
P(y)∏i=1nP(xi∣y)达到最大值时,y的取值是多少。
我们知道,这里的y代表的是类,每个类与特征的似然度,即P(xi|y)是不同的。在这个表达式中,P(y)也即先验概率是一个固定的值,要使表达式总体结果最大,只能依靠P(xi|y)。不妨把统计数据看成是一张大表格,学习算法的工作就是从中找到P(xi|y)值最大的那一项。该项的y是什么,最终的预测结果就输出什么。
可以看出,朴素贝叶斯算法其实是一次查表的过程,而不是过往的迭代逼近,因此也就不再需要驱动迭代逼近过程的假设函数和损失函数。不过,在概率的世界,什么样的结论都是需要以某种数据分布情况为前提的。在部分情况如正态分布下,P(x|y)的值可以构成一个函数,称为似然函数(Likelihood Function),可以通过调整参数来表示不同的似然度。在这种情况下,就又可以采用迭代逼近的方法了,与之对应的优化方法叫作极大似然估计(Maximum Likelihood Estimate,MLE)。
3. 朴素贝叶斯分类算法的具体步骤
使用朴素贝叶斯分类算法,具体需要三步:
- 统计样本数据。需要统计先验概率 P ( y ) P(y) P(y)和似然度 P ( x ∣ y ) P(x|y) P(x∣y)。
- 根据待预测样本所包含的特征,对不同类分别进行后验概率计算。譬如总的特征有A、B、C三项,但待测样本只包含A、C两项,那y1后验概率的计算方法就为 P ( y 1 ) P ( A ∣ y 1 ) P ( B ∣ y 1 ) P(y_1)P(A|y_1)P(B|y_1) P(y1)P(A∣y1)P(B∣y1)。
- 比较 y 1 , y 2 , … , y n y_1, y_2,…, y_n y1,y2,…,yn的后验概率,哪个的概率值最大就将其作为预测值输出。
三、在Python中使用朴素贝叶斯分类算法
在Scikit-Learn库中,基于贝叶斯这一大类的算法模型的相关类库都在sklearn.naive_bayes
包之中。根据似然度计算方法不同,朴素贝叶斯也分成几个具体的算法分支。对于本文主要介绍的多项式朴素贝叶斯(Multinomial NaiveBayes),该类在naive_bayes
包中为MultinomialNB。除此之外,还包括伯努利分布朴素贝叶斯的类BernoulliNB、高斯分布朴素贝叶斯的类GaussianNB等一共4种子算法类。
from sklearn.datasets import load_iris
# 从scikit-learn库导入朴素贝叶斯模型中的多项式朴素贝叶斯分类算法
from sklearn.naive_bayes import MultinomialNB
# 载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
# 训练模型
clf = MultinomialNB().fit(X, y)
# 使用模型进行分类预测
print("array: {}".format(clf.predict(X)))
# 使用默认的性能评估器评分
print("score: {}".format(clf.score(X, y)))
==============================================
array: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 2 1
1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
score: 0.9533333333333334
四、朴素贝叶斯分类算法的使用场景
算法使用案例
Gmail是一款非常知名的电子邮箱服务,其中面临的一大问题就是垃圾邮件问题,在最开始时,用户的Gmail邮箱一旦泄露,就会收到大量垃圾邮件,非常影响用户体验。现在Gmail已经开发出一项功能,能够自动识别和过滤垃圾邮件,所用的方法就是朴素贝叶斯算法,通过发件者、邮件内容出现的单词或词组等相关信息,判别用户收到的一封邮件是否属于垃圾邮件。业界普遍认为朴素贝叶斯算法用于垃圾邮件识别能够取得良好效果。
标签:选项,概率,特征,贝叶斯,算法,朴素 来源: https://blog.csdn.net/weixin_43651049/article/details/122753107