机器学习NLP:深入理解Naive Bayes!
Naive Bayes是最常用的机器学习(ML)算法之一,通常用于文本分类。它是机器学习(ML)最简单的分类算法之一。
这篇文章将为您提供Naive Bayes分类器实际工作原理的完整见解。
朴素贝叶斯究竟是如何运作的
朴素贝叶斯是一种概率分类算法,因为它使用概率来进行分类目的的预测。让我们深入了解朴素贝叶斯的训练和测试阶段,以获得它的算法见解!
训练朴素贝叶斯模型
比方说,有一个餐厅评论,“Very good food and service!!!”,你想预测这个给定的评论是否意味着积极或消极的观点。要做到这一点,我们首先需要在相关标记的训练数据集上训练一个模型(这实际上意味着确定每个类别的单词计数),然后这个模型本身将能够自动将这些评论分类为它所训练的特定观点之一。假设您获得了一个类似下面的训练数据集(一个评论及其相应的情绪):
标记训练数据集
备注 :朴素贝叶斯分类器是一种监督机器学习算法
那我们怎么开始呢?
步骤#1:数据预处理
作为预处理阶段的一部分,训练语料库/训练数据集中的所有单词都将转换为小写,除了标点符号之外的所有内容都将从训练示例中排除。
边注: 一个常见的错误,不是像预处理训练数据集那样预处理测试数据,而是直接将测试示例输入到训练模型中。因此,经过训练的模型在给定的测试示例上表现得很差,在这个测试示例上它应该表现得相当好!
预处理训练数据集
步骤#2:训练你的NaïveBayes模型
只需简单地制作两个bag of words(BoW),每个类别一个,每个将包含单词及其相应的计数。属于“正面”情绪/标签的所有单词都将归属于一个BoW,所有属于“负面”情绪的单词都将拥有自己的BoW。训练集中的每个句子都被分成单词(基于空格作为标记器/分隔符),这就是单词计数对的构造方式,如下所示:
两个类别的BoW
现在是预测部分 - 测试
考虑到现在您的模型被给予餐厅评论,“Very good food and service!!!”,它需要分类到它属于哪个特定类别。我们需要找到这个属于每个类别的评估的概率,然后我们会给它分配一个正的或负的标签(取决于这个测试例子能够为哪个特定的类别获得更多的概率)。
查找给定测试示例/评论的概率:
- 步骤#1 :测试实例的预处理
以与预处理训练样本相同的方式预处理测试示例,即将示例更改为小写并排除除标点/字母之外的所有内容。
- 步骤#2:预处理测试例的标记化
对测试示例进行标记,即将其拆分为单个单词。
快速备注 :您必须熟悉 机器学习中的术语“ 特征” 。这里,在Naive Bayes中, 训练数据集的每个类别的词汇表中 的每个单词构成分类特征。这意味着每个类的所有独特单词(即词汇,vocabulary/vocab)的计数基本上是该特定类的一组特征。为什么我们需要“数量”?因为我们需要分类词特征的数字表示,因为朴素贝叶斯模型/算法需要数字特征来找出概率分数!
- 步骤#3:使用概率预测标记化测试示例的标签!
寻找概率的数学形式:
Probability of a Given Test Example i of belonging
- i =测试例子= “Very good food and service!!!”
- i中的单词总数 = 5,因此j(表示要素编号)的值从1到5不等。就这么简单!
让我们将上面的场景映射到给定的测试示例,以使其更清晰!
让我们开始计算这些产品术语的值
- 步骤1:找到术语的值:c类的p
Simply the Fraction of Each Category/Class in the Training Set
p of class c for Positive & Negative categorie
- 步骤2:找到术语的值:product (c类测试词j的 p )
在我们开始推断特定类c中测试单词j的概率之前,让我们快速熟悉一些符号:
因为我们目前在测试集中只有一个例子(为了理解),所以i = 1。
说明 :在 测试时间/预测时间内,我们将测试示例的每个单词映射到训练阶段中找到的计数。因此,在本例中,我们要为这个给定的测试示例寻找总共5个单词的计数。
在c类中找出测试词“j”的概率
在开始计算乘积(c类测试词“j”的p)之前,我们显然首先需要确定c类测试词“j”的p。有两种方法可以按照下面的说明进行操作 -
- 让我们首先尝试使用方法1找到概率:
现在我们可以乘以单个词的概率(如上所示),以便找到术语的数值:
product(c类中测试词“j”的p)
零概率的常见陷阱!
现在,我们有两个条件,即( p of class c and product ( p of a test word “ j ” in class c ) )。因此,为了确定两个类别的p(i属于c类),我们可以将这两个项相乘。这在下面说明:
零概率的常见陷阱!
对于这两个类别,p(i属于c类)结果为零!但很明显,测试示例“Very good food and service!!!”属于正类!这是因为产品(c类测试词 “j”的p)对于两个类别都为零,而这又为零,因为给定测试示例中的几个单词(以橙色突出显示)从未出现过我们的训练数据集,因此它们的概率为零!显然他们已经造成了所有的破坏!
这是否意味着 ,只要在测试示例中出现但从未在训练数据集中出现过的单词总是会导致此类破坏?在这种情况下,我们训练有素的模型永远无法预测正确的情绪?它会随机选择正面或负面类别,因为它们都具有相同的零概率并且预测错误?答案是不!这是第二种方法(编号为2)发挥作用的地方,实际上这是实际用于推导p(i属于c类)的数学公式。但在我们继续使用方法2之前,我们应该首先熟悉它的数学!
因此,在添加1的伪 计数之后,在训练数据中永远不会出现的测试单词的概率p将永远不会为零,因此,术语产品的数值(c类中测试单词“j”的p)永远不会结束为零,这反过来暗示 p(i属于c类)也永远不会为零!所以一切都很好,没有零概率的破坏!
因此,方法编号2的分子项将添加1,因为我们为词汇表中的每个单词添加了一个,因此它变为 :
同样,分母变为:
- 所以完整的公式:
- 现在使用方法2找到概率:
处理零概率:这些就像故障保护概率一样!
现在作为测试示例的概率,“Very good food and service!!!”更多的是积极的类别,即9.33E-09与负类别(即7.74E-09)相比,所以我们可以预测它为积极的情绪!这就是我们如何简单地预测例子
快速注意事项: 与其他机器学习算法一样,朴素贝叶斯也需要验证集来评估训练模型的有效性。
深入挖掘概率数学
现在您已经对训练朴素贝叶斯模型所需的概率计算有了基本的了解,然后用它来预测给定测试句的概率,现在我将深入研究概率细节。
在上一节中对给定测试句子的概率进行计算时,我们什么也没做,只是在测试时为我们的预测实现了给定的概率公式:
解码上述数学方程式:
“ | “=指已经给出的状态/或某些过滤标准
“ c ”=类/类别
“ x ”=测试例/测试句
p(c | x) =给定的测试例x,它属于c类的概率是多少。这也称为后验概率。这是针对给定测试示例x针对每个给定训练类找到的条件概率。
p(x | c) =给定的类c,示例x属于类c的概率是多少。这也称为似然,因为它意味着示例 x有多大可能属于 c类。这也是条件概率。我们使用在训练阶段确定的单词计数来计算该概率。
这里 “ j ” 代表一个类 , k 代表一个特征
我们在计算部分中隐式使用了这个公式两次,因为我们有两个类。记住发现的product 的值( p of a test word “ j ” in class c ) ?
p(c) =这意味着 c类的概率。这也称为先验概率/无条件概率。这是无条件的概率。我们在概率计算部分中更早地计算了这一点(在步骤#1中找到了术语的值: c类的 p)
p(x) =这也称为归一化常数,因此概率p(c | x)实际上落在[0,1]范围内。因此,如果删除它,概率p(c | x)可能不一定落在[0,1]的范围内。直观地,这意味着在任何情况下或不论其类别标签(即正面还是负面)的示例 x的概率。这也反映在用于计算p(x)的全概率定理中,并且要求找到 p(x),我们将在所有给定的类中找到它的概率(因为它是无条件概率)并简单地添加它们:
全概率定理
这意味着如果我们有两个类,那么我们将有两个项,所以在我们特定的正面和负面情绪的情况下:
两个类的全概率定理
我们在上面的计算中使用过吗?不,我们没有。为什么???因为我们正在比较正面和负面类别的概率,并且因为分母保持不变,所以在这种特殊情况下,省略相同的分母并不影响我们训练模型的预测。
避免下溢错误的常见陷阱!
如果你注意到,单词概率的数值(即c类中测试单词“j”的p)非常小。因此,将所有这些微小概率乘以找到乘积(c类中测试词“j”的p)将产生更小的数值,这通常会导致下溢,这显然意味着对于给定的测试句,训练的模型将无法预测它的类别/情绪。因此,为了避免这种下溢错误,我们将数学log的帮助如下:
避免下溢错误
现在,我们不需要对单个单词的概率进行乘法运算,我们只需要把它们加起来。为什么只有log?为什么没有其他函数呢?因为log以单调方式增大或减小,这意味着它不会影响概率的顺序。在将log应用于它们之后,较小的概率仍将保持较小,反之亦然。因此,假设测试词“is”的概率小于测试词“happy”,因此在通过log之后虽然增加了它们的幅度,但“is”仍然比“happy”的概率小。因此,在不影响我们训练模型的预测的情况下,我们可以有效地避免下溢误差的常见缺陷。
一些随机的结论性说明
- 虽然我们生活在API的时代,几乎很少从头开始编码。但深入理解算法理论对于深入理解机器学习算法的实际工作方式至关重要。在转向API之前,我个人认为真正的数据科学家应该从头开始编码,以实际看到数字背后的原因以及特定算法优于其他算法的原因。
- Naive Bayes模型的最佳特征之一是,您可以通过简单地用新的词汇单词更新它而不是总是重新训练它来提高它的准确性。您只需要在词汇表中添加单词并相应地更新单词计数。