引言
文章根据udacity自然语言处理进行整理,提供给初学者进行参考。主要围绕朴素贝叶斯算法的基本原理和使用朴素贝叶斯实现邮件分类。
相关参考学习视频:
udacity--自然语言处理(PS:国外导师视频课程,中文字幕。课程简洁易懂、生动形象。具有项目实战、导师项目审核特色。比较推荐入门。点击此处可获得课程优惠券)
1. 朴素贝叶斯算法
1.1. 概述
朴素贝叶斯是一种概率算法,基于条件概率这一概念。该算法有很多优势。比如:易于实现、训练速度快等。
1.2 贝叶斯定理
可通过一个简单的例子来了解贝叶斯定理。
假设办公室有两个人,分别是 Alex 和 Brenda ,他们在办公室的时间一样长。基于此如果要猜测其中一人是谁? 在这种条件下,猜中是 Alex 的概率是 50% ,猜中 Brenda 的概率是 50 %。
在此条件下,需要更多的信息来确认身份。我们注意到 Alex 和 Brenda 两人中其中一人穿红色衣服。并因此了解到 Alex 一周有两天穿红色衣服,Brenda 一周有三天会穿红色衣服(这里的一周是指周一到周五)。根据穿红色毛衣这一条件,可以有 40 % 概率确定是 Alex 。 60 % 概率确定是Brenda。
这一技巧称为贝叶斯技巧,在没有获得红色毛衣这一信息之前,只能是50/50 的猜测,这称之为先验概率。在知道穿红色衣服之一信息之后,猜测为 40/60 ,这称作为后验概率。
贝叶斯定理的作用是根据已知的信息推出未知的信息。但在实际应用中会更复杂。
再根据上面的案例,假设工作中有一个人快速走过,但不知道是谁,可能是Alex ,也可能是Brenda。得知 Alex 和 Brenda 的工作时间, Alex 一周有 3 天在办公室,而 Brenda 一周只有 1 天在办公室。在此条件下 Alex 的先验概率为 0.75 ,即 3 / (3 + 1), Brenda 的是 0.25, 即 1 / (3 + 1) 。
再利用红毛衣这一事件。Alex 一周有2天穿红色毛衣,Brenda 一周穿 3 天。则在红毛衣事件上,Alex 的先验概率为 0.4 , 即 2 / (3 + 2)。 Brenda 的先验概率为 0.6 ,即 3 / (3 + 2)。
根据上面两事件,如此可得到如下四种场景。可以看到四种场景概率为 1.
场景1: 看到穿红衣服是 Alex 的概率为 0.75 * 0.4 。
场景2: 看到没穿红衣服是 Alex 的概率为 0.75 * 0.6
场景3: 看到穿红衣服的是 Brenda 的概率为 0.25 * 0.6
场景4: 看到没穿红衣服是 Brenda 的概率为 0.25 * 0.4
如果只看穿红衣服的场景。即只考虑看到穿红衣服务可能是 Alex 的概率 和 穿红衣服可能是 Brenda 的概率。如此只需要考虑 0.75 * 0.4 和 0.25 * 0.6 两种概率。
但是这两种概率相加不等于 1 。所以需要进行归一化处理。即用某个概率除以 两概率只和。如 (0.75 * 0.4 ) / (0.75 * 0.4 + 0.25 * 0.6 ) 。
如下图:P(A|R) 即表示看到穿红衣服是Alex的概率为 0.67 。 P(B|R) 穿红衣服是Brenda 的概率为 0.33 。
现在看贝叶斯定理的概念。
有一个事件 Event,这个事件的可能是 A ,可能是 B ,事件的概率用 P(A)、P(B) 表示。
在事件 A 和 B 的基础上,可能有第三个事件,事件可能发生,也可能不发生。用 R 表示发生 和 R_c 表示没发生,其概率用P(R|A)、P(R_c|A)、P(B|R)、P(B|R_c) 表示。
现在就有了如下的四种场景:
假设事件R发生,需要计算 R 事件发生的概率。即计算:P(R ∩ A) 和 P(R ∩ B)
根据条件概率 。 P(R ∩ A) = P(A) * P(R|A) 、 P(R ∩ B) = P(B) * P(R|B) 。
同时需要进行归一化处理,使概率相加为 1 。推断在R 发生之后是A 事件的概率 P(A|R)、以及R发生后,推断是B事件的概率 P(B|R)。公式如下:
1.3 使用贝叶斯分类邮件
将贝叶斯定理应用到机器学习中。来看一个简单的案例,垃圾邮件分类。
假设有这样的一些邮件,垃圾邮件称为 spam,非垃圾邮件称为 Ham。垃圾邮件内容可能是这样的 “Win money now ! make cash easy ” 。 正常邮件则可能是这样 “How are you ” 等等。
现在的任务是假设现在有一封邮件。需要判断该邮件是否是 spam,即垃圾邮件。对此可能需要对内容进行评估,逐个词语进行检查。当然在这里不考虑单词顺序。对于贝叶斯算法而言,不用考虑顺序。需要提取一些单词进行分析。比如 easy 、money 在垃圾邮件中出现的概率,在正常邮件中的概率。
如下图有8封邮件,其中三封“Win money now”、“Make cash easy ”、 “Cheap money, reply”为垃圾邮件 spam 。其中五封“How are you ”、“There you are ” 等 为非垃圾邮件Ham。
在 spam 邮件中,出现 easy 的概率为 1/3、即 P('easy'|spam) = 1/3;出现 money 的概率为 2/3、即 P('money' | spam) = 2/3 。
在 Ham 邮件中, 出现 easy 的概率为 1/5、 即 P('easy'| Ham) = 1/5;出现money 的概率为 1/5、即 P('money'|Ham) = 1/5。
贝叶斯定理是根据已知信息,推断出未知信息。如当出现 money 这个词时候,是垃圾邮件的概率 P(spam|‘money’) 。来看具体的推断过程。
利用上图的 8 封邮件信息。其中已知 3 封为垃圾邮件spam、5 封为非垃圾邮件Ham。如此先验概率 P(spam) = 3/8 、P(Ham) = 5/8。
在垃圾邮件 spam 中,出现 ‘easy’ 单词的概率为 1/3 ,即 P('easy'|spam) = 1/3
在非垃圾邮件 Ham 中,出现 ‘easy’ 单词的概率为 1/5, 即 P('easy'|ham) = 1/5
根据条件概率,计算垃圾邮件中包含 ‘easy’ 单词的概率,即 P(spam) * P(‘easy’|spam) = 3/8 * 1/3 = 1/8 = 0.125 。非垃圾邮件中包含 ‘easy’ 单词的概率,即 P(Ham) * P(‘easy’| Ham) = 5/8 * 1/5 = 1/8 = 0.125
使用归一化之后。判断包含 easy 单词的邮件是垃圾邮件的概率为 50 % ,即 P(spam | ‘easy’) = 0.125 / (0.125 + 0.125) = 0.5 。同理判断 包含 easy 单词的邮件是非垃圾邮件的概率为 P(Ham|'easy') = 0.5
判断两个 ‘easy’ 的是垃圾和非垃圾邮件的概率均为 50% 。再来看 ‘money’ 单词概率。同理如下:
在垃圾邮件 spam 中,出现 ‘money’ 单词的概率为 2/3 ,即 P('money'|spam) = 2/3
在非垃圾邮件 Ham 中,出现 ‘money’ 单词的概率为 1/5, 即 P('money'|ham) = 1/5
同样根据条件概率。判断包含 money 单词是垃圾邮件的概率为 1/4, 即 P(spam) * P('money'|spam) = 3/8 * 2/3 = 1/4。 Ham 也是如此 ,如下图
采用归一化之后计算之后(计算方法同上)。对于出现 ‘money’ 单词是垃圾邮件的概率为 66.7% ,出现 ‘money’ 是非垃圾邮件的概率为 33.3%。
1.4 朴素贝叶斯算法
在了解贝叶斯定理之后。来看看朴素贝叶斯与贝叶斯有什么不同之处。所谓的“朴素” 其实就是一种天真、不成立的假设。但在实践中效果很好,算法速度很快。
两个事件同时发生的概率。可以写成 P(A ∩ B ) = P(A) P(B) 。 只有当两个事件独立时才能发生,如果不相互独立则不成立。在朴素贝叶斯定理中,假设概率是独立的。这种假设是不成立的假设。
这是 A ∩ B 概率的两种写法,如下图:
现在采用的技巧是删掉 P(B) ,而变成 P(A|B) 与 P(B|A)P(A) 成比例的形式, 如下图:
在上面电子邮件的案例中,P(A|B) 可写成 P(spam | 'easy', 'money') 。 如下图:
其中 P(spam | 'easy', 'money') 表示出现 easy 、money 单词时该邮件是垃圾邮件的概率。
P('easy','money' | spam) 表示垃圾邮件中有 easy、money 的概率,如此 P('easy','money' | spam) 可写成 P('easy'|spam) * P('money'|spam) . 这是一种天真的假设,是朴素贝叶斯算法的核心。
现在执行计算,在上面的案例中。P('easy'|spam) = 1/3 、P('money'|spam) = 2/3 、P(spam) = 3/8 。
如此可计算出 P(spam | 'easy', 'money') = 1/12 、P(ham | 'easy', 'money') = 1/40 。可写成:
现在需要进行归一化。确保两个新的概率值相加为 1 。归一化方法就是用其中一个除以 两个相加之和。 如下图
P(spam | 'easy', 'money') = 10/13
同理 P(ham | 'easy', 'money') = 3/13。
结论:即出现 easy、money 单词时候,是垃圾邮件的概率为 10/13. 非垃圾邮件的概率为 3/13 。
上述案例是在理想条件下,实际中可能需要多个单词进行计算,然后归一化。这就是朴素贝叶斯算法原理。
2. 构建垃圾邮件分类器
2.1 概述
垃圾邮件检测是现今网络中最重要的机器学习应用案例。几乎所有的大型邮箱服务提供商都内置了垃圾邮件检测系统,并自动将此类邮件归类为“垃圾邮件”。使用朴素贝叶斯算法来创建一个模型,并根据我们对模型展开的训练将数据集文本分类为是否为垃圾文本。你需要直观地了解哪些文本信息属于垃圾信息。
2.2 垃圾邮件是什么?
通常包含字眼“免费('free')”、“赢取('win')”、“获奖者('winner')”、“现金('cash')”、“奖品('prize)”等,因为这些字眼专门用于吸引你的注意,诱惑你打开邮件。
识别垃圾邮件是二元分类问题,因为邮件要么“是垃圾邮件('Spam')”,要么“不是垃圾邮件('Not Spam')”,不会再有第三种情况。此外,这是监督学习问题,因为我们知道要预测什么。我们将向模型提供带有标签的数据集,使其从中学习规律并作出未来预测。
2.3 实现
项目源码在此下载。下载之后使用 jupyter notebook 打开查看。