一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3
导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果。所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述。然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论、垃圾邮件、个人广告中获取区域倾向等几个方面进行应用,包括创建数据集、数据预处理、词集模型和词袋模型、朴素贝叶斯模型训练和优化等。然后结合复旦大学新闻语料进行朴素贝叶斯的应用。最后,大家熟悉其原理和实现之后,采用机器学习sklearn包进行实现和优化。由于篇幅较长,采用理论理解、案例实现、sklearn优化三个部分进行学习。(本文原创,转载必须注明出处: 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3)
目录
1
2
3
4
5
6
7
8
9
10
11
12
复旦新闻语料:朴素贝叶斯中文文本分类
项目概述
本节介绍朴素贝叶斯分类算法模型在中文领域中的应用。我们对新闻语料进行多文本分类操作,本文选择艺术、文学、教育、哲学、历史五个类别的训练文本,然后采用新的测试语料进行分类预测。
收集数据
数据集是从复旦新闻语料库中抽取出来的,考虑学习使用,样本选择并不大。主要抽选艺术、文学、教育、哲学、历史五个类别各10篇文章。全部数据文档50篇。具体情况不同对收集数据要求不同,你也可以选择网络爬取,数据库导出等。这文档读取时候可能会遇到gbk,utf-8等格式共存的情况,这里建议采用
参数使用最大似然法估计。
高斯朴素贝叶斯实现方法代码:
'''高斯朴素贝叶斯'''
def MyGaussianNB(trainMat='',Classlabels='',testDoc=''):
# -----sklearn GaussianNB-------
# 训练数据
X = np.array(trainMat)
Y = np.array(Classlabels)
# 高斯分布
clf = GaussianNB()
clf.fit(X, Y)
# 测试预测结果
index = clf.predict(testDoc) # 返回索引
reslist = ['Art','Literature','Education','Philosophy','History']
print(reslist[index[0]])
多项朴素贝叶斯
MultinomialNB 实现了服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。 分布参数由每类 y 的 向量决定, 式中 n 是特征的数量(对于文本分类,是词汇量的大小)
是样本中属于类 y 中特征 i 概率
。
参数 使用平滑过的最大似然估计法来估计,即相对频率计数:
式中 是 训练集 T 中 特征 i 在类 y 中出现的次数,
是类 y 中出现所有特征的计数总和。
先验平滑因子应用于在学习样本中没有出现的特征,以防在将来的计算中出现0概率输出。 把
被称为拉普拉斯平滑(Lapalce smoothing),而
被称为利德斯通(Lidstone smoothing)。
多项朴素贝叶斯实现方法代码:
'''多项朴素贝叶斯'''
def MyMultinomialNB(trainMat='',Classlabels='',testDoc=''):
# -----sklearn MultinomialNB-------
# 训练数据
X = np.array(trainMat)
Y = np.array(Classlabels)
# 多项朴素贝叶斯
clf = MultinomialNB()
clf.fit(X, Y)
# 测试预测结果
index = clf.predict(testDoc) # 返回索引
reslist = ['Art','Literature','Education','Philosophy','History']
print(reslist[index[0]])
伯努利朴素贝叶斯
BernoulliNB 实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。伯努利朴素贝叶斯的决策规则基于
与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y 中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。
在文本分类的例子中,词频向量(word occurrence vectors)(而非词数向量(word count vectors))可能用于训练和用于这个分类器。 BernoulliNB 可能在一些数据集上可能表现得更好,特别是那些更短的文档。 如果时间允许,建议对两个模型都进行评估。
伯努利朴素贝叶斯代码实现如下:
'''伯努利朴素贝叶斯'''
def MyBernoulliNB(trainMat='',Classlabels='',testDoc=''):
# -----sklearn BernoulliNB-------
# 训练数据
X = np.array(trainMat)
Y = np.array(Classlabels)
# 多项朴素贝叶斯
clf = BernoulliNB()
clf.fit(X, Y)
# 测试预测结果
index = clf.predict(testDoc) # 返回索引
reslist = ['Art','Literature','Education','Philosophy','History']
print(reslist[index[0]])
各种贝叶斯模型分类测试
代码实现如下:
def testingNB():
# 加载数据集和单词集合
trainMat,Classlabels,myVocabList = grabdata() # 读取训练结果
# 测试数据
testEntry = textParse(open('./fudan/test/C6-2.txt',encoding='UTF-8').read())
testDoc = np.array(bagOfWords2VecMN(myVocabList, testEntry)) # 测试数据
# 测试预测结果
MyGaussianNB(trainMat,Classlabels,testDoc)
MyMultinomialNB(trainMat,Classlabels,testDoc)
MyBernoulliNB(trainMat,Classlabels,testDoc)
运行结果:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.014 seconds.
Prefix dict has been built succesfully.
高斯朴素贝叶斯:Education
多项朴素贝叶斯分类结果:Art
伯努利朴素贝叶斯分类结果:Literature
耗时:2.3996 s
参考文献
- scikit中文社区:http://sklearn.apachecn.org/cn/0.19.0/
- 中文维基百科:https://zh.wikipedia.org/wiki/
- 文本分类特征选择:https://www.cnblogs.com/june0507/p/7601001.html
- GitHub:https://github.com/BaiNingchao/MachineLearning-1
- 图书:《机器学习实战》
- 图书:《自然语言处理理论与实战》
完整代码下载
源码请进【机器学习和自然语言QQ群:436303759】文件下载:

作者声明
本文版权归作者所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。