朴素贝叶斯分类器是一个以贝叶斯定理为基础,广泛应用于情感分类领域的优美分类器。本文我们尝试使用该分类器来解决上一篇文章中影评态度分类。

1、贝叶斯定理

假设对于某个数据集,随机变量C表示样本为C类的概率,F1表示测试样本某特征出现的概率,套用基本贝叶斯公式,则如下所示:

上式表示对于某个样本,特征F1出现时,该样本被分为C类的条件概率。那么如何用上式来对测试样本分类呢?

举例来说,有个测试样本,其特征F1出现了(F1=1),那么就计算P(C=0|F1=1)和P(C=1|F1=1)的概率值。前者大,则该样本被认为是0类;后者大,则分为1类。

对该公示,有几个概念需要熟知:

先验概率(Prior)。P(C)是C的先验概率,可以从已有的训练集中计算分为C类的样本占所有样本的比重得出。

证据(Evidence)。即上式P(F1),表示对于某测试样本,特征F1出现的概率。同样可以从训练集中F1特征对应样本所占总样本的比例得出。

似然(likelihood)。即上式P(F1|C),表示如果知道一个样本分为C类,那么他的特征为F1的概率是多少。

对于多个特征而言,贝叶斯公式可以扩展如下:

分子中存在一大串似然值。当特征很多的时候,这些似然值的计算是极其痛苦的。现在该怎么办?

2、朴素的概念

为了简化计算,朴素贝叶斯算法做了一假设:“朴素的认为各个特征相互独立”。这么一来,上式的分子就简化成了:

P(C)*P(F1|C)*P(F2|C)...P(Fn|C)。

这样简化过后,计算起来就方便多了。

这个假设是认为各个特征之间是独立的,看上去确实是个很不科学的假设。因为很多情况下,各个特征之间是紧密联系的。然而在朴素贝叶斯的大量应用实践实际表明其工作的相当好。

其次,由于朴素贝叶斯的工作原理是计算P(C=0|F1...Fn)和P(C=1|F1...Fn),并取最大值的那个作为其分类。而二者的分母是一模一样的。因此,我们又可以省略分母计算,从而进一步简化计算过程。

