第16关 要多朴素有多朴素的朴素贝叶斯 - 小象学院
(点击下方快速 关注 并设为 星标,一起学python吧)
本关内容概述
在这一关我们来看一个新的分类算法,叫作朴素贝叶斯。它是文本分类领域永恒的经典。
只要遇到了文本分类问题, 第一个需要想到的方法就是朴素贝叶斯,在文本分类上它是一个非常靠谱的基准(baseline)。
不要看它简单就瞧不起这东西,其实我们真正需要的就是既简单又有效的模型。
应用场景的引入
我们先来看一封垃圾邮件,如下所示:
如果在邮件里看到了“链接”,“购买”,“最新”等关键词,可以认为这个很可能是个垃圾邮件。其实很多邮件过滤系统就是这么过滤掉垃圾邮件的。
那要不就直接弄一份关键词词库,然后一旦邮件里包含了这些词就认为是垃圾邮件,行不行?
其实这是一个可行的方案,完全可以作为一个基准来对待。但这里的问题是:即便出现了一些广告类单词,但并不一定是垃圾邮件;没有出现任何广告类单词也不一定是正常邮件。所以每个单词虽然有倾向性,但不能以偏概全。
如何把这些不同的单词以概率统计的方式整合在一起,使得我们最后能预测出一个邮件属于垃圾邮件或者正常邮件的概率呢?答案就是朴素贝叶斯!
朴素贝叶斯算法院里
那接下来用一个具体的例子来说明如何使用朴素贝叶斯来做分类吧!
假设我们现在收集到了24封正常邮件和12封垃圾邮件作为训练数据使用。
使用朴素贝叶斯模型一般需要两步:首先,统计出每一个单词对一个邮件成为垃圾邮件或正常邮件的贡献。比如p(“广告”|垃圾), p(“广告”|正常)分别代表在垃圾/正常邮件里出现“广告”这个关键词的概率。其次,用这些统计的结果对一个新的邮件做预测。
在这里,第一步被称为朴素贝叶斯的训练过程,第二步为测试过程。
为了方便起见,我们假设每封邮件都包含10个单词,因此训练数据中,正常邮件一共有240个单词,垃圾邮件一共有120个单词。
很容易得到正常邮件和垃圾邮件出现的概率:
接下来,我们分别统计每个单词在正常邮件和垃圾邮件中出现的频率:
目前为止我们已经算好了每一个单词在不同类别中的概率以及垃圾邮件和正常邮件各自的占比。
统计完这些概率之后,我们又如何把这些信息用来做预测呢?
贝叶斯定理
这里需要用到一个非常著名的定理,叫作贝叶斯定理。我们需要使用贝叶斯定理把上述的条件概率做进一步的分解,最后即可以得出预测的结果。
在介绍贝叶斯定理之前,我们先来复习一下概率中的乘法公式:
。
对乘法公式进行简单地移项变形得到:
这个公式就是贝叶斯公式,它的作用在于,如果我们想要求的值,但又不容易直接得到,通过这个公式,我们可以将其转化为求的值。
比如,将事件定义为给定一封邮件的文本内容,事件定义为该邮件为垃圾邮件,则我们希望能求出的值,即给定一封邮件的内容,该邮件为垃圾邮件的概率。
通过贝叶斯定理,我们将其转化为求 和,这两个概率我们前面已经通过简单的统计方式得到了。
了解完了贝叶斯定理之后,剩下的步骤就比较清晰了,接下来我们用一个完整的例子来演示一下利用朴素贝叶斯算法来预测一封邮件是否为垃圾邮件。
第一步:训练过程
朴素贝叶斯算法的训练过程其实就是做一些简单的统计工作,假设我们已经从数据集中统计出了我们所需要的的概率值如下:
统计完成,则训练完成。
第二步:预测过程
假设我们现在收到了一封新邮件,为了方便起见,假定这封邮件的内容很简单,只有三个词,邮件内容为“最新赚钱方法”。那这封邮件是不是垃圾邮件呢?让我们利用训练的结果来算一算:
该邮件为垃圾邮件的概率:
该邮件为正常邮件的概率:
通过比较这两个概率值的大小就可以判断出该邮件是否为垃圾邮件,也就完成了分类的任务。
我们先分析一下分母,两个概率值的分母是一样的,而且一旦邮件的内容确定,p(“最新赚钱方法”)这个概率值是个常数,因此可以忽略;再来分析一下分子,p(“最新赚钱方法”|垃圾邮件)这个概率该如何计算呢?
p(“最新赚钱方法”|垃圾邮件) 可以抽象成 ,这个概率的计算从数学上来讲其实没什么难度,就是简单的乘法公式:
条件独立假设
但在实际应用中,要得到等号右边这些概率值是非常困难的,为了简化这个计算过程,我们引入一个条件独立的假设,即假设是条件独立的,因此公式可简化如下:
条件独立的假设在前面例子中的含义是假设“最新”、“赚钱”、“方法”这些词之间是相互独立的,换句话说,这个假设并没有考虑单词之间的顺序,考虑的仅仅是每个词出现的频率。
显然,这不是一个严谨的、合理的假设,这也是为什么我们把这个算法说成是“朴素”的原因。尽管如此,这个算法还是在实际中取得了非常不错的效果,成为文本分类领域的一个经典算法。
有了这些铺垫,我们继续完成前面的例子:
好了,所有概率值都已经求解完毕,万事俱备,代入公式中,进行最后的大小比较:
因此,根据朴素贝叶斯算法,我们判断“最新赚钱方法”这封邮件为垃圾邮件。
小结
学到这里,我们来总结一下目前学到的两个重要的知识点:
贝叶斯公式:
其中,是我们对数据集中的正负样本出现概率的统计,也被称为先验概率; 是我们最终想要求得的分类概率,也被称为后验概率。
条件独立假设:
我们假设所有单词之间是相互独立的,从而将复杂的条件概率的计算转换为简单的概率相乘:
拉普拉斯平滑
那么问题来了,这么多的概率进行相乘,是不是会有这样的潜在风险:只要有一个概率值为0,那么整个式子计算的结果就为0了。
想象一下,可能仅仅因为一个单词在训练数据集中没出现过,就导致结果为0,这显然是不合理的。为了避免这种情况的发生,我们介绍一种常用的解决这个问题的方法:拉普拉斯平滑,也叫做加1平滑。
加1平滑,顾名思义,为了避免一个单词的出现次数为0,我们人为的将所有单词出现的次数都将上1。
沿用前面的例子,假如我们垃圾邮件中一共有120个单词,其中不重复的单词有n 个,分别为{“最新”,“赚钱”,“方法”,……},统计如下:
显然,将这n 个单词的概率加起来一定要等于1:
下面我们来引入拉普拉斯平滑的思想处理这些概率值。
请你思考一下,引入拉普拉斯平滑后,我们将上述的词频统计变成如下所示,这样做是否会有问题?
当然有问题!
单纯的在分子上加1,会导致所有的n 个单词的概率加和超过1:
。
怎么办呢?相信你一定已经想到了,我们不仅将分子都加上1,而且将分母都加上n,这样不就解决了么?
好了,以上这就是拉普拉斯平滑的处理方法,是不是很容易理解?
连续性特征的处理
到此为止,我们讨论的朴素贝叶斯模型重点还是放在了文本分类问题上。由于每一个特征是单词,所以可以理解为特征都是离散型的,这也是为什么通过统计次数的方式即可以算出条件概率的主要原因。
那对于朴素贝叶斯模型,有没有可能让它处理连续性特征呢?比如一个人的身高值、温度、年龄?
当然可以!如果特征是连续型的,我们则可以使用高斯分布来描述此条件概率。
高斯分布特别适合表示真实的世界。只要我们观测到足够多的数据,那这些数据通常会服从高斯分布。
比如,我们对全国1万名男性做了身高的测量,那这些测量结果很大程度上会服从高斯分布。当然,参与的人数越多,测量值会越来越逼近高斯分布。这也是为什么我们喜欢通过高斯分布来拟合现实生活中数据的主要原因。
那给定一批数据,我们如何使用高斯分布做拟合呢?
高斯分布的概率密度函数是已知的:
其中,μ表示均值,σ表示标准差,我们需要求出这两个值即可。
我们再回到朴素贝叶斯的话题当中,知道了如何通过高斯分布拟合连续型数据之后,其实已经知道如何处理数据中的连续型特征了。
处理的过程如下:
分别将某个类别中的所有样本收集起来
针对于每一个类别,我们分别拟合出一个独立的高斯分布即可
拟合出分布之后,之后当我们得出每一个条件概率,就可以对任意的输入预测出它的类别了。
好了,高斯朴素贝叶斯我们就谈到这里。
总结起来,朴素贝叶斯本身最适合解决文本分类问题。所以之后遇到任何一个只要跟文本相关的问题,可以尝试使用朴素贝叶斯来解决,至少它可以作为很靠谱的基准。
恭喜你,又完成了一关的学习。是不是发现自己机器学习技能有了明显的提升呢?今天的学习先到这里,拜拜~
1、
2、
3、
(完)
看完本文有收获?
Python家庭
点个 “分享、赞、在看” 和大家一起分享吧