朴素贝叶斯测试驱动开发

Posted 机器学习软件工程方法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯测试驱动开发相关的知识,希望对你有一定的参考价值。

朴素贝叶斯测试驱动开发案例

我们知道Foxmail是微信之父张小龙的作品,该软件客户端在设置页面有一项“反垃圾”的设置项,支持使用贝叶斯过滤垃圾邮件。

下文我们简述贝叶斯过滤垃圾邮件的原理和极简版实现。

按TDD的开发模式。开发前需要做3项准备:邮件数据准备、开发工具准备和朴素贝叶斯定理基础知识。

数据准备

原始邮件语料来自公开数据源:

https://spamassassin.apache.org/old/publiccorpus/20030228_easy_ham_2.tar.bz2 https://spamassassin.apache.org/old/publiccorpus/20030228_spam.tar.bz2

内容全部为英文,其中垃圾邮件为500份,正常邮件为1400份。为了专注测试驱动开发贝叶斯邮件分类器,本节已将数据进行清洗,每个文件包含一行邮件正文。其中一份内容示例如下:

lowest rates available for term life insurance take a moment and fill out our online form to see the low rate you qualify for save up to 70 from regular rates smokers accepted http www newnamedns com termlife representing quality nationwide carriers act now to easily remove your address from the list go to http www newnamedns com stopthemailplease please allow 48 72 hours for removal

我们只需读取文件,统计单词,然后实现朴素贝叶斯分类器即可。

测试工具

Python语言内置有断言,也可作为测试的工具之一,例如:

assert 1==2,'断言失败'

书中重点使用unittest包

使用示例如下:

import unittest
t_test = unittest.TestCase()
t_test.assertEqual(1,2,'断言失败')

朴素贝叶斯定理

(1) 条件概率

设事件A:5级大风;事件B:晴天。出现5级大风时是晴天的条件概率表示为式

假设获取到的100天的数据里A出现了5天,则P(A)=0.05,在5天里有一天是晴天则P(A and B)=0.01,所以P(B|A)=0.01/0.05=0.2。这种正向求解的方式又称正向概率.

(2) 朴素贝叶斯

计算条件概率的另一种方式是使用贝叶斯定理,另外一种场景是已知P(B|A),求P(A|B)即求反向概率:已知是晴天,出现5级大风的概率。

假设在100天里,晴天出现了50天,那么P(B)=0.5,带入式(1-4)可求得P(A|B)=0.02。当加入更多的事件,例如,A2表示气温,则问题的求解将变得更复杂,如上述事件概率表示为:P(B|A,A2),P(A,A2|B)。为此我们先看多变量,非独立联合条件概率分布的链式法则:请参考书中的1.4节。

以上是一个通用的表达式,但现实中计算复杂,例如求解P(B|A,A2),按贝叶斯公式得到:

以上不够简化,可以先按贝叶斯和链式法则展开

以上是关于朴素贝叶斯测试驱动开发的主要内容,如果未能解决你的问题,请参考以下文章

使用朴素贝叶斯计算测试数据的概率

朴素贝叶斯(naive bayes)原理小结

如何在 python 的朴素贝叶斯分类器中对用户输入测试集进行分类?

为朴素贝叶斯训练多少文件?

朴素贝叶斯算法——实现自动分类

统计学习方法--朴素贝叶斯法