朴素贝叶斯和垃圾邮件的故事

1.问题描述

假设我们已经有了一批正常邮件和一批垃圾邮件,邮件里面的内容我们是可以知道的。然后我们今天收到了一封新邮件,现在要判断这封新邮件到底是正常邮件还是垃圾邮件??用一个图表示就是

朴素贝叶斯和垃圾邮件的故事
这是个经典的二分类问题
朴素贝叶斯是如何解决这个问题的呢??, 他的核心思想是:统计,也就是统计正常邮件和垃圾邮件中的各个单词的个数,对于敏感词汇如 “链接”,那它肯定在垃圾邮件中出现的次数比较多,即
朴素贝叶斯和垃圾邮件的故事

2.一个小栗子

我们假设一批正常邮件(24封)和一批垃圾邮件(12封)中,每封邮件只包含10个单词,“购买” 这个词可能出现在正常邮件中,也可能出现在垃圾邮件中,而且每封邮件出现“购买”词汇的次数也可能不一样
朴素贝叶斯和垃圾邮件的故事

  • 对于第一个问题
    正常邮件单词总个数: 每封正常邮件单词总个数 x 正常邮件个数 = 10 x 24 = 240
    垃圾邮件单词总个数: 每封垃圾邮件单词总个数 x 垃圾邮件个数 = 10 x 12 = 120
    *购买” 在正常邮件中出现了 3 次, 在垃圾邮件中出现了 7 次
    所以: P(“购买”| 正常) = 3/240

  • 对于第二个问题
    P(“购买”| 垃圾) = 7/120

  • 很显然:垃圾邮件中含有“购买”词的概率 大于 正常邮件中含有“购买”词的概率

类似的计算 “物品” 的概率
朴素贝叶斯和垃圾邮件的故事
P("物品“| 正常)= 4/240
P("物品 | 正常) = 4/120
类似的计算”不是“出现的概率
朴素贝叶斯和垃圾邮件的故事
P("不是“| 正常)= 4/240
P("不是 | 垃圾) = 3/120
类似的计算”广告“出现的概率
朴素贝叶斯和垃圾邮件的故事
P("广告“| 正常)= 5/240
P("广告” | 垃圾) = 4/120

注意:在构建朴素贝叶斯模型时,我们要计算词库中每个单词 的条件概率,而不只是上述“敏感词汇”的条件概率

3.朴素贝叶斯的先验概率

所谓先验概率,就是能凭自己的经验推测出的概率,也就是已知的概率。比如我们能知道正常邮件大概占了多少,垃圾邮件大概占了多少
朴素贝叶斯和垃圾邮件的故事
总共36封邮件,正常邮件24封,垃圾邮件12封,所以我们推测
P(正常) = 2/3
P(垃圾) = 1/3

4.贝叶斯定理和条件独立性假设

贝叶斯定理:
朴素贝叶斯和垃圾邮件的故事
条件独立性假设:假设 x, y 是条件独立与 z 的
朴素贝叶斯和垃圾邮件的故事

5. 如何做预测

比较 P(正常| 新邮件内容)和 P(垃圾| 新邮件内容) 的大小
朴素贝叶斯和垃圾邮件的故事
先验概率已知了, p(正常) = 2/3, P(垃圾) = 1/3
这里假设新邮件内容只有 8 个词汇:购买 物品, 不是 广告
朴素贝叶斯和垃圾邮件的故事
我们把公式中的内容展开,再用条件独立性假设,就可以得到
朴素贝叶斯和垃圾邮件的故事
图中所有概率在上述已经计算过了,大家可以自己带进去计算。如果 P(正常| 新邮件内容)> P(垃圾| 新邮件内容), 则预测为正常邮件,否则为垃圾邮件。

6.最后,再举一个详细的栗子

如图:有 3 个垃圾邮件,3个正常邮件,一个新邮件(内容:最新, 产品,优惠(实惠写错了,应该是优惠),点击, 链接) ,内容是分词之后的
朴素贝叶斯和垃圾邮件的故事

整个预测过程分为两步
  • 朴素贝叶斯模型的训练
  • 预测过程

训练过程

就是计算词库中每个单词的条件概率
step1 : 先验:p(垃圾) = 3/6 = 1/2 , p(正常) = 3/6 = 1/2
step2 :构建词库V
V = [点击, 获得, 更多,信息,购买, 最新,产品,优惠,链接,明天,一起,开会,详见,邮件,竞品 ]
V 的大小是 15
step3::计算词库中每个单词在正常邮件和垃圾邮件的概率

注意: 这里为了防止有的单词没出现而导致分子为0, 整个概率计算为 0 的情况,采用了 Add -1 Smoothing。有的类似语言模型概率计算的平滑方法,参考语言模型概率平滑方法
所以我们在分子上额外 加1 ,分母额外加 V 的大小朴素贝叶斯和垃圾邮件的故事
垃圾邮件总共出现了 13 个词汇,点击出现了 2 次
正常邮件总共有 10 个词汇,点击出现 0 次
P(点击| 垃圾) = (2+1) / (13 + 15) = 3 / 28
P(点击| 正常)= (0 +1)/ (10 + 15) = 1/ 25

P(获得 | 垃圾) = (2+1) / (13 + 15) = 3 / 28
P(获得 | 正常) = (0 +1)/ (10 + 15) = 1/ 25

…这里就不全算出来了,只计算出现在新邮件中的单词
P(最新|垃圾) = (1+1)/ (13+15) = 2/28
P(最新|正常) = (1+1)/ (10+15) = 2/25

P(产品 | 垃圾) = (1+1)/ (13+15) = 2/28
P(产品 | 正常) = (0+1)/ (10+15) = 1/25

P(优惠| 垃圾) = (2+1)/ (13+15) = 3/ 28
P(优惠| 正常)= (0+1)/ (10+15) = 1/25

P(链接|垃圾) = (1+1)/ (13+15) = 2/ 28
P(链接| 正常)= (0+1)/ (10+15) = 1/25

计算完之后,就可以预测啦

预测过程

只需比较 P(垃圾| 新邮件内容) 和 P(正常 | 新邮件内容)的大小

P(垃圾| 新邮件内容)= P(垃圾)· P(新邮件内容 | 垃圾) / P(新邮件内容)
∝ P(垃圾) · P(新邮件内容 | 垃圾)
∝P(垃圾)·P(最新,产品,优惠,点击,链接 | 垃圾)
∝P(垃圾)· P(最新| 垃圾) · P(产品|垃圾)·P(优惠|垃圾)·P(点击|垃圾)·P(链接|垃圾)
= 1/2 · 2/28 · 2/28 · 3/28 ·3/18 ·2/28 = ?
具体计算过程就留给大家吧! 对于**P(正常 | 新邮件内容)**也是一样的计算方法
计算之后可以得到 P(垃圾| 新邮件内容)> P(正常 | 新邮件内容)
所以 这个新邮件是 垃圾邮件
最后提一点: 可以看到我们计算的是 概率的连乘,如果连乘的项很多时,那么最后的结果特别特别小,导致计算机溢出,所以我们通常会加 log,因为log是递增的,所以它 不会影响我们的比较关系,并且它能把乘法变成加法,不会让计算机溢出。
log(p1 * p2 * p3) = log p1 + log p2 + log p3

相信大家看了例子,再去看朴素贝叶斯原理和公式,就会有清晰的认识了,推荐一篇讲朴素贝叶斯公式的博文分类算法之朴素贝叶斯