引言
朴素贝叶斯是一系列算法,这些算法基于通过很强的(朴素的)假设应用贝叶斯定理,其中每一个特征都与其它特征无关,以便预测一个给定样本的类别。它们是概率分类器,因此会使用贝叶斯定理计算每个类别的概率,然后输出概率最高的类别。朴素贝叶斯分类器已被成功应用于很多领域,尤其是自然语言处理(NLP)领域。
但是,为什么要使用朴素分类器?
确实还存在其它处理 NLP 问题的方法,比如支持向量机(SVM)和神经网络。但是,朴素贝叶斯分类器设计简单,使其在这类分类器上很有吸引力。此外,研究已经表明它们在很多 NLP 应用都是快速、可靠且准确的。
所以,为什么不通过一个 NLP 问题来让我们理解朴素贝叶斯分类器呢?
Bruno Stecanella 在他的博客文章《朴素贝叶斯分类器的实用解释(A practical explanation of a Naive Bayes classifier)》中通过一个示例,带我们了解了构建一个用于求解一个典型 NLP 问题(文本分类)的多项式朴素贝叶斯分类器的全过程。
参阅:https://monkeylearn.com/blog/practical-explanation-naive-bayes-classifier/
一个实际示例
在这个示例中,给定一个句子“A very close game”,一个包含 5 个句子的训练集(如下所示)以及它们对应的类别(Sports 或 Not Sports)。目标是构建一个朴素贝叶斯分类器,使其能给出句子“A very close game”所属的类别。
作者 Bruno 建议说我们可以尝试应用朴素贝叶斯分类器,因此,策略目标就变成了计算“A very close game”属于 Sports 以及属于 Not Sports 的概率。哪个类别的概率更高,那个即为答案。
从数学表示,即我们要计算 P(Sports | A very close game),即给定句子“A very close game”属于 Sports 类别的概率。
Bruno在文中包含了一步步构建一个实现这一目标的朴素贝叶斯分类器的指南,即计算 P(Sports | A very close game)。
第 1 步:特征工程
第 1 步是特征工程,即提取文本的特征。我们需要多个特征作为分类器的输入。所以词频(word frequencies)是一个直观的选择,即计算每个词在文档中出现的次数。
然后,我们需要将我们希望计算的概率转换成可用词频计算的形式。这里,我们采用了概率和贝叶斯定理的性质来做这种转换。
在处理条件概率方面,贝叶斯定理非常有用,因为它为我们提供了一种逆转条件概率的方法:
针对我们的具体案例,我们希望计算的概率就可以这样计算:
因为我们只想知道哪个类别(Sports 或 Not Sports)有更高的概率,所以可以抛弃分母 P(a very close game),只比较P(a very close game | Sports) X P(Sports)与P(a very close game | Not Sports) X P(Not Sports)。
但有个问题:为了计算 P(a very close game | Sports),我们必须统计“A very close game”在 Sports 类别中出现的次数。但这根本没在训练集中出现过,因此这个概率为 0,也就使得 P(a very close game | Sports) 为 0 了。我们应该怎样解决这个问题呢?
第 2 步:朴素
在非朴素的贝叶斯方法中,我们是以整体形式看待句子,因此只要训练集中没有该句子,那么该句子的概率就为 0,从而难以进一步计算。而对于朴素贝叶斯,我们假设每个词都与其它词无关。现在,我们要看的是句子中的每个词,而不是整个句子。
基于此,我们可以重写我们所要计算的概率:
类似地,可得到:P(a very close game | Not Sports) = P(a | Not Sports) x P(very | Not Sports) x P(close | Not Sports) x P(game | Not Sports)
第 3 步:计算概率
这是最后一步,我们将得到答案:计算概率并比较哪个概率更高:P(a very close game | Sports) 或 P(a very close game | Not Sports)
其中,close 一词不存在于 Sports 类别中,所以 P(close | Sports) = 0,因此 P(a very close game | Sports)=0。当基于频率的概率为 0 时会有很大的问题,因为这会清除掉其它概率中的所有信息,我们需要为此找到一个解决方案。
Laplace 平滑是解决方案之一,这是一项用于平滑化类别数据的技术。即在每个概率估计中都整合一个小样本校正(或称伪计数(pseudo-count))。这样,就不会有 0 概率了。这是一种正则化朴素贝叶斯的方法,而且当伪计数为 0 时,这被称为 Laplace 平滑。而在一般情况下,这被称为 Lidstone 平滑。
在统计学中,加法平滑(也被称为 Laplace 平滑或 Lidstone 平滑,不要与 Laplacian 平滑混淆)是一项用于平滑化类别数据的技术。
给定来自一个多项式分布的一个观察 x = (x1, …, xd),其具有 N 个试验和参数向量 θ = (θ1, …, θd),则该数据平滑后的版本会给出估计量:
其中伪计数 α>0,这是平滑参数(α=0 表示没有平滑)。加法平滑是一类收缩估计方法,因为所得到的估计将处于经验估计 xi/N 和均匀概率 1/d 之间。使用拉普拉斯继承法,某些研究者认为 α 应该为 1(这种情况下使用的术语是“加一平滑(add-one smoothing)”),尽管实践中通常会选择一个更小的值。
来自维基百科:https://en.wikipedia.org/wiki/Additive_smoothing
所以,我们这里如何应用 Laplace 平滑?
我们也许可以考虑这样设置平滑参数:α=1 且 d=14(参见上面的等式),我们给每个概率都加 1,使得 P(close | sports) 等概率永远不会为 0。而 14 则是两个类别中可能的词的数量,这使得除数总是大于 1。
我们现在可以重新计算概率了,这时候的概率不是零了:
P(close | Sports ) =(0+1)/(11+14)= 1/25
根据这种方法,我们可以得到比较 P(a very close game | Sports) 和 P(a very close game | Not Sports) 必需的其它概率:
从下面的结果可以看到,P(a very close game | Sports) 概率更高,这说明这个句子属于 Sports 类别。
最后,下面给出了一些用于提升基础的朴素贝叶斯分类器的表现的先进技术:
- 移除停止词:有些常用词对分类而言没有实际用处,比如 a、able、either、else、ever 等等。所以在我们这个案例中,The election was over 会变成 election over,而 a very close game 则会变成 very close game。
- 词形还原:这是将同一个词的不同变形形式归类到一起。所以 election、elections、elected 等都会被归类到一起,作为同一个词进行计数。
- 使用 n-gram:除了像我们这里做的那样统计单词,我们也可以统计词序列,比如“clean match”和“close election”。
- 使用 TF-IDF:除了单纯地统计词频,我们还可以做一些更高级的事情,比如惩罚那些在大多数文本中都常出现的词。
3 简评
当在文本分类问题上应用多项式朴素贝叶斯时,在开始之前应该先考虑两个问题:
(1) 你要从文本中提取哪些特征?
在应用朴素贝叶斯分类器时,特征工程是一大关键步骤。在 Bruno 的博客文章中,他选择了词频作为文本特征。但是,要让你的分类器更高级,TF-IDF 会是一个理想选择。TF-IDF 不仅能计数一个词在给定文本(或文档)中出现的次数,而且还能反映该词对该文档的重要程度。
(2) 你是否在概率上执行了平滑?
基于频率的概率可能会为零,当在对这些概率进行乘法操作时,会导致其它非零概率所贡献的信息丢失。因此,为了应对这一问题,必须使用 Laplace 平滑等平滑方法。
这些问题处理好之后,你在应用朴素贝叶斯分类器时就更可能得到合理的结果。而且你会发现朴素贝叶斯分类器在文本分类等 NLP 任务上是一种既简单又强大的技术。