2019-01-17 08:01:00

大家好,今天跟大家学习一下通过sklearn的朴素贝叶斯模型实战。前面在 朴素贝叶斯分类原理篇 中介绍了朴素贝叶斯的分类原理。想了解的同学可以去看看。

机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现_机器学习

 

朴素贝叶斯模型有着广泛的应用场景,尤其在文本分类任务中表现突出,如新闻分类、垃圾邮件的区分等,本文将学习研究一下 如何对新闻文本数据进行分类。

机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现_机器学习_02

 

本次使用的数据为经典的20类新闻文本数据,来源于sklearn.data。获取数据代码如下:

from sklearn.datasets import fetch_20newsgroups
news_data = fetch_20newsgroups(subset = 'all')
print("本次下载的新闻条数为:",len(news_data.data))
#本次下载的新闻条数为: 18846
print("第一篇文章内容的字符数量为:",len(news_data.data[0]))
#第一篇文章内容的字符数量为: 902
print(news_data.data[0]

机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现_机器学习_03

 

由上可知,本次下载的新闻共有18846条,这些文本数据没有数字化的量度,也没有具体的特征,因此需要对数据进行向量处理。首先对数据进行分割,并随机采样出一部分数据用于对训练模型进行测试。

x = news_data.data
y = news_data.target
from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=33)

通过sklearn.feature_extraction.text 中的CountVectorizer模块将文本转化为特征向量。

from sklearn.feature_extraction.text import CountVectorizer
#文本数据向量化
vec = CountVectorizer()
x_train=vec.fit_transform(x_train)
x_test=vec.transform(x_test)

通过 sklearn.naive_bayes 导入 朴素贝叶斯分类模型(MultinomialNB),并对训练数据进行参数估计,再通过向量化后的测试数据进行预测。

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB() #初始化模型
model.fit(x_train,y_train) #调用fit函数进行模型训练
y_predict = model.predict(x_test) #使用predict 函数进行预测

模型评估在 3分钟了解监督与无监督模型的性能评估标准 一文中介绍过,可以使用准确率、召回率、精确率 和 F1指标对分类问题进行评估。

from sklearn.metrics import classification_report
print("模型得分:%.2f" % (float(model.score(x_test,y_test))*100))
模型得分:83.98
print(classification_report(y_test,y_predict,target_names= news_data.target_names))

机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现_机器学习_04

 

从上图中可以看出,朴素贝叶斯模型对4712条测试样本新闻进行分类的精确率为83.98%,平均的精确率(0.86)、召回率 (0.84)和 F1指标(0.82) 都在0.8以上,效果还不错。

机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现_机器学习_05

 

由于其较强的特征条件独立假设,使得计算规模极大的降低,极大的降低资源消耗和时间开销,因此被广泛的用于海量的文本分类中,但正是这个优点导致了在该模型在关联性较强的分类任务上表现不好。

好了,今天就到这里,如有疑问,欢迎大家关注留言。