1.7.2 朴素贝叶斯有多“朴素”
贝叶斯定理研究的是条件概率,也就是在特定条件下发生的概率问题。基于这一数学思想,人们提出了一种叫作朴素贝叶斯的算法。
朴素贝叶斯常用于解决分类问题,它的目的是把具有某些特征的样本划分到最可能属于的类别中。也就是说,样本属于哪个类别的概率最大,就认为它属于哪个类别。该算法已经被用在邮件分类、文章分类、情感分析等很多应用场景。以邮件分类为例,算法通过统计邮件内容中单词出现的频率,对邮件做出判断,比如发现了“扫码”“汇款”等特定词高频出现,那么就判断这封邮件疑似垃圾邮件。
既然叫作朴素贝叶斯算法,那它到底“朴素”在哪儿?
使用朴素贝叶斯算法要满足一个基本假设:假定给定目标值的各个特征之间是相互独立的,即条件独立性。举个例子,“鹦鹉会飞”和“鹦鹉会学人说话”这两个短语是条件独立的,因为它们之间没有必然联系。而“鹦鹉会飞”和“鹦鹉是鸟”就不是条件独立的,它们之间具有关联:鹦鹉是鸟,所以它能飞;或者因为鹦鹉会飞,所以它才被叫作鸟。总之,这两个短语彼此影响,“鹦鹉会飞”影响了“鹦鹉是鸟”的结论,“鹦鹉是鸟”又导致了“鹦鹉会飞”,它们不是条件独立的。
朴素贝叶斯算法为何要设置条件独立的前提呢?这是因为,如果每个特征不是相互独立的,在计算条件概率时,就必须把这些特征的所有排列组合都考虑一遍。这样不仅计算量大,还会产生指数级的参数数量,实际执行起来难度很大。
下面我们以文本分类为例,看看朴素贝叶斯算法的具体运作过程。
首先,确定不同特征条件下各类别的出现概率。比如要判断一篇文章是经济类文章还是体育类文章,可以把这个问题转化为:当出现“银行”“贷款”等特定词语时,这篇文章属于经济类的概率更高,还是属于体育类的概率更高?
其次,省略计算全概率。由于只是比较概率大小,因此不必计算每个特征出现的全概率。根据贝叶斯公式,全概率对所有类别都是同样的分母,比较时可以忽略。即,对于任意一篇文章,出现“银行”的概率有多大,含有“贷款”的概率又是多少,可以不必统计。
最后,也是朴素贝叶斯算法最核心的思想:假设各个特征是条件独立的。这样只要计算每个特征的条件概率,然后相乘比较,就能得出结论。就是说,不用考虑文章中“银行”“贷款”这些词语之间是否有关联(实际上它们很可能是有关联的),只要计算每个词语的条件概率即可。在这个例子中,假设待分类的文章中出现过“银行”“贷款”这样的词语。而我们已经有一些经济类和体育类的文章样本,可以事先统计出不同文章出现不同词汇的概率。现在要判断手上这篇文章到底是经济类文章还是体育类文章,可以计算以下两个“分数”。
分数1=(一篇文章是经济类文章的概率)(经济类文章出现“银行”的概率)(经济类文章出现“贷款”的概率)
分数2=(一篇文章是体育类文章的概率)(体育类文章出现“银行”的概率)(体育类文章出现“贷款”的概率)
如果分数1大于分数2,这篇文章就更有可能是经济类文章,反之,则认为它是体育类文章。
当然,运用朴素贝叶斯算法还需要一些“技巧”。比如,算法要避免出现某个概率是0的情况。假设基于手上已有的学习样本,经济类文章恰巧没有出现过“银行”这个词,这时得到的(经济类文章出现“银行”的概率)就是0,这就出了问题,因为只要有0的存在,总得分就一定是0,这会放大不常见单词对结果的影响。因此,有时会为每个词的出现次数设定一个很小的初始值,以防止那些不存在的样本对总体概率造成影响。
针对文本处理,尽管不同单词之间存在联系,每种语言也有它特定的语法规则,但朴素贝叶斯选择忽略这些关联性。这个“朴素”的假设使得计算过程大幅简化,而从实践来看,结论通常不会有过大的偏差。
这就是朴素贝叶斯的“朴素”思想,它人为给了一个非常强的前提假设。由于这一假设,模型包含的条件概率数量大幅减少,朴素贝叶斯算法的预测过程也大为简化。当然,这么做也在一定程度上牺牲了分类准确性。