优缺点
- 优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快。
- 缺点:
- 由于使用了样本属性独立性的假设,所以如果样本属性有关联时效果不好。
联合概率和条件概率
联合概率
包含多个条件,且所有条件同时成立的概率。
记作:P(A,B) P(A,B) = P(A)P(B)
条件概率
就是事件A在另一个事件B已经发生条件下发生的概率。
记作:P(A|B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果。
贝叶斯公式

注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别
公式可以理解为:

其中c可以是不同 类别
公式分为三部分:
- P(C):每个文档类别的概率(某文档类别数/总文档数量)
- P(W|C):给定类别下特征(被预测文档中出现的词)的概率
- 计算方法:P(F1|C) = Ni/N(训练文档中去计算)
- Ni为该词在C类别所有文档中出现的次数
- N为所属类别C下文档所有词出现的次数和
- P(F1,F2,…)预测文档中每个词的概率

拉普拉斯平滑
解决的问题:从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面有很多出现次数都为0,很可能计算结果都为零。
方法:拉普拉斯平滑系数

sklearn朴素贝叶斯实现API:
sklearn.naive_bayes.MultinomialNB

算法案例
- sklearn20类新闻分类
- 20个新闻组数据集包含20个主题的18000个新闻组帖子
案例流程
- 加载20类新闻数据,并进行分割
- 生成文章特征词
- 朴素贝叶斯estimator流程进行预估
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def naviebayes():
'''
朴素贝叶斯进行文本分类
:return: None
'''
# 获取数据
news = fetch_20newsgroups(subset='all')
# 进行数据分割
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)
# 对数据集进行特征抽取
tf = TfidfVectorizer()
# 以训练集当中的词的列表进行每篇文章重要性统计
x_train = tf.fit_transform(x_train)
print(tf.get_feature_names())
x_test = tf.transform(x_test)
# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)
print(x_train.toarray())
mlt.fit(x_train,y_train)
y_predict = mlt.predict(x_test)
print('预测的文章类别为:',y_predict)
# 得出准确率
print('准确率为:',mlt.score(x_test,y_test))
return None
if __name__ == '__main__':
naviebayes()
# 运行结果
nd', 'dependable', 'dependances', 'dependant', 'depended', 'dependence', 'dependencies', 'dependency',...
[[0. 0. 0. ... 0. 0. 0. ]
[0. 0. 0. ... 0. 0. 0. ]
[0. 0.02792651 0. ... 0. 0. 0. ]
...
[0. 0. 0. ... 0. 0. 0. ]
[0. 0. 0. ... 0. 0. 0. ]
[0. 0. 0. ... 0. 0. 0. ]]
预测的文章类别为: [ 9 15 8 ... 14 15 1]
准确率为: 0.8361629881154499