算法系列——有监督学习——6.朴素贝叶斯

一、概述

朴素贝叶斯是一个基于概率进行预测的算法,在实践中被用于分类问题。具体来说,就是计算数据为某个标签的概率,并将其分类为概率值最大的标签。朴素贝叶斯主要用于文本分类和垃圾邮件判定等自然语言处理中的分类问题。

下面使用朴素贝叶斯将虚构的新闻标题分类为“电影”和“宇宙”两个类别

验证数据是作为“电影”类别的新闻标题生成的,但这里我们当作不知道它的类别。

下面思考根据训练数据计算未知数据的类别是“电影”还是“宇宙”的概率的方法。训练数据中类别为“电影”的数据有3条,类别为“宇宙”的数据也有3条。简单地计算一下,可知未知数据的类别为“电影”的概率是3/6=50%,同样地,类别为“宇宙”的概率也是50%。这个方法虽然很简单,但是如果采用这个计算方法,那么不管未知数据中的文本是什么,分类为各个类别的概率都是固定的。

朴素贝叶斯基于文本中包含的单词推测未知数据的类别。我们关注一下验证数据中包含的“感动”这个词。这个词在哪个类别里都会出现,但是出现的比例在每个类别里都不一样,如图所示:

在“电影”类别的数据中出现“感动”这个词的概率是2/3≈67%,在“宇宙”类别的数据中则是1/3≈33%,可见这个词更容易出现在“电影”类别的数据中。另外,在出现“感动”这个词的数据中,类别为“电影”的概率是2/3≈67%,为“宇宙”的概率是1/3≈33%。如果对使用验证数据中的“感动”这个词进行筛选后的数据计算比例,类别是“电影”的概率更高。此处求得的在某个条件(这次的条件是“感动”这个词出现)下的概率叫作条件概率。朴素贝叶斯不仅使用了单词在文本中出现的比例,还使用了每个单词的条件概率,通过文本中单词的信息提高了计算精度。

二、算法说明

虽然最终要做的是自然语言处理的分类,但在应用朴素贝叶斯时,还需要将输入数据转换为由特征值构成的向量。我们先在预处理阶段将文本转换为由特征值构成的向量,然后使用朴素贝叶斯进行训练,最后查看结果。

1.预处理

在预处理阶段,我们将文本转换为BoW(Bag of Words,词袋)的形式,形成由特征值构成的向量和标签的组合。先从现有的训练数据的文本中只提取出名词,忽略名词在文本中的顺序,把它们作为集合处理A。表中列出了只从训练数据中提取出名词的结果。

接下来,将训练数据和类别转换为易于处理的数据形式。当所有单词的集合包含训练数据的单词时,将该单词列的值设为1,否则设为0。另外,当类别为“电影”时,将类别的值替换为1;当类别为“宇宙”时,将类别的值替换为0,结果如表所示。这些就是标签。

通过以上处理,我们可以将以自然语言书写的文本转换为表示单词出现的特征值和标签的组合,这种文本表示方式称为BoW。下面采用同样的做法处理验证数据。验证数据中包含了训练数据中不包含的“复映”一词。这样的单词很难处理,简单起见,这次就不处理这个词了。文本处理后的结果如表所示:

通过实施上述预处理,本次的问题就变为了预测验证数据[1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0]的类别的问题。

2. 概率的计算

朴素贝叶斯使用训练数据来学习与各标签对应的单词的出现概率。在分类时求出每个标签对应
的概率,将概率最高的标签作为分类结果。朴素贝叶斯在训练时计算以下两种概率。
1)每个标签出现的概率。
2)在各标签下,每个单词出现的条件概率。
对朴素贝叶斯在训练时进行的处理进行汇总,如图所示。注意,图中只展示了部分特征值的列。

在图中应该分配概率0的地方,我们分配了小的概率值0.01,这种做法叫作平滑(smoothing)。
概率为0的位置表示在对应的训练数据中没有出现对应的单词,但是如果使用更大的数据集作为训
练数据,那个单词却真有可能出现。平滑处理考虑到了这种可能性,在没有出现单词的位置也分配
小的概率值。

在分类时,朴素贝叶斯分别为每个标签值计算上述两个概率的乘积,通过比较进行分类。例如,在对本次的验证数据[1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0](“复映的动作电影名作让人感动”)这个文本进行分类时,实际比较的是下列处理的结果。

1. 求出“电影”类别的文本出现的概率。
2. 从“电影”类别的文本中分别求出“名作”“ 动作”“ 感动”这几个单词出现的概率。
3. 对于文本中没有出现的单词,也要求出在“电影”类别的文本中没有出现的概率。
4. 计算所有概率的乘积。

上述处理如图所示。按标签比较图中的处理的结果,输出其中概率最大的标签作为分类结果。

图中分别计算了作为特征值的每个单词的概率,没有考虑单词的顺序和组合。朴素贝叶斯通过“每个单词都是独立的”这样一个简单的假设简化了学习过程。

三、示例代码

# 导入scikit-learn中的多项式朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
# 生成数据
X_train = [[1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
           [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
           [1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1]]
y_train = [1, 1, 1, 0, 0, 0]
model = MultinomialNB()
model.fit(X_train, y_train)  # 训练
print(model.predict([[1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0]]))  # 评估

输出:[1]代表类别为1就是电影,评估准确。

四、详细说明

注意点
朴素贝叶斯是自然语言分类的基础算法,但是不适合预测天气预报中的降水概率那种预测值是概率本身的情况。

前面的“算法说明”部分提到过,朴素贝叶斯基于“每个单词的概率可以独立计算”的假设,这是为了使概率的计算方法尽量简单。这个假设忽略了文本中单词之间的关联性。如果要计算的概率值很重要,则应该避免直接将由朴素贝叶斯算出的值用作概率。

另外,朴素贝叶斯的“即使将各自的特征作为独立的变量来处理,也可以计算出概率”这一假设对于某些学习任务不成立。例如,如果单词在不同的上下文中含义不同,那么朴素贝叶斯的假设是不成立的。“踢”这个单词常常在格斗等运动的文本中出现,但是如果文本中出现了“踢了球”的用法,那么此时文本的主题很有可能是足球。这种单词含义在不同的上下文中有所变化的情况是不满足朴素贝叶斯“所有特征都是相互独立的”这一假设的。如果要考虑单词的上下文,就需要根据不同的上下文考虑使用其他模型。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值