另外,贝叶斯公式推导能够成立有个重要前期,就是各个证据(evidence)不能为0。也即对于任意特征Fx,P(Fx)不能为0。而显示某些特征未出现在测试集中的情况是可以发生的。因此实现上通常要做一些小的处理,例如把所有计数进行+1(加法平滑(additive smoothing,又叫拉普拉斯平滑(Laplace smothing))。而如果通过增加一个大于0的可调参数alpha进行平滑,就叫Lidstone平滑

例如,在所有6个分为C=1的影评样本中,某个特征F1=1不存在,则P(F1=1|C=1)  = 0/6,P(F1=0|C=1)  = 6/6。

经过加法平滑后,P(F1=1|C=1)  = (0+1)/(6+2)=1/8,P(F1=0|C=1)  = (6+1)/(6+2)=7/8。

注意分母的+2,这种特殊处理使得2个互斥事件的概率和恒为1。

最后,我们知道,当特征很多的时候,大量小数值的小数乘法会有溢出风险。因此,通常的实现都是将其转换为log

log[P(C)*P(F1|C)*P(F2|C)...P(Fn|C)] = log[P(C)]+log[P(F1|C)] + ... +log[P(Fn|C)]

将乘法转换为加法,就彻底避免了乘法溢出风险。

为确保掌握朴素贝叶斯分类原理,我们先使用上一篇文章最后的文本向量化结果做一个例子:

上述训练集中共8个样本,其中C=0的3个,C=1的5个。现在,假设给你一个测试样本"nb movie",使用加一平滑进行朴素贝叶斯的分类过程如下:

P(C=0)=3/8, P(C=1)=5/8。特征F1="nb", F2="movie"。

分为C=0的概率:P(F1=1, F2=1|C=0) = P(C=0)*P(F1=1|C=0)*P(F2=1|C=0) = 3/8 * (0+1)/(3+2) * (1+1)/(3+2) = 3/8 * 1/5 * 2/5 = 0.03。

分为C=1的概率:P(F1=1, F2=1|C=1) = P(C=1)*P(F1=1|C=1)*P(F2=1|C=1) = 5/8 * (3+1)/(5+2) * (3+1)/(5+2) = 5/8 * 4/7 * 4/7 = 0.20。

分为C=1的概率更大。因此将该样本分为C=1类。

(注意:实际计算中还要考虑上表中各个值的TF-IDF,具体计算方式取决于使用哪一类贝叶斯分类器。分类器种类见本文最后说明)

3、测试数据

本文使用上一篇博客中提到的康奈尔大学网站的2M影评数据集。每一个特征值就是一个单词的TF-IDF。当然,也可以简单的使用单词出现的次数。

使用这个比较大的数据集,可以做一点点数据预处理的优化来避免每次都去硬盘读取文件。第一次运行时,把读入的数据保存起来,以后就不用每次再去读取了。

[python] view plaincopy

  1. #保存
  2. movie_reviews = load_files('endata')
  3. sp.save('movie_data.npy', movie_data)
  4. sp.save('movie_target.npy', movie_target)
  5. #读取
  6. movie_data   = sp.load('movie_data.npy')
  7. movie_target = sp.load('movie_target.npy')

4、代码与分析

Python代码如下:

[python] view plaincopy

  1. # -*- coding: utf-8 -*-
  2. from matplotlib import pyplot
  3. import scipy as sp
  4. import numpy as np
  5. from sklearn.datasets import load_files
  6. from sklearn.cross_validation import train_test_split
  7. from sklearn.feature_extraction.text import  CountVectorizer
  8. from sklearn.feature_extraction.text import  TfidfVectorizer
  9. from sklearn.naive_bayes import MultinomialNB
  10. from sklearn.metrics import precision_recall_curve
  11. from sklearn.metrics import classification_report
  12. '''''
  13. movie_reviews = load_files('data')
  14. #保存
  15. sp.save('movie_data.npy', movie_reviews.data)
  16. sp.save('movie_target.npy', movie_reviews.target)
  17. '''
  18. #读取
  19. movie_data   = sp.load('movie_data.npy')
  20. movie_target = sp.load('movie_target.npy')
  21. x = movie_data
  22. y = movie_target
  23. #BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口
  24. count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\
  25. stop_words = 'english')
  26. #加载数据集,切分数据集80%训练,20%测试
  27. x_train, x_test, y_train, y_test\
  28. = train_test_split(movie_data, movie_target, test_size = 0.2)
  29. x_train = count_vec.fit_transform(x_train)
  30. x_test  = count_vec.transform(x_test)
  31. #调用MultinomialNB分类器
  32. clf = MultinomialNB().fit(x_train, y_train)
  33. doc_class_predicted = clf.predict(x_test)
  34. #print(doc_class_predicted)
  35. #print(y)
  36. print(np.mean(doc_class_predicted == y_test))
  37. #准确率与召回率
  38. precision, recall, thresholds = precision_recall_curve(y_test, clf.predict(x_test))
  39. answer = clf.predict_proba(x_test)[:,1]
  40. report = answer > 0.5
  41. print(classification_report(y_test, report, target_names = ['neg', 'pos']))

输出结果如下所示:

0.821428571429

precision    recall  f1-score   support

neg       0.78      0.87      0.83       135

pos       0.87      0.77      0.82       145

avg / total     0.83      0.82      0.82       280

如果进行多次交叉检验,可以发现朴素贝叶斯分类器在这个数据集上能够达到80%以上的准确率。如果你亲自测试一下,会发现KNN分类器在该数据集上只能达到60%的准确率,相信你对朴素贝叶斯分类器应该能够刮目相看了。而且要知道,情感分类这种带有主观色彩的分类准则,连人类都无法达到100%准确。

要注意的是,我们选用的朴素贝叶斯分类器类别:MultinomialNB,这个分类器以出现次数作为特征值,我们使用的TF-IDF也能符合这类分布。

其他的朴素贝叶斯分类器如GaussianNB适用于高斯分布(正态分布)的特征,而BernoulliNB适用于伯努利分布(二值分布)的特征。

