大家都知道贝叶斯定理。朴素贝叶斯就是使用贝叶斯定理进行分类的方法。为什么叫“朴素”呢?因为它简单,英文叫“萌蠢”(naive),会假设个体特征相互独立。不过简单不代表它效果差,在不少分类领域,朴素贝叶斯方法带来的性价比高到惊人。本文通过两个例子简单使用一下朴素贝叶斯方法(NB, naive Bayes)。
贝叶斯定理
非数学专业大一的三门数学课分别是高数、概率、线代。
我们上学,不管你读到多高学历,全日制教育都要一直包含三个学科:数学、英语、哲学
贝叶斯定理很早就出现在概率课程中了,因为它简单。说到条件概率、先验概率等名词,大家应该还都有印象。贝叶斯定理是说条件概率P(Y|X)的曲线求解思路:
病人分类案例
这是网上一个比较简单但是典型的案例。假设今天医院收到6个门诊病人,他们的情况如下:
针状 | 职业 | 疾病 |
---|---|---|
打喷嚏 | 护士 | 感冒 |
打喷嚏 | 农民 | 过敏 |
头疼 | 建筑工人 | 脑震荡 |
头疼 | 建筑工人 | 感冒 |
打喷嚏 | 教师 | 感冒 |
头疼 | 教师 | 脑震荡 |
现在又来了第七个病人,是一个打喷嚏的建筑工人。那么他是因为感冒的概率有多大?也就是求P(感冒|打喷嚏×建筑工人),已知是打喷嚏的建筑工人,那么他感冒的概率。
为了演示,这里数据量很少;实际生活中这么少的数据量是完全得不出结论的。
我们用A表示打喷嚏,B代表建筑工,C代表感冒,直接套用公式:
因为打喷嚏和建筑工人是相互独立的,所以
于是得到
后面这几个概率都可以通过样本直接得到:
因此,结论是这个打喷嚏的建筑工人有66%的可能是感冒。
如果直接看计算过程,这个66%的值是通过
公式编辑由codecogs支持
上面我们认为打喷嚏和建筑工人是相互独立的,这就是朴素贝叶斯和常规贝叶斯的差别:贝叶斯是不能简单认为特征相互独立的,而朴素贝叶斯要求各特征相互独立。
假设个体有F1,F2,...,Fn个特征且相互独立,要看它们是C1,C2,...,Cm这些类别中的哪一类,方法就是通过贝叶斯定理求概率最大的那一类(这就叫分类器)
式子最后边的每一项都可以通过样本统计到,所以结果很容易出来。
所以朴素贝叶斯的分类公式就是类别做为各个特征的条件,求各个特征条件概率的积最后乘以分类的概率
垃圾邮件识别
现在进阶一点,看网上一个对邮件进行分类的例子,识别垃圾邮件和普通邮件。使用朴素贝叶斯分类器的目标值就是P(垃圾邮件∣具有某特征)。假设我们有大量样本已经,然后需要判断包含下面句子的邮件:
我司可办理正规发票(保真)17%增值税发票点数优惠
也就是P(垃圾邮件|我司可办理正规发票(保真)17%增值税发票点数优惠)的概率是不是超过了50%。为了更真实的匹配,我们需要分词后匹配而非整句匹配。
>>> import jieba
>>> text = \'我司可办理正规发票(保真)17%增值税发票点数优惠\'
>>> seg = jieba.cut(text)
>>> \',\'.join(seg)
Building prefix dict from the default dictionary ...
Dumping model to file cache /var/folders/r6/5yk7m_4j7jbbbn30t49pbmtc0000gn/T/jieba.cache
Loading model cost 0.887 seconds.
Prefix dict has been built successfully.
\'我司,可,办理,正规,发票,(,保真,),17%,增值税,发票,点数,优惠\'
>>>
根据自己的意愿去除停用词,比如“可”、标点、数字等,然后假设各词相互独立,不然不能使用朴素贝叶斯方法。套用公式得
里面每一项都可以通过样本得到。
公式编辑由https://www.mathjax.org/提供支持
由于使用了条件独立假设,朴素贝叶斯丢掉了句子中词的关系,“我司可办理正规发票(保真)17%增值税发票点数优惠”和“保真可优惠,我司点数正规,可办理增值税发票”是完全一样的。可是虽然它很傻很天真,商业环境中识别垃圾邮件效果也好得很。
为了提高效率,我们可以继续减少特征词数量。前面我们去掉了停用词,可以进一步只使用关键词,比如“正规”“发票”“优惠”等。
问题
朴素贝叶斯面临的第一个问题是如果因子中有一项是0,会导致整体结果为0,这时候需要用到平滑技术,比如给这一项赋特别小的值。
另一个问题是上面我们说的都是离散特征,如果要根据连续特征,比如长度、宽度、高度等进行分类怎么办?通常需要先计算特征分布。