朴素贝叶斯(Naive Bayes)常用于自然语言分类,在垃圾邮件过滤上应用十分有名
概述
朴素贝叶斯是一个基于概率进行预测的算法,用于分类问题
具体来说:计算数据为某个标签的概率,并将其分类为概率值最大的标签
主要应用:文本分类和垃圾邮件判定等自然语言处理中的分类问题
朴素贝叶斯基于文本中包含的单词推测未知数据的类别
在某个条件下的概率为条件概率
算法说明
虽然最终是自然语言处理的分类,但在应用朴素贝叶斯时,需要将输入数据转换为由特征值构成的向量
先在预处理阶段将文本转换为由特征值构成的向量,然后使用朴素贝叶斯进行训练,最后查看结果
预处理
预处理阶段,将文本转换为BoW(Bag of Words,词袋)的形式,形成由特征值构成的向量和标签的组合
- 先从现有的训练数据文本中只提取名词,忽略名词在文本中的顺序,将它们作为集合处理
- 接下来,将训练数据和类别数据转换为易于处理的数据形式。当所有单词的集合包含训练数据的单词时,将该单词列的值设为1,否则设为0。当类别为“电影”时,类别值替换为1;当类别值为“宇宙”时,类别值替换为0。即为标签
通过以上处理,将以自然语言书写的文本转换为表示单词出现的特征值和标签的组合,这种文本表示方式为BoW
同样方法处理验证数据
为了从文本中提取出单词的集合,需要进行分词处理,这里假定这些处理已做完
概率的计算
朴素贝叶斯使用训练数据来学习与各标签对应的单词的出现概率
在分类时求出每个标签对应的概率,将概率最高的标签作为分类结果
朴素贝叶斯在训练时计算以下两种概率:
- 每个标签出现的概率
- 在各标签下,每个单词出现的条件概率
应该分配概率为0的地方,应该分配小的概率值0.01,即为平滑(smoothing)
平滑考虑了在没有出现单词的位置也分配极小的概率值
在分类时,朴素贝叶斯分别为每个标签值计算上述两个概率的乘积,通过比较进行分类,最后输出其中概率最大的标签作为分类结果
朴素贝叶斯通过“每个单词都是独立的”简单的假设简化了学习过程
示例代码
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) # 训练
model.predict([[1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0]]) # 评估
详细说明
朴素贝叶斯是自然语言分类的基础算法,但是不适合预测天气预报中的降水概率那种预测值是概率本身的情况
前面的独立假设忽略了文本中单词之间的关联性,如果要计算的概率值很重要,应该避免直接将朴素贝叶斯算出的值用作概率
朴素贝叶斯的“即使将各自的特征作为独立的变量来处理,也可以计算出概率”这一假设对某些学习任务不成立
考虑上下文,考虑其他模型