机器学习算法实践-朴素贝叶斯(Naive Bayes)

專 欄

❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。

知乎专栏:化学狗码砖的日常

blog:http://ipytlab.com

github:https://github.com/PytLab

前言

上一篇总结了决策树的实现,本文中我将一步步实现一个朴素贝叶斯分类器,并采用SMS垃圾短信语料库中的数据进行模型训练,对垃圾短信进行过滤,在最后对分类的错误率进行了计算。

正文

与决策树分类和k近邻分类算法不同,贝叶斯分类主要借助概率论的知识来通过比较提供的数据属于每个类型的条件概率, 将他们分别计算出来然后预测具有最大条件概率的那个类别是最后的类别。当然样本越多我们统计的不同类型的特征值分布就越准确,使用此分布进行预测则会更加准确。

贝叶斯准则

朴素贝叶斯分类器中最核心的便是贝叶斯准则,他用如下的公式表示:

此公式表示两个互换的条件概率之间的关系,他们通过联合概率关联起来,这样使得我们知道p(B|A)p(B|A)的情况下去计算p(A|B)p(A|B)成为了可能,而我们的贝叶斯模型便是通过贝叶斯准则去计算某个样本在不同类别条件下的条件概率并取具有最大条件概率的那个类型作为分类的预测结果。

使用条件概率来进行分类

这里我通俗的介绍下如何通过条件概率来进行分类,假设我们看到了一个人的背影,想通过他背影的一些特征(数据)来判断这个人的性别(类别),假设其中涉及到的特征有: 是否是长发, 身高是否在170以上,腿细,是否穿裙子。当我们看到一个背影便会得到一个特征向量用来描述上述特征(1表示是,0表示否): ω=[0,1,1,0]

贝叶斯分类便是比较如下两个条件概率:

1、p(男生|ω),ωω 等于 [0,1,1,0] 的条件下此人是男生的概率 2、p(女生|ω),ωω 等于 [0,1,1,0] 的条件下此人是女生的概率 若p(男生|ω)>p(女生|ω), 则判定此人为男生, 否则为女生

那么p(男生|ω) 怎么求呢? 这就要上贝叶斯准则了

根据贝叶斯准则 (知乎的公式不能显示中文的吗 -_-!),

写成好理解些的便是:

如果特征之间都是相互独立的(条件独立性假设),那么便可以将上述条件概率改写成:

这样我们就能计算当前这个背影属于男生和属于女生的条件概率了。

实现自己的贝叶斯分类器

贝叶斯分类器实现起来非常的简单, 下面我以进行文本分类为目的使用Python实现一个朴素贝叶斯文本分类器.

为了计算条件概率,我们需要计算各个特征的在不同类别下的条件概率以及类型的边际概率,这就需要我们通过大量的训练数据进行统计获取近似值了,这也就是我们训练我们朴素贝叶斯模型的过程.

针对不同的文本,我们可以将所有出现的单词作为数据特征向量,统计每个文本中出现词条的数目(或者是否出现某个词条)作为数据向量。这样一个文本就可以处理成一个整数列表,并且长度是所有词条的数目,这个向量也许会很长,用于本文的数据集中的短信词条大概一共3000多个单词。

统计训练的过程的代码实现如下:

注意这里对于基本的条件概率直接相乘有两处改进:

1、各个特征的概率初始值为1,分母上统计的某一类型的样本总数的初始值是1,这是为了避免如果有一个特征统计的概率为0,则联合概率也为零那自然没有什么意义了, 如果训练样本足够大时,并不会对比较结果产生影响. 2、由于各个独立特征的概率都是小于1的数,累积起来必然会是个更小的书,这会遇到浮点数下溢的问题,因此在这里我们对所有的概率都取了对数处理,这样在保证不会有损失的情况下避免了下溢的问题。 获取了统计概率信息后,我们便可以通过贝叶斯准则预测我们数据的类型了,这里我并没有直接计算每种情况的概率,而是通过统计得到的向量与数据向量进行内积获取条件概率的相对值并进行相对比较做出决策的。

