Python机器学习及实践——基础篇4(朴素贝叶斯)

Posted Lenskit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python机器学习及实践——基础篇4(朴素贝叶斯)相关的知识,希望对你有一定的参考价值。

 模型介绍:朴素贝叶斯是一个非常简单,但是实用性很强的分类模型。不过,和上述两个基于线性假设的模型(线性分类器和支持向量机分类器)不同,朴素贝叶斯分类器的构造基础是贝叶斯理论。
 朴素贝叶斯分类器会单独考量每一维度特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,这个模型的基本数学假设是:各个维度上的特征被分类的条件概率之间是相互独立的。具体的贝叶斯公式网上有很多,这里不再赘述,贴一个我觉得讲得很不错的链接:http://www.ruanyifeng.com/blog/2013/12/naive_bayes_classifier.html?bsh_bid=1598724030
 朴素贝叶斯有着广泛的实际应用环境,特别是文本分类的任务中间,包括互联网新闻的分类,垃圾邮件的筛选。这里我们将使用经典的20类新闻文本作为试验数据。获取数据的代码如下:
# 从sklearn.datasets里导入新闻数据抓取器fetch_20newsgroups。
from sklearn.datasets import fetch_20newsgroups
# 与之前预存的数据不同,fetch_20newsgroups需要即时从互联网下载数据。
news = fetch_20newsgroups(subset='all')
# 查验数据规模和细节。
print len(news.data)
print news.data[0]
18846
From: Mamatha Devineni Ratnam <mr47+@andrew.cmu.edu>
Subject: Pens fans reactions
Organization: Post Office, Carnegie Mellon, Pittsburgh, PA
Lines: 12
NNTP-Posting-Host: po4.andrew.cmu.edu
I am sure some bashers of Pens fans are pretty confused about the lack
of any kind of posts about the recent Pens massacre of the Devils. Actually,
I am  bit puzzled too and a bit relieved. However, I am going to put an end
to non-PIttsburghers' relief with a bit of praise for the Pens. Man, they
are killing those Devils worse than I thought. Jagr just showed you why
he is much better than his regular season stats. He is also a lot
fo fun to watch in the playoffs. Bowman should let JAgr have a lot of
fun in the next couple of games since the Pens are going to beat the pulp out of Jersey anyway. I was very disappointed not to see the Islanders lose the final
regular season game.          PENS RULE!!!

 由上述输出,可知该数据共有18846条新闻;不同于前面的样例数据,这些文本数据既没有被设定特征,也没有数字化的度量。因此,在交给朴素贝叶斯分类器学习之前,要对数据做进一步处理。不过在此之前,我们仍需先对数据进行分割并且随机采样出一部分用于测试。
# 从sklearn.cross_validation 导入 train_test_split。
from sklearn.cross_validation import train_test_split
# 随机采样25%的数据样本作为测试集。
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=33)
 接着,我们先将文本转化为特征向量,然后利用朴素贝叶斯模型从训练数据中估计参数,最后利用这些概率参数对同样转化为特征向量的测试新闻样本进行类别预测,如下代码所示:
# 从sklearn.feature_extraction.text里导入用于文本特征向量转化模块。详细介绍请读者参考3.1.1.1 特征抽取一节。
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里导入朴素贝叶斯模型。
from sklearn.naive_bayes import MultinomialNB

# 从使用默认配置初始化朴素贝叶斯模型。
mnb = MultinomialNB()
# 利用训练数据对模型参数进行估计。
mnb.fit(X_train, y_train)
# 对测试样本进行类别预测,结果存储在变量y_predict中。
y_predict = mnb.predict(X_test)
 与之前的评价指标优于,我们使用准确性、召回率、精确率和F1指标,这4个测度对朴素贝叶斯模型在20类新闻文本分类任务上的性能进行评估,详细代码如下:
# 从sklearn.metrics里导入classification_report用于详细的分类性能报告。
from sklearn.metrics import classification_report
print 'The accuracy of Naive Bayes Classifier is', mnb.score(X_test, y_test)
print classification_report(y_test, y_predict, target_names = news.target_names)

The accuracy of Naive Bayes Classifier is 0.839770797963

                          precision    recall  f1-score   support



             alt.atheism       0.86      0.86      0.86       201

           comp.graphics       0.59      0.86      0.70       250

 comp.os.ms-windows.misc       0.89      0.10      0.17       248

comp.sys.ibm.pc.hardware       0.60      0.88      0.72       240

   comp.sys.mac.hardware       0.93      0.78      0.85       242

          comp.windows.x       0.82      0.84      0.83       263

            misc.forsale       0.91      0.70      0.79       257

               rec.autos       0.89      0.89      0.89       238

         rec.motorcycles       0.98      0.92      0.95       276

      rec.sport.baseball       0.98      0.91      0.95       251

        rec.sport.hockey       0.93      0.99      0.96       233

               sci.crypt       0.86      0.98      0.91       238

         sci.electronics       0.85      0.88      0.86       249

                 sci.med       0.92      0.94      0.93       245

               sci.space       0.89      0.96      0.92       221

  soc.religion.christian       0.78      0.96      0.86       232

      talk.politics.guns       0.88      0.96      0.92       251

   talk.politics.mideast       0.90      0.98      0.94       231

      talk.politics.misc       0.79      0.89      0.84       188

      talk.religion.misc       0.93      0.44      0.60       158



             avg / total       0.86      0.84      0.82      4712
 通过上述代码的输出,可以得知朴素贝叶斯分类器对4712条新闻文本测试样本分类的准确性约为83.977%,平均精确率、召回率以及F1指标分别为0.86、0.84和0.82。

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




以上是关于Python机器学习及实践——基础篇4(朴素贝叶斯)的主要内容,如果未能解决你的问题,请参考以下文章

重要朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)

机器学习实战教程:朴素贝叶斯实战篇之新浪新闻分类

机器学习实战教程:朴素贝叶斯基础篇之言论过滤器

机器学习-朴素贝叶斯原理及Python实现

机器学习算法原理与编程实践之朴素贝叶斯分类

朴素贝叶斯应用-机器学习-新浪新闻分类器