最近看了许多关于贝叶斯算法的文章。很多文章在解释这个算法时会列出一大堆公式,这让代数不好的人感到非常头疼。本文打算用通俗易懂的语言来写写这个算法,并做一个例子,以帮助大家理解和运用。
贝叶斯算法是分类问题的重要解决方法。它虽然简单,却很强大。在文本分类领域有重要应用,也在垃圾邮件识别等高维数据(特征超多的数据集)的机器学习领域有重要应用。很多时候我们很容易知晓在不同因变量水平上自变量的分布情况。我们要解决的问题是,在了解特征情况后去预测因变量。其实就是从 P(X|Y),从已知的情况,到去找到 P(Y|X)。朴素贝叶斯算法搭建起了从 P(X|Y)到找到 P(Y|X)的桥梁。
要很好地理解朴素贝叶斯的整个过程,首先需要弄清楚两个方面的东西。其一,是条件概率;其二,是贝叶斯理论。
条件概率和贝叶斯定理
我们先不考虑任何理论,做一个例子:有 100 个人的数据呈现在下表中,这些人按照身份能分成教师和学生两类,按照性别又能分成男性和女性两类。现在我们试着去求出男性中教师的概率是多少(将性别视为特征,把身份视为结局,这个问题就是已知特征求结局的概率的一个问题)。
男性中的教师概率是条件概率,我们并非单纯地求教师的概率,而是先设定了一个条件,即这个人必须是男性。在这种情况下,计算概率的分母会发生改变。
你会如何处理这个问题呢?首先可以直接得知男教师的数量是 12(看表得出),接着用这个数字 12 除以男性的总人数 60(看表得知),这样就能得出 12÷60 = 0.2,也就得到了男性中教师的概率是 0.2。
上面的 12 除以 100 得出 0.12,这是同时为男性又是教师的概率。60 除以 100 得出 0.6,这是数据中男性的概率。我们用 0.12 除以 0.6 得到 0.2 的结果,实际上就是在不自觉地运用下面的公式。
公式中,和male可以互换位置。于是就有
图1
上面这两个公式就是两独立事件计算条件概率时天然满足的:
图2
我们将图1中的公式2带入公式1就得到贝叶斯定理了:
这个贝叶斯定理最重要的作用在于打通了从 P(X|Y) 到找到 P(Y|X) 的路径。
贝叶斯与朴素贝叶斯
我们知道了上面例子中的贝叶斯定理的公式,要将这个公式与实际问题联系起来,还需要进行拓展。
我们把公式中的AB换成XY,于是就有下图:
我们将 x 视为自变量,同时将 y 视为因变量。借助贝叶斯定理,我们成功打通了从 P(X|Y)到 P(Y|X)的路径。这句话需要反复诵读。
现实中,我们收集了一波训练数据,很容易知晓在 y 的不同水平 x 是怎样分布的,就如同上面的例子中能轻易得知教师中男性的比例情况。若把性别当作自变量、身份当作因变量,就能轻易知道 P(X|Y)。通过贝叶斯公式,当 x 分布确定时,可求得 y 取不同水平的概率,就像上面例子中,知道自变量性别为男性时能求得其为教师的概率为 0.2,从而得到 P(Y|X)。
贝叶斯定理能够让我们从自变量的分布出发去预测因变量。 它成功地实现了这一功能。 我们借助贝叶斯定理可以做到从自变量的分布来预测因变量。
现实中存在很多的 x 。我们会考虑直接把多个贝叶斯公式相乘来进行处理。这样做意味着暗含了一个假设,即所有的 x 都是独立的。具有这种朴素假设的贝叶斯就是朴素贝叶斯。
这个名字只是因为它有这么一个朴素的假设:
这么一个简单的假设,能够使这个算法处理许多个 x 的高维数据。它很强大。
成为正规算法之后,就得有一些高大上的名词:
我们将特征视作证据,把因变量视作结局。这样一来,P(Y|X)就被称为后验概率,其含义是在有一组证据的情形下结局的概率,同时也是我们需要预测的感兴趣的事物。
P(X|Y)被称作证据的似然概率,其含义为在某个结局存在的情形下,相应证据出现的概率。
P(Y)叫做先验,意思是某个结局的相应概率。
P(X)被称作证据概率,其含义是指某些特定的特征(即证据)以及这些特征组合所对应的概率。
总结如下:朴素贝叶斯意味着后验概率等于证据似然概率与先验概率相乘后再除以证据概率。
实例
我们现在打算借助 3 个证据的组合,即 x1、x2、x3 来对水果种类进行预测,数据的大概格式呈现为如下这样:
我们需要将这个数据换个格式,这样才能计算朴素贝叶斯算法对应的各种概率。
统共有3个、首先是先验概率:
the‘’ each of the of
首先要计算先验,也就是每种水果的概率。我们可以看到,在 1000 个水果当中,有 800 个是香蕉,300 个是橘子,200 个是其他水果。由此,我们能够得出各种水果的先验分别是 0.8、0.3、0.2。
P(Y 等于)等于 500 除以 1000 等于 0.50;P(Y 等于)等于 300 除以 1000 等于 0.30;P(Y 等于)等于 200 除以 1000 等于 0.20
再是证据概率
of goes in the .
第二步是计算证据的概率,也就是所有特征出现的概率。我们的特征有 3 个,分别是 x1、x2 和 x3。x1 的证据概率为 0.5,x2 的证据概率为 0.65,x3 的证据概率为 0.8。
P(x1 等于 Long)为 500 除以 1000,结果是 0.50;P(x2 等于空)为 650 除以 1000,结果是 0.65;P(x3 等于空)为 800 除以 1000,结果是 0.80。
of of goes in the .
第三步是要计算证据似然的概率。例如,香蕉具有“long”这个特征为真的概率是 P(Long | ),其值为 400/500 = 0.8。
将这三个放入其中,以获得它是一个……的结果。
最后一步是把前三步的结果代入朴素贝叶斯公式,这样就能得到在某组特征下水果分别是香蕉、橘子以及其他水果的概率。比如在特征 long 为真的情况下,水果为香蕉的概率是 0.252,为橘子的概率是 0,为其他水果的概率是 0。
那么这个时候算法就会告诉我们这个水果就是香蕉。
上面是算法的整个过程。细心的同学可能会有疑问,橘子的概率为 0 ,这是因为在所有训练数据中,结局为橘子的个案 long 这个特征没有出现。由于朴素贝叶斯算法涉及相乘,所以导致了结果为 0 。在这个只有 3 个特征的数据集中,这个结果看起来似乎无可厚非,长橘子本身在现实中好像也不存在。但是想象我们面对一个陌生的数据集,这个数据集的特征很多。其实所有特征都对结局有影响。在结局的某个类别中,某个特征为 0 时,算法结果就会排除该类别。这样肯定是不合适的。因为为 0 的特征影响太大了,就相当于某一个特征有了一票否决的权力。
所以需要进行校正。校正的方法被称作,即给每个概率值为零的格子添加一个数(一般是 1),以此来确保不会出现概率为 0 的情况。
实操
理解了背后的逻辑,实操就会变得简单。我们以 iris 数据集为例,其原始数据是这样的:
有 5 个变量,其中 4 个是特征,另外 1 个是结局,这个结局是花的种类,且花的种类有 3 类。针对上述的数据集,我们把它按照 7 比 3 的比例划分成了训练集和测试集。
接着我们运用 klaR 包来开展贝叶斯算法的训练工作,与此同时,利用已经训练好的模型去对测试集数据进行预测,以下是相关代码:
~ ., data=)
pred
得到的 pred 对象即为预测的结果,对于每一个个案,预测模型都会输出成为各个类别应变量的后验概率。
后验概率最大的类别就是最终的模型输出类别。
再得到混淆矩阵,代码如下:
tab , $)
::(tab)
可以看到我们的模型在测试集中的表现较为良好。仅有 2 个案例出现了分类错误。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态