朴素贝叶斯(Naive Bayes

简单理解

我们可以先通过一个简单的例子来了解什么是朴素贝叶斯算法。
我们现在有如下数据:

颜色 水果
水果A
水果B
水果A
水果B
水果B
水果B

那么我现在手上有一个黄色的水果,我需要去预测它是哪种水果。
根据上面的样本数据,我们分别计算出颜色为黄色情况下,是水果A和水果B的概率:
P ( 水 果 A ∣ 黄 色 ) = 3 3 = 1 P(水果A|黄色) = \frac{3}{3} = 1 P(水果A∣黄色)=33​=1
P ( 水 果 B ∣ 黄 色 ) = 0 3 = 0 P(水果B|黄色) = \frac{0}{3} = 0 P(水果B∣黄色)=30​=0
结果就很明了了,我们判定这个黄色的水果为水果B。
其实这就是整个朴素贝叶斯的逻辑了,通俗点理解就是在某一条件下,属于哪个分类的概率大就预测为哪一类。我相信很多人在日常生活中也在用这种方式去做判断,只是不知道这种方式叫朴素贝叶斯而已。

为何朴素(Why Naive

我们上述例子只有一个特征条件,当我们特征多的时候又会出现一个问题。
我们接着上面的例子,数据还是上面的数据,只是多了一个特征条件形状

颜色 形状 水果
正方形 水果A
三角形 水果B
正方形 水果A
三角形 水果B
三角形 水果B
正方形 水果B

我们现在有一个[红色,三角形]的水果,需要去预测它是水果A还是水果B。
对,我们的样本数据中并没有红色&三角形的水果,所以我们现在是没办法直接算出红色&三角形条件下是水果A和水果B的概率的。
别慌,办法还是有的,首先我们有一个贝叶斯公式:
P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) P(B|A) = \frac{P(A|B)*P(B)} {P(A)} P(B∣A)=P(A)P(A∣B)∗P(B)
然后我们知道颜色和形状这两个特征是互不相关的,是相互独立的,那么我们又会有一个公式
P ( x 1 ∩ x 2 ) = P ( x 1 ) ∗ P ( x 2 ) P(x_1\cap x_2) = P(x_1)*P(x_2) P(x1​∩x2​)=P(x1​)∗P(x2​)
那么以上两个公式一组合是不是就有:
P ( c a t e g o r y ∣ x 1 ∩ x 2 ) = P ( x 1 ∣ c a t e g o r y ) ∗ P ( x 1 ∣ c a t e g o r y ) ∗ P ( c a t e g o r y ) P ( x 1 ) ∗ P ( x 2 ) P(category|x_1\cap x_2) = \frac{P(x_1|category)*P(x_1|category)*P(category)} { P(x_1)*P(x_2)} P(category∣x1​∩x2​)=P(x1​)∗P(x2​)P(x1​∣category)∗P(x1​∣category)∗P(category)
有了这个公式之后,我们上面的问题就可以解决了:
P ( 水 果 A ∣ 红 色 ∩ 三 角 形 ) = P ( 红 色 ∣ 水 果 A ) ∗ P ( 三 角 形 ∣ 水 果 A ) ∗ P ( 水 果 A ) P ( 红 色 ) ∗ P ( 三 角 形 ) = 2 2 ∗ 0 2 ∗ 2 6 3 6 ∗ 3 6 = 0 P(水果A|红色\cap 三角形) = \frac{P(红色|水果A)*P(三角形|水果A)*P(水果A)} { P(红色)*P(三角形)}=\frac{\frac{2}{2}*\frac{0}{2}*\frac{2}{6}}{\frac{3}{6}*\frac{3}{6}}=0 P(水果A∣红色∩三角形)=P(红色)∗P(三角形)P(红色∣水果A)∗P(三角形∣水果A)∗P(水果A)​=63​∗6322​∗20​∗62​=0
P ( 水 果 B ∣ 红 色 ∩ 三 角 形 ) = P ( 红 色 ∣ 水 果 B ) ∗ P ( 三 角 形 ∣ 水 果 B ) ∗ P ( 水 果 B ) P ( 红 色 ) ∗ P ( 三 角 形 ) = 1 4 ∗ 3 4 ∗ 4 6 3 6 ∗ 3 6 = 1 32 P(水果B|红色\cap 三角形) = \frac{P(红色|水果B)*P(三角形|水果B)*P(水果B)} { P(红色)*P(三角形)}=\frac{\frac{1}{4}*\frac{3}{4}*\frac{4}{6}}{\frac{3}{6}*\frac{3}{6}}=\frac{1}{32} P(水果B∣红色∩三角形)=P(红色)∗P(三角形)P(红色∣水果B)∗P(三角形∣水果B)∗P(水果B)​=63​∗6341​∗43​∗64​=321
所以我们预测[红色,三角形]的水果为水果B。
对于朴素贝叶斯算法,成立的条件就是假设各个特征条件是相互独立的,这样一个简单的假设可以让算法拥有更强的泛化能力,这也是朴素贝叶斯算法的朴素所在


平滑处理

现在又出现了新的问题,还是上面的数据:

颜色 形状 水果
正方形 水果A
三角形 水果B
正方形 水果A
三角形 水果B
三角形 水果B
正方形 水果B

我们现在手上拿到一个[黄色,圆形]的水果,那么这个水果又属于哪一类呢?
我们发现,我们的样本数据中根本就没有圆形的水果,按照上述公式计算的话,水果A和水果B的概率都是0了,真是个奇怪的水果。
所以一般在用朴素贝叶斯算法的时候会有一个平滑处理的步骤。对于未出现过的特征,我们会给每个特征值加上一个固定的值 α \alpha α,当 α \alpha α等于1的时候我们称之为拉普拉斯平滑。
计算如下,因为分母都是一样的,我们就用 ω \omega ω来代替:
P ( 水 果 A ∣ 黄 色 ∩ 圆 形 ) = P ( 黄 色 ∣ 水 果 A ) ∗ P ( 圆 形 ∣ 水 果 A ) ∗ P ( 水 果 A ) P ( 黄 色 ) ∗ P ( 圆 形 ) = 0 2 ∗ 0 + 1 2 + 3 ∗ 2 6 ω = 0 P(水果A|黄色\cap 圆形) = \frac{P(黄色|水果A)*P(圆形|水果A)*P(水果A)} { P(黄色)*P(圆形)}=\frac{\frac{0}{2}*\frac{0+1}{2+3}*\frac{2}{6}}{\omega}=0 P(水果A∣黄色∩圆形)=P(黄色)∗P(圆形)P(黄色∣水果A)∗P(圆形∣水果A)∗P(水果A)​=ω20​∗2+30+1​∗62​=0
P ( 水 果 B ∣ 黄 色 ∩ 圆 形 ) = P ( 黄 色 ∣ 水 果 B ) ∗ P ( 黄 色 ∣ 水 果 B ) ∗ P ( 水 果 B ) P ( 黄 色 ) ∗ P ( 圆 形 ) = 3 4 ∗ 0 + 1 4 + 3 ∗ 3 6 ω = 3 56 ∗ 1 ω P(水果B|黄色\cap 圆形) = \frac{P(黄色|水果B)*P(黄色|水果B)*P(水果B)} { P(黄色)*P(圆形)}=\frac{\frac{3}{4}*\frac{0+1}{4+3}*\frac{3}{6}}{\omega}=\frac{3}{56}*\frac{1}{\omega} P(水果B∣黄色∩圆形)=P(黄色)∗P(圆形)P(黄色∣水果B)∗P(黄色∣水果B)∗P(水果B)​=ω43​∗4+30+1​∗63​=563​∗ω1
所以这个[黄色,圆形]的水果我们判定为水果B。


文本分类

上面一直用奇怪的水果举例说明,但其实朴素贝叶斯很大的一个应用是在文本分类,朴素贝叶斯在小规模文本分类上的往往表现更优秀。
接下来我们也通过一个例子来讲述朴素贝叶斯是如何应用在文本分类领域的。

我们有如下文本,分类为True的表示文本内容与运动相关:

文本 分类
詹姆斯突破很厉害,而且能扣篮 True
科比罚球很准,也能突破 True
詹姆斯唱歌不好听 False

我们现在有詹姆斯罚球一般,需要去预测是否与运动相关。


Tips

对于文本分类,我们首先需要做的就是切词
中文切词我们可以使用jieba,而且可以加入自己的字典,很方便,如果是英文的,直接通过空格切割就好。
另外对于朴素贝叶斯算法,算法本身优化空间很有限,所以如果我们想要分类效果更好的话,就需要在文本处理上下功夫,以下是我在实际使用中觉得比较有效果的方法:

  • 筛选词性
    对于文本分类,一般来说,连词/量词等词语对结果是没有影响的,加入这些词语往往还会影响分类效果,所以在切词的时候,我们可以去掉这部分词语,jieba中也封装了此方法,另外我们也可以通过自定义词典加入一些词语并设置好词性,避免一些特别的词语因为词性的问题被筛选掉。
  • 增加权重
    一段文本中,不同的词语对与分类结果的影响肯定是有区别的。所以我们可以按照一定的逻辑给不同的词语赋予不同的权重。简单点处理的话,我们可以通过词频来看,出现的越多,那权重越高,但很多时候,一个词语出现的多并不能代表这个词的重要性,譬如‘的’,‘了’这类词语,出现的肯定多,但对结果是毫无影响的,所以除了词频我们往往会选用TF-IDF这类算法,TF-IDF计算逻辑就是如果一个词语在文本出现的多,但是在整个文本集合里面出现的少的话,权重就会高,在长文本,像文章这种文本使用TF-IDF效果会比较好。
  • 词语组合
    很多时候,我们分类的结果并不是由某个词语来决定,而是由某些词语组合来决定的。譬如我们想知道一篇文章是不是描述勒布朗詹姆斯的,如果文章中出现了[湖人队,詹姆斯]的话那我就预测它是描述勒布朗詹姆斯的,但如果文章中只提到了詹姆斯,那么有可能这篇文章说的是詹姆斯卡梅隆。所以我们可以尝试词语组合的形式来训练模型,特别是对于那些文本分类结果是由多个词才能决定的问题,强力推荐这么做。当我们切完词后得到[A,B,C],我们实际传给朴素贝叶斯[AB,BC,AC,ABC]进行训练。

以上都是比较有效果的优化方法,我们可以根据实际情况选择。


回到之前的例子,我们通过切词筛选词性之后得到如下:

文本 分类
詹姆斯;突破; 扣篮 True
科比;罚球;突破 True
詹姆斯;唱歌 False

文本肯定是不能进行计算的,我们需要将文本转化为词向量
我们整个文本集合中包含[詹姆斯,突破,扣篮,科比,罚球,唱歌]6个词语,所以最后是一个6维向量,向量的每个位置对应一个词语,我们选用词频来填充值,结果如下:
[ 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 ] → [ T r u e T r u e F a l s e ] \left[ \begin{matrix} 1 & 1 & 1 &0 & 0& 0 \\ 0 & 1 & 0 &1 & 1& 0 \\ 1 & 0 & 0 &0 & 0& 1 \\ \end{matrix} \right] \rightarrow \left[ \begin{matrix} True\\ True\\ False\\ \end{matrix} \right] 101110100010010001​→TrueTrueFalse
接下来就是丢给朴素贝叶斯进行训练就好了。

P ( T r u e ∣ 詹 姆 斯 ∩ 罚 球 ) = P ( 詹 姆 斯 ∣ T r u e ) ∗ P ( 罚 球 ∣ T r u e ) ∗ P ( T r u e ) P ( 詹 姆 斯 ) ∗ P ( 罚 球 ) = 1 6 ∗ 1 6 ∗ 6 8 ω = 1 48 ω P(True|詹姆斯\cap 罚球) = \frac{P(詹姆斯|True)*P(罚球|True)*P(True)} { P(詹姆斯)*P(罚球)}=\frac{\frac{1}{6}*\frac{1}{6}*\frac{6}{8}}{\omega}=\frac{1}{48\omega} P(True∣詹姆斯∩罚球)=P(詹姆斯)∗P(罚球)P(詹姆斯∣True)∗P(罚球∣True)∗P(True)​=ω61​∗61​∗86​=48ω1
P ( F a l s e ∣ 詹 姆 斯 ∩ 罚 球 ) = P ( 詹 姆 斯 ∣ F a l s e ) ∗ P ( 罚 球 ∣ F a l s e ) ∗ P ( F a l s e ) P ( 詹 姆 斯 ) ∗ P ( 罚 球 ) = 1 2 ∗ 0 2 ∗ 2 8 ω = 0 P(False|詹姆斯\cap 罚球) = \frac{P(詹姆斯|False)*P(罚球|False)*P(False)} { P(詹姆斯)*P(罚球)}=\frac{\frac{1}{2}*\frac{0}{2}*\frac{2}{8}}{\omega}=0 P(False∣詹姆斯∩罚球)=P(詹姆斯)∗P(罚球)P(詹姆斯∣False)∗P(罚球∣False)∗P(False)​=ω21​∗20​∗82​=0
所以最后判定詹姆斯罚球一般True


高斯&伯努利

我们上面基于多项式模型来说的,其实对于朴素贝叶斯算法,还有两种常用模型,分别是高斯模型和伯努利模型:

  • 伯努利
    对于伯努利模型,所有特征的结果只有True和False两类,我们上面文本分类的例子其实也可以看成是伯努利模型,因为虽然我们本意是统计词频,但是因为都只有出现1次的记录,我们也可以把1当作是出现过的意思。
    计算方式上也有区别,对于多项式模型,如果一个词没出现,那么就不会参与概率的计算,但在伯努利模型中,没有出现也会当作是一个特征。
    计算方式如下:
    P ( T r u e ∣ 詹 姆 斯 ∩ 罚 球 ) = P ( 詹 姆 斯 ∣ T r u e ) ∗ P ( 罚 球 ∣ T r u e ) ∗ ( 1 − P ( 突 破 ∣ T r u e ) ) ∗ ( 1 − P ( 扣 篮 ∣ T r u e ) ) ∗ ( 1 − P ( 科 比 ∣ T r u e ) ) ∗ ( 1 − P ( 唱 歌 ∣ T r u e ) ) ∗ P ( T r u e ) ω P(True|詹姆斯\cap 罚球) = \frac{P(詹姆斯|True)*P(罚球|True)*(1-P(突破|True))*(1-P(扣篮|True))*(1-P(科比|True))*(1-P(唱歌|True))*P(True)} {\omega} P(True∣詹姆斯∩罚球)=ωP(詹姆斯∣True)∗P(罚球∣True)∗(1−P(突破∣True))∗(1−P(扣篮∣True))∗(1−P(科比∣True))∗(1−P(唱歌∣True))∗P(True)
  • 高斯模型
    高斯模型是解决特征为连续值的分类问题的,通过正态分布(又名高斯分布)的概率密度函数计算概率:
    f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=2π ​σ1​e2(x−μ)2
    σ \sigma σ和 μ \mu μ分别代表数据集的标准差和平均数。