导读
经典机器学习算法中,Naive Bayes可占一席之地,也是唯一一个纯粹的概率分类算法模型。考虑其原理简单却不失强悍性能,Naive Bayes是个人最喜爱的算法之一——当然,另一个是决策树。
贝叶斯其人,据说只是业余数学家
Naive Bayes,中文译作朴素贝叶斯,这里Naive的原义是幼稚的,常常带有一点贬义的味道,用在这个算法命名中翻译为朴素,也称得上是一种包容了。另一个关键词贝叶斯,则是因为朴素贝叶斯算法的主要理论依据是贝叶斯定理,所以本文首先介绍贝叶斯定理,然后引出朴素贝叶斯算法的基本思想和原理。
01 贝叶斯定理
贝叶斯定理一般用于求解后验概率,核心公式为:
其中:
即遍历可能触发B的所有条件Ai,得到其最终的P(B)。
在此基础上,贝叶斯定理常用于解决这样一类场景,这里引用一个经典的贝叶斯条件概率问题:
假设在某居民区, 一种罕见的疾病以1‰的概率传染其他人。该疾病有一种检验方法:若有人传染上了这种病,其检验结果有99%的概率呈阳性;同时此检验也会产生一些虚假的阳性,即未传染的患者有2%的概率也呈阳性。问当前一名居民检验呈阳性,传染该病的真实概率有多大?
在这一问题中,简单对应一下几个概率为:
其中分子的推导即用到全概率公式。带入相应的基础概率值,可以得出在检测为阳性的情况下真实传染的概率仅为4.7%,未传染的概率即为95.3%。
这可能是一个令人大跌眼镜的计算结果,但确实是经过理论计算得出。一个直观的理解是虽然在传染后检测呈阳性的概率很大,但由于传染的基数过小,导致小基数大概率的作用结果未能抵过大基数小概率的影响。
02 朴素贝叶斯算法
在介绍贝叶斯定理的基础上,那么朴素贝叶斯的思想其实已经非常简单:单特征条件下可以应用贝叶斯定理得出不同条件的概率(比如前例中根据检测呈现阳性还是阴性这个特征计算传染和未传染的概率),那么能否根据多维特征来推广这个概率求解公式呢?这就涉及到朴素贝叶斯的一个核心假设:朴素(Naive)!
问题可描述为:
用机器学习语言描述:B1……Bn表示每一列特征取值,A代表分类标签结果。
其中:
那么,为了求出观测特征发生的相对概率大小,则需分别计算P(Ai)和P(B1, B2, …, Bn|Ai)两类概率,其中前者涉及单变量自然比较好求解,难点在于后者。这个概率的求解难度有多大呢?设想一下,假如每个B1……Bn每个事件取值都只有两类,那么对于每个分类标签Ai,要根据数据统计计算的先验概率P(B1, B2, …, Bn|Ai)则有2^n个,这是一个随特征列数指数增长的概率结果,还只是一个分类标签,K个分类标签理论上最多有K*2^n个先验概率。这是一个不可接受的事实。于是,朴素贝叶斯的关键假设浮出水面:假设各特征间相互独立!进而:
于是,K*2^n个先验概率瞬间变为K*2*n个先验概率,即可分别对每列特征Bj求解不同分类标签下的先验概率P(Bj|Ai),其中每个分类标签对应的单特征Bj仅需2个先验概率。这是一个可以接受的计算量。
至此,朴素贝叶斯算法训练的过程实际上就是求解各个先验概率P(Ai)和条件概率P(Bj|Ai)的过程,然后在预测分类过程中则仅需将训练过程中得到的各个概率值代入贝叶斯公式中,即可得到当前特征下的各分类标签的相对概率结果。其中相对概率较大的自然就作为预测结果标签。
朴素贝叶斯算法就是这么简单易懂!
03 几个值得注意的点
朴素贝叶斯算法原理简单,实现起来也不复杂,在某些特定场景下也有着较好的算法性能(例如垃圾邮件识别),但以下几点值得注意:
最后,Naive Bayes中的Naive,难道仅表示各特征列相对独立的这一朴素的假设吗?其实不然!还有另外一层隐藏的含义在于:Naive Bayes还假设各特征对标签预测的重要程度(feature_importance)是一致的!