Python小案例:朴素贝叶斯分类器相关推荐

  1. 朴素贝叶斯分类器python_python实现高斯朴素贝叶斯分类器

    在这篇文章中,我们将使用我最喜欢的机器学习库scikit-learn在Python中实现朴素贝叶斯分类器.接下来,我们将使用经过训练的朴素贝叶斯(监督分类法)模型来预测人口收入. 在朴素贝叶斯分类器的 ...

  2. python机器学习案例系列教程——文档分类器,朴素贝叶斯分类器,费舍尔分类器

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 github地址:https://github.com/626626cdllp/data-mining/tree/master/Bay ...

  3. python 贝叶斯分类器sklearn_Sklearn 中的朴素贝叶斯分类器

    原标题:Sklearn 中的朴素贝叶斯分类器 作者:Martin Müller,翻译:github-sisibeloved https://github.com/xitu/gold-miner/blo ...

  4. 利用Python实现多元伯努利事件的朴素贝叶斯分类器

    前言 本篇博客所写的算法对应于吴恩达教授的机器学习教程里的多元伯努利事件模型的朴素贝叶斯. 多元伯努利事件模型的Python代码 #!/usr/bin/env python # -*- coding: ...

  5. python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类

    很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...

  6. 机器学习之用Python从零实现贝叶斯分类器

    机器学习之用Python从零实现贝叶斯分类器 2015/02/06 · 系列教程 · 13 评论 · 机器学习 分享到:27 本文由 伯乐在线 - Halal 翻译,toolate 校稿.未经许可,禁 ...

  7. 贝叶斯分类器_Sklearn 中的朴素贝叶斯分类器

    (给Python开发者加星标,提升Python技能) 作者:Martin Müller,翻译:github-sisibeloved https://github.com/xitu/gold-miner ...

  8. 机器学习:朴素贝叶斯分类器,决策函数向量化处理,mask使用技巧

    文章目录 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 借助于numpy向量化处理,相当于并行计算,注意mask使用技巧,用途较广: 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 前面提到 ...

  9. 面试前抢救一下--朴素贝叶斯分类器

    写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...

  10. 机器学习实验 - 朴素贝叶斯分类器

    目录 一.报告摘要 1.1 实验要求 1.2 实验思路 1.3 实验结论 二.实验内容 2.1 方法介绍 2.2 实验细节 2.2.1 实验环境 2.2.2 实验过程 2.2.3 实验与理论内容的不同 ...

最新文章

  1. 汇编程序设计与计算机体系结构软件工程师教程笔记:内联汇编与宏
  2. (转载)Linux信息资源
  3. VBA Editor Addins -- VBE插件模板开发众筹
  4. MR案例:CombineFileInputFormat
  5. 得到例会听后感悟_20190507_重和远
  6. 完全编译安装boost
  7. *【CodeForces - 1088 ABC】套题比赛,A水题B模拟C构造D交互
  8. taxtable java_C语言计算个人所得税问题代码及解析
  9. 虚拟机VM10装Mac OS X 10.9.3
  10. php抽奖设置数量,php实现自定义中奖项数和概率的抽奖函数示例
  11. 电化学稳态阻抗谱(EIS)在等效电路已知的情况下进行拟合,python第三方工具包impedance.py
  12. 中国城市生活节奏排行榜
  13. 计算机硬盘有坏道,电脑硬盘有坏道怎么办?
  14. 运行Ubuntu的HP笔记本合上盖子不休眠也不断网
  15. 如何运行PHP文件 /创建PHP项目【基于VScode、XAMPP】超级详细,亲测有效,这一篇就够了
  16. android屏幕旋转生命周期,Activity、Fragment生命周期---横竖屏切换的生命周期
  17. 做为一名大数据新手,如何成为大数据工程师?附上学习路线
  18. MOSFET驱动电路
  19. mencoder和ffmpeg参数详解 (Java处理视频)
  20. 工作中遇到的问题及解决方案

热门文章

  1. AutoCAD单独卸载,不影响其他软件,CAD 2021安装失败,怎么完全彻底卸载删除清理干净CAD 2021各种残留注册表和文件?
  2. mac取消root权限,mac退出root
  3. 【Windows】PowerToys - 微软超强生产力工具
  4. 解决Ubuntu16.04系统中,网络静态ip和DNS设置好了,仍然连接不上外网的原因
  5. 支付宝携手30亿进入刷脸支付市场,“老对手”微信将如何应对?
  6. java深入微服务原理改造房产销售平台,Java深入微服务原理改造房产销售平台
  7. html 1-3-1布局,3.web前端—HTML+CSS布局(1)
  8. matlab中运算符_matlab中的运算符号
  9. 0x80010105: 服务器出现意外情况
  10. 解决redis重启密码失效的问题