博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理论 | 朴素贝叶斯模型算法研究与实例分析
阅读量:6213 次
发布时间:2019-06-21

本文共 2715 字,大约阅读时间需要 9 分钟。

( 白宁超 2018年8月31日17: 02:08)

导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果。所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述。然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论、垃圾邮件、个人广告中获取区域倾向等几个方面进行应用,包括创建数据集、数据预处理、词集模型和词袋模型、朴素贝叶斯模型训练和优化等。然后结合复旦大学新闻语料进行朴素贝叶斯的应用。最后,大家熟悉其原理和实现之后,采用机器学习sklearn包进行实现和优化。由于篇幅较长,采用理论理解、案例实现、sklearn优化三个部分进行学习。(本文原创,转载必须注明出处:朴素贝叶斯模型算法研究与实例分析)

朴素贝叶斯理论

朴素贝叶斯概述

朴素贝叶斯是一种构建分类器的简单方法。该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。

特征独立理解的例子:如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。

尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够获取相当好的效果。朴素贝叶斯分类器的一个优势在于只需要根据少量的训练数据估计出必要的参数(变量的均值和方差)。

朴素贝叶斯模型

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别和一个从到 的相关的特征向量,贝叶斯定理阐述了以下关系:

使用简单(naive)的假设-每对特征之间都相互独立:

对于所有的 math: i ,这个关系式可以简化为

由于在给定的输入中 是一个常量,我们使用下面的分类规则:

我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 和 ; 前者是训练集中类别 y 的相对频率。各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 分布时的所做的假设不同。尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。相比于其他更复杂的方法,朴素贝叶斯学习器和分类器非常快。

朴素贝叶斯算法思想

假设有一个数据集,它由两类数据组成,数据分布如下图所示:

我们现在用 表示数据点 (x,y) 属于类别 1(图中用圆点表示的类别)的概率,用 表示数据点 (x,y) 属于类别 2(图中三角形表示的类别)的概率,那么对于一个新数据点 (x,y),可以用下面的规则来判断它的类别:

  • 如果,那么类别为1
  • 如果 ,那么类别为2

也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

朴素贝叶斯工作原理

提取所有文档中的词条并进行去重获取文档的所有类别计算每个类别中的文档数目对每篇训练文档:     对每个类别:         如果词条出现在文档中-->增加该词条的计数值(for循环或者矩阵相加)        增加所有词条的计数值(此类别下词条总数)对每个类别:     对每个词条:         将该词条的数目除以总词条数目得到的条件概率(P(词条|类别))返回该文档属于每个类别的条件概率(P(类别|文档的所有词条))

朴素贝叶斯算法流程

收集数据: 可以使用任何方法。准备数据: 需要数值型或者布尔型数据。分析数据: 有大量特征时,绘制特征作用不大,此时使用直方图效果更好。训练算法: 计算不同的独立特征的条件概率。测试算法: 计算错误率。使用算法: 一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。

朴素贝叶斯优缺点

优点: 在数据较少的情况下仍然有效,可以处理多类别问题。缺点: 对于输入数据的准备方式较为敏感。适用数据类型: 标称型数据。

案例描述:形式化理解朴素贝叶斯性别分类

问题描述

通过一些测量的特征,包括身高、体重、脚的尺寸,判定一个人是男性还是女性。

训练数据

性别 身高(英尺) 体重(磅) 脚的尺寸(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

假设训练集样本的特征满足高斯分布,得到下表:

性别 均值(身高) 方差(身高) 均值(体重) 方差(体重) 均值(脚的尺寸) 方差(脚的尺寸)
男性 5.855 3.5033e-02 176.25 1.2292e+02 11.25 9.1667e-01
女性 5.4175 9.7225e-02 132.5 5.5833e+02 7.5 1.6667e+00

我们认为两种类别是等概率的,也就是P(male)= P(female) = 0.5。在没有做辨识的情况下就做这样的假设并不是一个好的点子。但我们通过数据集中两类样本出现的频率来确定P(C),我们得到的结果也是一样的。

测试数据

以下给出一个待分类是男性还是女性的样本。

性别 身高(英尺) 体重(磅) 脚的尺寸(英尺)
sample 6 130 8

我们希望得到的是男性还是女性哪类的后验概率大。男性的后验概率通过下面式子来求取

女性的后验概率通过下面式子来求取

证据因子(通常是常数)用来对各类的后验概率之和进行归一化.

证据因子是一个常数(在正态分布中通常是正数),所以可以忽略。接下来我们来判定这样样本的性别。

其中 是训练集样本的正态分布参数. 注意,这里的值大于1也是允许的 – 这里是概率密度而不是概率,因为身高是一个连续的变量.

集样本的正态分布参数. 注意,这里的值大于1也是允许的 – 这里是概率密度而不是概率,因为身高是一个连续的变量.

模型预测结果

由于女性后验概率的分子比较大,所以我们预计这个样本是女性。

参考文献

  1. scikit中文社区:
  2. 中文维基百科:
  3. 文本分类特征选择:
  4. GitHub:
  5. 图书:《机器学习实战》

完整代码下载

源码请进【机器学习和自然语言QQ群:436303759】文件下载:

作者声明

本文版权归作者白宁超所有,本文原创,旨在学术和科研使用。文章同步如下:

  • 博客园
  • 我爱自然语言处理
  • 阿里云栖
  • 腾讯云社区
你可能感兴趣的文章
前端埋点统计方案思考
查看>>
RxSwift 基础
查看>>
indexOf封装,查找数组里面是否有这个值(function hasVal(){})?
查看>>
『中级篇』RoutingMesh之Ingress负载均衡(48)
查看>>
分布式计算入门知识
查看>>
10-C++远征之模板篇-学习笔记
查看>>
Android中Button调用getText()的思考
查看>>
Vue之axios请求踩坑记---post请求
查看>>
React-redux基础
查看>>
函数&作用域提升
查看>>
前端常用设计模式(1)--装饰器(decorator)
查看>>
SAP S/4HANA生产订单创建时使用的工厂数据是从什么地方带出来的
查看>>
《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
查看>>
原生js实现全屏滚动--fullPage
查看>>
JavaScript 是如何工作的:模块的构建以及对应的打包工具
查看>>
以太坊是什么?
查看>>
JavaScript对象的几种创建方式?
查看>>
什么是Javascript函数节流?
查看>>
ogg转mp3格式的详情教程
查看>>
腾讯 Tars-Go 服务获取自定义模版(配置)值
查看>>