天天看点

朴素贝叶斯算法

我们来约定一下:

S: 邮件为垃圾邮件的概率

V: 邮件含有’viagra’词的概率

贝叶斯会告诉我们已知这个邮件含有viagra词,判断为垃圾邮件的概率:

朴素贝叶斯算法

假设垃圾邮件和非垃圾邮件的概率都是0.5,即:

朴素贝叶斯算法

则通过上面的公式得到:

朴素贝叶斯算法

假设50%的垃圾邮件中有‘vargra’,只有1%的非垃圾邮件中含有这个单词,问这个邮件是垃圾邮件的概率:

朴素贝叶斯算法

可见,含有这个单词一般都是垃圾邮件。

想象一下我们有一堆字母,

朴素贝叶斯算法

,我们使用Xi表示一封信中含有此词的概率。同样,

朴素贝叶斯算法

表示垃圾邮件中含有单词的概率,

朴素贝叶斯算法

,非垃圾邮件中含有单词的概率。贝叶斯估计最大的假设就是单词存在之间没有关系,也就是单词都是独立的,从数学的角度出发,也就是

朴素贝叶斯算法

,这是一个非常大胆的假设,虽然这是一种假设,但这种算法却体现了很好的分类性能。接下来使用贝叶斯理论,则

朴素贝叶斯算法

,这时我们需要计算大量的概率乘积,不过我们可以用log函数来简化,

朴素贝叶斯算法

。 

但有时候会存在除0的状况,我们会使用一个因子k,得到

朴素贝叶斯算法

说完了理论,是不是感觉很空洞,那我们来实现一下吧。首先定义一个方法来得到不同的单词作为集合。

我们第二个方法是统计训练集中单词的个数。返回一个字典,key为单词,value为二元组(垃圾邮件的统计,非垃圾邮件的统计),来查看某单词在垃圾和非垃圾邮件中的个数。

我们下面一步就是计算概率了,返回三元组,包含了每个单词,在垃圾邮件中的概率和非垃圾邮件中的概率。

最后,我们通过这些单词的概率和贝叶斯理论来计算是垃圾邮件的概率:

最后,我们写成一个类:

我们来测试一下我们的分类性能。

朴素贝叶斯算法

下面我们就来测试一下:

这段代码的含义就是将文件夹下面的数据集放在一个data中。

分割成测试集和训练集。

首先分类测试集中的数据,然后检查准确率。在我的机器上,运行结果如下: 

朴素贝叶斯算法

精度为709/(709+28)=0.96,召回率为709/(709+40)=0/95,看起来还是蛮高的。我们有兴趣看看哪些容易被误分类。

最容易被判断为垃圾邮件的非垃圾邮件和垃圾邮件最不容易被判断的邮件。当然了,我们还最想看看垃圾邮件中的单词。

我们打印出来单词,如图:

朴素贝叶斯算法

这些关于含有钱,工作等单词的邮件很可能为垃圾邮件,而其他关于razor,等单词却不是,让我们感到很吃惊。

继续阅读