Yangli's Blog About
机器学习:朴素贝叶斯分类器(二)
Posted by Yang Li, , 0 comments.

回顾

上一篇中,得到了朴素贝叶斯分类器的表达式

应用

朴素贝叶斯分类器广泛应用于垃圾邮件的检测中,这里就以垃圾邮件的检测作为例子。

这是一个二元分类问题:

假设用以下特征来识别垃圾邮件:

  • $ f_1 $: 单词 sale 在正文中出现的次数
  • $ f_2 $: 单词 drug 在正文中出现的次数
  • $ f_3 $: 邮件头部是否有 DKIM 签名

训练数据如下:

特征 正常邮件 垃圾邮件
$ f_1=0 $ 81 1
$ f_1=1 $ 9 5
$ f_1=2 $ 0 3
$ f_1=4 $ 0 1
邮件总数 90 10
$ f_2=0 $ 90 8
$ f_2=4 $ 0 1
$ f_2=5 $ 0 1
邮件总数 90 10
$ f_3=0 $ 3 8
$ f_3=1 $ 87 2
邮件总数 90 10

在这里,用最大似然估计的方法来估计参数,即

其中,$ M $ 为样本总数,$ M_C $ 为属于分类 $ C $ 的样本数,$ M_{F_i \cap C} $ 为属于分类 $ C $, 且特征 $ f_i = F_i $ 的样本数。例如:

现在又一封新邮件, 特征为 $ (f_1=1, f_2=0, f_3=0) $. 我们就可以求得

因为

所以判定

即这封新邮件不是垃圾邮件。

实现细节

在这里,有一个问题:在使用最大似然估计时,先验概率 $ p(f_i | c) $ 中会出现等于 0 的项。一旦某个特征 $ p(f_i | c) = 0 $, 那么整个 $ \prod_{i=0}^{N} p(f_i | c) $ 都将为 0. 这就使得其它特征都失去了作用。

为了避免这个问题,需要对 $ p(f_i | c) $ 做 Laplace Smoothing.

其中, $ N $ 是特征的数量。

在实际的应用中,特征的数量 $ n $ 可能非常大,可能有几百个、几千个。由于 $ 0 \le p(f_i | c) \le 1 $, 在计算机中计算 $ \prod_{i=0}^{N}\,p(f_i | c) $ 很可能发生浮点数下溢出。为了解决这个问题,当特征的取值为正数时,常常对其取对数。由于 $ \log(ab) = \log(a) + \log(b) $, 这个变换可以解决下溢出的问题。又因为对数函数是单调函数,这个变换不影响其最值点。因此,在实际实现中,常用的方法是

这种用来处理特征为离散值的分类器,称为多项朴素贝叶斯分类器 (Multinomial Naive Bayes Classifier). 这种分类器被广泛应用在文本的分类中,如:识别垃圾邮件,判定新闻类别。

参考资料

知识共享许可协议本作品由Yang Li创作,采用知识共享Attribution-NoDerivatives 4.0 国际许可协议进行许可。