sk-learn实例-用朴素贝叶斯算法(Naive Bayes)对文本进行分类

简介

朴素贝叶斯(Naive Bayes)是一个非常简单,但是实用性很强的分类模型,与基于线性假设的模型(线性分类器和支持向量机分类器)不同,朴素贝叶斯分类器的构造基础是贝叶斯理论。

抽象一些的说,朴素贝叶斯分类器会单独考量每一维度特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,这个模型的基本数学假设是:各个维度上的特征被分类的条件概率之间是相互独立的。

对朴素贝叶斯算法更深入的理论介绍可以参考这几篇博客:
带你彻彻底底搞懂朴素贝叶斯公式
深入理解朴素贝叶斯(Naive Bayes)
朴素贝叶斯分类(Nave Bayes)

朴素贝叶斯模型有着广泛的实际应用环境,特别是在文本分类的任务中,包括互联网新闻的分类,垃圾邮件的筛选等。

问题引出

本文使用Scikit-learn中集成的经典的20类新闻文本作为实验数据。
需要提醒的是,本文中的数据没有预存,需要实时从网上下载,而在墙内下载速度有点慢,因此建议下载。
下面我们先看下数据:

from sklearn import datasets
news = datasets.fetch_20newsgroups(subset='all')
print(len(news.data)) #news.data的数据格式为list
print(news.data[0])

sk-learn实例-用朴素贝叶斯算法(Naive Bayes)对文本进行分类_第1张图片

从图中我们可以看到,我们的原始数据包含是18846条文本的列表,共有20个类别。由于原始数据中既没有被设定特征,也没有数字化量度。因此在交给朴素贝叶斯分类器学习之前,要对数据进行进一步的处理。

代码实例

下面开始进行分析

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

#获取数据
news = datasets.fetch_20newsgroups(subset='all')

#将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, 
													test_size=0.25, random_state=33)

#导入文本特征向量转化模块,并将文本特征向量化
vec = CountVectorizer()
X_train = vec.fit_transform(X_train)
X_test = vec.transform(X_test)    #注意这个函数与上面的不一样

#使用默认配置初始化朴素贝叶斯模型
mnb = MultinomialNB()
#利用训练数据对模型参数进行估计,并进行预测
mnb.fit(X_train, y_train)
y_predict = mnb.predict(X_test)

#输出预测结果
print('The Accuracy of Naive Bayes:', mnb.score(X_test, y_test))
print(classification_report(y_test, y_predict, target_names=news.target_names))

sk-learn实例-用朴素贝叶斯算法(Naive Bayes)对文本进行分类_第2张图片

小结

通过上图的结果可以看出,朴素贝叶斯对4712个测试样本分类准确性约83.977,结果还是比较不错的。

  • 朴素贝叶斯被广泛运用于海量互联网文本分类任务。
  • 由于其较强的特征条件独立假设,使得模型预测所需要估计的参数规模从幂指数量级到线性量级减少,极大的节约了内存消耗和计算时间。
  • 但是也正是受这种强假设的限制,模型训练时无法将各个特征之间的练习考量在内,使该模型在特征之间关联性较强的分类任务上性能表现不佳。

你可能感兴趣的:(机器学习,sklearn,朴素贝叶斯,机器学习)