第 1 周任务
分类问题:K-邻近算法
分类问题:决策树
第 2 周任务
分类问题:朴素贝叶斯
分类问题:逻辑回归
第 3 周任务
分类问题:支持向量机
第 4 周任务
分类问题:AdaBoost
第 5 周任务
回归问题:线性回归、岭回归、套索方法、逐步回归等
回归问题:树回归
第 6 周任务
聚类问题:K均值聚类
相关问题:Apriori
第 7 周任务
相关问题:FP-Growth
第 8 周任务
简化数据:PCA主成分分析
简化数据:SVD奇异值分解
文章目录
1.简介
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 。
最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
1.1.贝叶斯定理
条件概率 (conditional probability) 是指在事件 B 发生的情况下,事件 A 发生的概率。通常记为 P(A | B)。
因此
可得
由此可以推出贝叶斯公式
这也是条件概率的计算公式。
此外,由全概率公式,可得条件概率的另一种写法
其中样本空间由A和A’构成,由此求得事件B的概率。
1.2.贝叶斯推断
贝叶斯公式中,P(A)称为"先验概率"(Prior probability),即在B事件发生之前,对A事件概率的一个判断。
P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,对A事件概率的重新评估。
P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
所以,条件概率可以理解成下面的式子:后验概率=先验概率 x 调整因子
这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。因为在分类中,只需要找出可能性最大的那个选项,而不需要知道具体那个类别的概率是多少,所以为了减少计算量,全概率公式在实际编程中可以不使用。
而朴素贝叶斯推断,是在贝叶斯推断的基础上,对条件概率分布做了条件独立性的假设。因此可得朴素贝叶斯分类器的表达式。因为以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
1.3.模型概述
朴素(指特征条件独立)贝叶斯方法,是指根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是
在这里,x是一个特征向量,将设x维度为M。因为朴素的假设,即特征条件独立,根据全概率公式展开,公式(1)可以表达为
这里,只要分别估计出,特征xi在每一类的条件概率就可以了。类别y的先验概率可以通过训练集算出,同样通过训练集上的统计,可以得出对应每一类上的,条件独立的特征对应的条件概率向量。
1.4.举个栗子~
某个医院早上来了六个门诊的病人,他们的情况如下表所示:
症状 | 职业 | 疾病 |
---|---|---|
打喷嚏 | 护士 | 感冒 |
打喷嚏 | 农夫 | 过敏 |
头痛 | 建筑工人 | 脑震荡 |
头痛 | 建筑工人 | 感冒 |
打喷嚏 | 教师 | 感冒 |
头痛 | 教师 | 脑震荡 |
问:现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
根据贝叶斯定理:
P ( 感 冒 ∣ 打 喷 嚏 ∗ 建 筑 工 人 ) = P ( 打 喷 嚏 ∗ 建 筑 工 人 ∣ 感 冒 ) P ( 打 喷 嚏 ∗ 建 筑 工 人 ) P(感冒|打喷嚏*建筑工人)=\frac{P(打喷嚏*建筑工人|感冒)}{P(打喷嚏*建筑工人)} P(感冒∣打喷嚏∗建筑工人)=P(打喷嚏∗建筑工人)P(打喷嚏∗建筑工人∣感冒)
根据朴素贝叶斯条件独立性的假设可知,"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了
P ( 感 冒 ∣ 打 喷 嚏 ∗ 建 筑 工 人 ) = P ( 打 喷 嚏 ∣ 感 冒 ) ∗ P ( 建 筑 工 人 ∣ 感 冒 ) ∗ P ( 感 冒 ) P ( 打 喷 嚏 ∗ 建 筑 工 人 ) P(感冒|打喷嚏*建筑工人)=\frac{P(打喷嚏|感冒)*P(建筑工人|感冒)*P(感冒)}{P(打喷嚏*建筑工人)} P(感冒∣打喷嚏∗建筑工人)=P(打喷嚏∗建筑工人)P(打喷嚏∣感冒)∗P(建筑工人∣感冒)∗P(感冒)
通过计算得出
P ( 感 冒 ∣ 打 喷 嚏 ∗ 建 筑 工 人 ) = 0.66 ∗ 0.33 ∗ 0.5 0.5 ∗ 0.33 = 0.66 P(感冒|打喷嚏*建筑工人)=\frac{0.66*0.33*0.5}{0.5*0.33}=0.66 P(感冒∣打喷嚏∗建筑工人)=0.5∗0.330.66∗0.33∗0.5=0.66
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。
这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。
同样,在编程的时候,如果不需要求出所属类别的具体概率,P(打喷嚏) = 0.5和P(建筑工人) = 0.33的概率是可以不用求的。
2. 动手实战
2.1. 项目案例1:屏蔽社区留言板的侮辱性言论
项目概述
为了不影响社区的发展,我们要屏蔽侮辱性的言论,所以要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标志为内容不当。过滤这类内容是一个很常见的需求。对此问题建立两个类型:侮辱类和非侮辱类,使用1和0分别表示。
开发流程
我们把文本看成单词向量或者词条向量,也就是说将句子转换为向量。考虑出现所有文档中的单词,再决定将哪些单词纳入词汇表或者说所要的词汇集合,然后必须要将每一篇文档转换为词汇表上的向量。简单起见,我们先假设已经将本文切分完毕,存放到列表中,并对词汇向量进行分类标注。编写代码如下:
"""
函数说明:创建实验样本
Parameters:
无
Returns:
postingList - 实验样本切分的词条
classVec - 类别标签向量
"""
def loadDataSet():
postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #切分的词条
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'