进行短信分类

已经构建好了朴素贝叶斯模型,我们就可以使用此模型来统计数据并用来预测了。这里我使用了SMS垃圾短信语料库中的垃圾短信数据, 并随机抽取90%的数据作为训练数据,剩下10%的数据作为测试数据来测试我们的贝叶斯模型预测的准确性。

当然在建立模型前我们需要将数据处理成模型能够处理的格式:

有了上面三个函数我们就可以直接将我们的文本转换成模型需要的数据向量,之后我们就可以划分数据集并将训练数据集给贝叶斯模型进行统计。

训练模型:

剩下我们用测试数据来测试我们贝叶斯模型的预测准确度:

随机测了四组,错误率分别为:0, 0.037, 0.015, 0. 平均错误率为1.3%

测完了我们尝试下看看不同类型短信各个词条的概率分布是怎样的吧:

试试决策树

上一篇我们基于ID3算法实现了决策树,同样是分类问题,我们同样可以使用我们的文本数据来构建用于分类短信的决策树,当然唯一比较麻烦的地方在于如果按照与贝叶斯相同的向量作为数据,则属性可能会非常多,我们在构建决策树的时候每层树结构都是递归通过遍历属性根据信息增益来选取最佳属性进行树分裂的,这样很多的属性可能会对构建决策树这一过程来说会比较耗时.那我们就试试吧…

随机测了两次,错误率分别为:0.09, 0.0

效果还算不错

我们还是用Graphviz可视化看一下决策树都选取了那些词条作为判别标准(这时候决策树的好处就体现出来了)。

可见决策树的深度并不是很深,如果分类类型一多,估计深度增加上去决策树可能会有些麻烦。

总结

本文我们使用Python一步步实现了朴素贝叶斯分类器,并对短信进行了垃圾短信过滤,同样的数据我们同决策树的分类效果进行了简单的比较。本文相关代码实现:https://github.com/PytLab/MLBox/tree/master/naive_bayes。决策树过滤垃圾短信的脚本在https://github.com/PytLab/MLBox/tree/master/decision_tree

参考

1、《Machine Learning in Action》 2、实例详解贝叶斯推理的原理 3、大道至简:朴素贝叶斯分类器

原文发布于微信公众号 - Python中文社区(python-china)

原文发表时间:2017-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【算法】word2vec与doc2vec模型

小编邀请您,先思考: 1 word2vec算法原理是什么? 2 word2vec与doc2vec有什么差异? 3 如何做word2vec和doc2vec? 深度...

6567
来自专栏人工智能

盘点机器学习中那些神奇的损失函数

盘点机器学习中那些神奇的损失函数 这周深圳真的变冷,以前读书的时候,只要天气变到我会冷到哆嗦就知道,快过年了,算算,还有21天,2017就过去了,我在2016年...

3526
来自专栏磐创AI技术团队的专栏

详解谱聚类原理

1903
来自专栏机器之心

教程 | 如何基于TensorFlow使用LSTM和CNN实现时序分类任务

选自burakhimmetoglu 作者:Tom Brander 机器之心编译 参与:蒋思源 时序数据经常出现在很多领域中,如金融、信号处理、语音识别和医药。传...

1.3K7
来自专栏FD的专栏

贝叶斯分类器

贝叶斯决策论是一种基于概率的决策理论。当所有相关的概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

1012
来自专栏机器之心

教程 | 将注意力机制引入RNN,解决5大应用领域的序列预测问题

3614
来自专栏机器之心

学界 | 海康威视联合提出注意力聚焦网络FAN:提升场景文本识别精确度

30412
来自专栏SIGAI学习与实践平台

卷积神经网络的压缩和加速

我们先来看看当前深度学习平台中,卷积层的实现方式,其实当前所有的深度学习平台中,都是以矩阵乘法的方式实现卷积的(如图1左侧):

8358
来自专栏大数据挖掘DT机器学习

面试整理:关于代价函数,正则化

6227
来自专栏mantou大数据

[机器学习Lesson4]多元线性回归

在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自...

72018

扫码关注云+社区