条件概率公式:
P(A∣S)=∣S∣∣A∩S∣=P(S)P(A∩S)
推出:
P(AS)=P(S)P(A∣S)
P(a,b∣c)=P(c)P(a,b,c)=P(b,c)P(a,b,c)⋅P(c)P(b,c)=P(a∣b,c)P(b∣c)or=P(b∣a,c)P(a∣c)
全概率公式:
样本空间被划分为
B和
B,
P(A)=P(AB)+P(AB)=P(B)P(A∣B)+P(B)P(A∣B)
设
B1,B2,...Bn为样本空间S的一个划分(完备事件组),且
P(Bi)>0(i=1,2,...,n),则
对任一事件A,有:
P(A)=i=1∑nP(Bi)P(A∣Bi)
贝叶斯定理
由条件概率公式:P(AB)=P(A)P(B|A)=P(B)P(A|B) 推出贝叶斯公式如下:
P(B∣A)=P(A)P(A∣B)P(B)
分类器中:
P(Y∣X)=P(X)P(X∣Y)P(Y)
P(类别∣特征)=P(特征)P(特征∣类别)P(类别)
- P(Y)表示Y的先验概率。之所以称为"先验"是因为它不考虑任何X方面的因素。
- P(Y|X),因为P(X|Y)表示假设Y成立时X的概率,而我们想知道的是X发生的情况下Y的可能性,所以称P(Y|X)为Y的后验概率。
- P(X|Y),通常容易直接得出,可以认为是先验的知识。
P(Y|X)随着P(Y)和P(X|Y)的增长而增长,随着P(X)的增长而减少,就是说
如果X独立于Y时被观察到的可能性越大,那么Y对X的支持度越小。
根据全概率公式,把
P(A)=∑i=1nP(Bi)P(A∣Bi)代入贝叶斯公式,
P(Bi∣A)=∑i=1nP(Bi)P(A∣Bi)P(A∣Bi)P(Bi)
其中,
B1,B2,...Bn为完备事件组,它们之间相互独立。
在事件A已经发生的情况下,贝叶斯公式可以用来寻找导致A发生的各种因素
Bi的概率(倒果为因,把发生事件作为X,导致原因作为Y)。
垃圾邮件过滤/分类/识别
假设邮件的内容中包含的词汇为Wi,垃圾邮件Spam,正常邮件ham。 判断一份邮件,内容包含的词汇为Wi,判断该邮件是否是垃圾邮件,即计算P(S|Wi)这个条件概率。
定义
- P(Y=S): 垃圾邮件在训练数据集中的概率,或者实际调查的垃圾邮件出现的概率(即先验概率);
- P(Y=H): 正常邮件在训练数据集中的概率,或者实际调查的正常邮件的分布;
-
P(Wi∣Y=S) : 已知是垃圾邮件时,出现单词Wi的概率;包含单词的Wi的垃圾邮件个数/垃圾邮件总数。
-
P(Wi∣Y=H) : 正常邮件中,词汇Wi出现的概率;
-
P(S∣Wi) : 出现单词Wi的邮件被判定为垃圾邮件的概率;
当拿到一堆邮件并且已知哪些是垃圾邮件后,P(S)和P(H)可以直接得出,
对于邮件中包含的所有单词,统计每个单词出现在垃圾邮件中的次数,出现在正常邮件的次数,那么
P(Wi∣Y=S)和
P(Wi∣Y=H)也就有了,要求的是
P(S∣Wi)。
根据贝叶斯定理:
P(S∣W)=P(W∣S)P(S)+P(W∣H)P(H)P(W∣S)⋅P(S)
就得到了判断一个单词是垃圾邮件的概率。
我们分别计算出P(H|W)和P(S|W),比较它们的大小,就能判断是垃圾邮件还是正常邮件。
由于P(H|W)和P(H|S)的分母是相同的,我们只需要计算和比较分子即可。
考虑准确率和召回率:
https://blog.csdn.net/Gane_Cheng/article/details/53219332
一封邮件是由很多个词构成的,假设每个词是相互独立的,那么这些单词W1,W2,Wn同时出现的情况下,
这封邮件是垃圾邮件的概率:
P(S∣W1,…Wn)=P(W1,…Wn)P(W1,…Wn∣S)P(S)=P(W1)P(W2)…P(Wn−1)P(Wn)P(W1∣S)P(W2∣S)…P(Wn−1∣S)P(Wn∣S)P(S)
或者:
P(S∣W1,...,Wn)=P(Wi,...,Wn∣S)P(S)+P(Wi,...,Wn∣H)P(H)P(Wi,...,Wn∣S)P(S)=P(W1∣S)...P(Wn∣S)P(S)+P(W1∣H)...P(Wn∣H)P(H)P(W1∣S)...P(Wn∣S)P(S)
P(S∣W1,…Wn)求出之后,就得到一个概率,我们可以自己设置一个阈值,比如说概率大于95%时,认为此邮件为垃圾邮件。
拦截垃圾邮件要在保证准确率的前提下,提高召回率。邮箱服务非常重要,规定邮件是垃圾邮件的概率大于99.9%以上才能定为垃圾邮件进行拦截。在这个前提下,过滤关键词时的阈值
P(S′∣W1,…Wn)进行变动时,计算召回率和准确率的变动,取准确率满足>99.9%时,召回率最高的过滤阈值。
计算过程存在的问题:
-
当词汇不存在时,即ni=0,此时Pr(S|Wi) = 0,会造成P=0,无法比较;
解决:将所有词汇初始化出现的次数为1,并将分母初始化为2
-
当P(S|Wi)较小时,连乘操作会造成下溢出问题;
解决:对概率取对数。
Running Adaboost on Naive Bayes
http://web.cecs.pdx.edu/~mm/MachineLearningWinter2010/BoostingNaiveBayes.pdf
http://pages.cs.wisc.edu/~dyer/cs540/handouts/elkan97boosting.pdf
我们在计算ps和ph联合后验概率时,可引入一个调整因子DS,其作用是调整词汇表中某一词汇的“垃圾程度”(spamicity),
ps = sum(testWordsMarkedArray * pWordsSpamicity * DS) + np.log(pSpam)
其中DS通过Adaboost算法迭代获取最佳值。原理如下:
设定adaboost循环的次数count
交叉验证随机选择1000个样本
DS初始化为和词汇列表大小相等的全一向量
迭代循环count次:
设定最小分类错误率为inf
对于每一个样本:
在当前DS下对样本分类
如果分类出错:
计算出错的程度,即比较ps和ph的相差alpha
如果样本原本是spam,错分成ham:
DS[样本包含的词汇] = np.abs(DS[样本包含的词汇] - np.exp(alpha) / DS[样本包含的词汇])
如果样本原本是ham,错分成spam:
DS[样本包含的词汇] = DS[样本包含的词汇] + np.exp(alpha) / DS[样本包含的词汇]
计算错误率
保存最小的错误率和此时的词汇列表、P(Wi|S)和P(Wi|H)、DS等信息,即保存训练好的最佳模型的信息
朴素贝叶斯分类的优缺点
优点:
- 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。
- 对大数量训练和查询时具有较高的速度。对项目的训练和分类也仅仅是特征概率的数学运算而已。
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练
(即可以实时的对新增的样本进行训练,数据量超出内存时,可以一批批的去增量训练);
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类;
缺点:
- 朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的。在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
- 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
- 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
Ref:
https://github.com/MarsPain/NaiveBayesSpamFilter
http://blog.lisp4fun.com/2018/03/09/bayes
https://blog.csdn.net/Gane_Cheng/article/details/53219332
https://www.cnblogs.com/huangyc/p/10327209.html
https://blog.csdn.net/aGreySky/article/details/100745680