朴素贝叶斯算法的Python实现

朴素贝叶斯算法的Python实现

朴素贝叶斯分类算法被广泛应用于文本分类场景中、包含垃圾邮件、互联网新闻等分类任务,属于有监督学习算法。它独立考量每一维度特征被分类的条件概率,然后综合这些概率对其所在的特征向量做出分类预测,即“假设各个维度上的特征被分类的条件概率之间是相互独立的”,该假设使得模型预测需要计算的参数规模从指数级降至线性级,极大地提升计算效率。该算法在模型训练过程中没考虑各个维度特征的相互联系,对于关联性较强的数据特征分类效果较差。

朴素贝叶斯的优缺点

优点:数据集较小时模型表现很好,适合增量式训练、多分类任务。

缺点:对输入数据的表达形式很敏感,由于其“朴素”的特点,也会带来一些准确率上的损失。


MultinomialNB算法的一般流程

  1. 数据采集:使用NumPy与pandas以及sklearn.datasets等方式获取或处理数据集
  2. 数据预处理:测试集、训练集构建,进行数据标准化处理,提取文本特征向量矩阵。
  3. 模型训练:MultinomialNB算法
  4. 模型测试:使用测试集,验证模型性能。
  5. 模型优化:使用交叉验证法优化K值取值。

MultinomialNB(多项式模型)的Python实现

1. 数据采集

该数据集包含分布在20个不同新闻组中的18846篇文档,

数据来源:from sklearn.datasets import fetch_20newsgroups

数据标签:

'alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'

数据样例:

From: Alexander Samuel McDiarmid <am2o>

Subject: driver ??

Organization: Sophomore, Mechanical Engineering, Carnegie Mellon, Pittsburgh, PA

Lines: 15

NNTP-Posting-Host: po4.andrew.cmu.edu

1) I have an old Jasmine drive which I cannot use with my new system ……

使用sklearn.datasets.fetch_20newsgroups(新闻数据抓取器),加载数据集,Python实现如下:

朴素贝叶斯算法的Python实现

2. 数据预处理

使用 sklearn.model_selection.train_test_split方式,将整个数据集随机抽取80%作为训练集、剩余的20%作为测试集,并且进行数据标准化处理,且重复运行时,训练集与测试集不发生变化,Python实现如下:

朴素贝叶斯算法的Python实现

尝试使用四种方式实现文本特征向量的提取,并查看不同文本特征提取方式对算法分类识别率的影响:

  • CountVectorizer提取特征向量。
  • CountVectorizer提取特征向量且去掉停词。
  • TfidfVectorizer提取文本特征向量。
  • TfidfVectorizer提取文本特征向量且去掉停词。

CountVectorizer只考虑每种词汇在训练文本中出现的频率,而TfidfVectorizer除了考量某词汇在训练文本中出现的频率之外,能够降低出现频率高没有意义的词汇出现带来的影响,训练文本的数量越多,TfidfVectorizer方式更有优势,Python实现如下:

朴素贝叶斯算法的Python实现

3. 模型训练及测试

朴素贝叶斯算法的Python实现

测试集验证结果如下:

朴素贝叶斯算法的Python实现

扩展:生成模型和判别模型的区别

有监督机器学习方法可以分为生成模型和判别模型。

生成模型

无穷样本 -> 概率密度模型 = 产生式模型 -> 预测

生成式模型求得联合概率P(Y,X),对于未见示例X,需要求出X与不同标签之间的联合概率分布,然后概率大的获胜。

  • 常见生成模型:朴素贝叶斯、KNN、高斯混合模型、隐马尔可夫模型、限制玻尔兹曼机、文档主题生成模型(LDA)
  • 生成模型举例:利用生成模型是根据哈士奇的特征首先学习出一个哈士奇的模型,然后根据边境牧羊犬的特征学习出一个边境牧羊犬的模型,然后从这只羊中提取特征,放到哈士奇羊模型中看概率是多少,在放到边境牧羊犬模型中看概率是多少,哪个概率大就是哪种品种的狗,求的是P(X,Y),即联合概率。

判别模型

有限样本 -> 判别函数 = 判别式模型 -> 预测

对于判别式模型来说求得P(Y|X),对未见示例X,根据P(Y|X)可以求得标记Y,即可以直接判别出标签。

  • 常见判别模型:K-近邻、决策树、SVM、线性判别分析(LDA)、支持向量机、线性回归、传统的神经网络、逻辑斯蒂回归。
  • 判别模型举例:要确定一个狗是哈士奇还是边境牧羊犬,用判别模型的方法是从训练集中学习到模型,然后通过提取这只狗的特征来直接预测出这只狗的品种(正例)概率,其根据X“判别”Y,求的是P(Y|X),即后验概率。

判别式模型是根据一只狗的特征可以直接给出这只狗品种(正例)的概率(比如 概率为0.8),而生成式模型是要都试一试((X,Y¹), (X,Y²), (X,Y³),…),概率最大的那个就是这只狗的品种结果。

朴素贝叶斯算法的Python实现

后续会继续分享线性、决策树、SVM、随机森林、K均值聚类等算法介绍及Python实现,若对你有所帮助,欢迎大家评论、留言、关注,感谢支持!

朴素贝叶斯算法的Python实现


分享到:


相關文章: