朴素贝叶斯进行垃圾邮件分类原理

条件概率公式:
P ( A ∣ S ) = ∣ A ∩ S ∣ ∣ S ∣ = P ( A ∩ S ) P ( S ) P(A|S)=\dfrac{|A\cap S|}{|S|}=\dfrac{P(A \cap S)}{P(S)} P(AS)=SAS=P(S)P(AS)

推出: P ( A S ) = P ( S ) P ( A ∣ S ) P(AS)=P(S)P(A|S) P(AS)=P(S)P(AS)

P ( a , b ∣ c ) = P ( a , b , c ) P ( c ) = P ( a , b , c ) P ( b , c ) ⋅ P ( b , c ) P ( c ) = P ( a ∣ b , c ) P ( b ∣ c ) o r = P ( b ∣ a , c ) P ( a ∣ c ) \begin{aligned} P(a,b|c) &= \frac{P(a,b,c)}{P(c)}=\frac{P(a,b,c)}{P(b,c)}\cdot \frac{P(b,c)}{P(c)} \\ &= P(a|b,c)P(b|c)\qquad or\\ &= P(b|a,c)P(a|c) \end{aligned} P(a,bc)=P(c)P(a,b,c)=P(b,c)P(a,b,c)P(c)P(b,c)=P(ab,c)P(bc)or=P(ba,c)P(ac)

全概率公式:
样本空间被划分为 B B B B ‾ \overline B B
P ( A ) = P ( A B ) + P ( A B ‾ ) = P ( B ) P ( A ∣ B ) + P ( B ‾ ) P ( A ∣ B ‾ ) P(A) = P(AB)+P(A\overline B) = P(B)P(A|B) + P(\overline B)P(A|\overline B) P(A)=P(AB)+P(AB)=P(B)P(AB)+P(B)P(AB)

B 1 , B 2 , . . . B n B_1,B_2,...B_n B1,B2,...Bn为样本空间S的一个划分(完备事件组),且 P ( B i ) > 0   ( i = 1 , 2 , . . . , n ) P(B_i)>0\,(i=1,2,...,n) P(Bi)>0(i=1,2,...,n),则
对任一事件A,有: P ( A ) = ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(A) = \sum\limits_{i=1}^n P(B_i)P(A|B_i) P(A)=i=1nP(Bi)P(ABi)

贝叶斯定理

由条件概率公式:P(AB)=P(A)P(B|A)=P(B)P(A|B) 推出贝叶斯公式如下:

P ( B ∣ A ) = P ( A ∣ B ) P ( B ) P ( A ) P(B|A)=\dfrac{P(A|B)P(B)}{P(A)} P(BA)=P(A)P(AB)P(B)

分类器中:
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X)=\dfrac{P(X|Y)P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)

P ( 类 别 ∣ 特 征 ) = P ( 特 征 ∣ 类 别 ) P ( 类 别 ) P ( 特 征 ) P(类别|特征)=\dfrac{P(特征|类别)P(类别)}{P(特征)} 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 = 1 n P ( B i ) P ( A ∣ B i ) P(A) = \sum_{i=1}^n P(B_i)P(A|B_i) P(A)=i=1nP(Bi)P(ABi)代入贝叶斯公式,

P ( B i ∣ A ) = P ( A ∣ B i ) P ( B i ) ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(B_i|A)=\dfrac{P(A|B_i)P(B_i)}{\sum_{i=1}^n P(B_i)P(A|B_i)} P(BiA)=i=1nP(Bi)P(ABi)P(ABi)P(Bi)

其中, B 1 , B 2 , . . . B n B_1,B_2,...B_n B1,B2,...Bn为完备事件组,它们之间相互独立。

在事件A已经发生的情况下,贝叶斯公式可以用来寻找导致A发生的各种因素 B i B_i Bi的概率(倒果为因,把发生事件作为X,导致原因作为Y)。

垃圾邮件过滤/分类/识别

假设邮件的内容中包含的词汇为Wi,垃圾邮件Spam,正常邮件ham。 判断一份邮件,内容包含的词汇为Wi,判断该邮件是否是垃圾邮件,即计算P(S|Wi)这个条件概率。
定义

  • P(Y=S): 垃圾邮件在训练数据集中的概率,或者实际调查的垃圾邮件出现的概率(即先验概率);
  • P(Y=H): 正常邮件在训练数据集中的概率,或者实际调查的正常邮件的分布;
  • P ( W i ∣ Y = S ) P(W_i|Y=S) P(WiY=S) : 已知是垃圾邮件时,出现单词Wi的概率;包含单词的Wi的垃圾邮件个数/垃圾邮件总数。
  • P ( W i ∣ Y = H ) P(W_i|Y=H) P(WiY=H) : 正常邮件中,词汇Wi出现的概率;
  • P ( S ∣ W i ) P(S|W_i) P(SWi) : 出现单词Wi的邮件被判定为垃圾邮件的概率;

当拿到一堆邮件并且已知哪些是垃圾邮件后,P(S)和P(H)可以直接得出,
对于邮件中包含的所有单词,统计每个单词出现在垃圾邮件中的次数,出现在正常邮件的次数,那么 P ( W i ∣ Y = S ) P(W_i|Y=S) P(WiY=S) P ( W i ∣ Y = H ) P(W_i|Y=H) P(WiY=H)也就有了,要求的是 P ( S ∣ W i ) P(S|W_i) P(SWi)
根据贝叶斯定理:
   P ( S ∣ W ) = P ( W ∣ S ) ⋅ P ( S ) P ( W ∣ S ) P ( S ) + P ( W ∣ H ) P ( H ) P(S|W)=\dfrac{P(W|S)\cdot P(S)}{P(W|S)P(S)+P(W|H)P(H)} P(SW)=P(WS)P(S)+P(WH)P(H)P(WS)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 ∣ W 1 , … W n ) = P ( W 1 , … W n ∣ S ) P ( S ) P ( W 1 , … W n ) = P ( W 1 ∣ S ) P ( W 2 ∣ S ) … P ( W n − 1 ∣ S ) P ( W n ∣ S ) P ( S ) P ( W 1 ) P ( W 2 ) … P ( W n − 1 ) P ( W n ) P(S|W_1,…W_n)=\dfrac{P(W_1,…W_n|S)P(S)}{P(W_1,…W_n)}=\dfrac{P(W_1|S)P(W_2|S)…P(W_{n-1}|S)P(W_n|S)P(S)}{P(W_1)P(W_2)…P(W_{n-1})P(W_n)} P(SW1,Wn)=P(W1,Wn)P(W1,WnS)P(S)=P(W1)P(W2)P(Wn1)P(Wn)P(W1S)P(W2S)P(Wn1S)P(WnS)P(S)

或者:
P ( S ∣ W 1 , . . . , W n ) = P ( W i , . . . , W n ∣ S ) P ( S ) P ( W i , . . . , W n ∣ S ) P ( S ) + P ( W i , . . . , W n ∣ H ) P ( H ) = P ( W 1 ∣ S ) . . . P ( W n ∣ S ) P ( S ) P ( W 1 ∣ S ) . . . P ( W n ∣ S ) P ( S ) + P ( W 1 ∣ H ) . . . P ( W n ∣ H ) P ( H ) \begin{aligned} P(S|W_1, ... , W_n) &= \frac{P(W_i, ... , W_n|S)P(S)}{P(W_i, ... , W_n|S)P(S) + P(W_i, ... , W_n|H)P(H)} \\ &= \frac{P(W_1|S)...P(W_n|S)P(S)}{P(W_1|S)...P(W_n|S)P(S) + P(W_1|H)...P(W_n|H)P(H)} \end{aligned} P(SW1,...,Wn)=P(Wi,...,WnS)P(S)+P(Wi,...,WnH)P(H)P(Wi,...,WnS)P(S)=P(W1S)...P(WnS)P(S)+P(W1H)...P(WnH)P(H)P(W1S)...P(WnS)P(S)

P ( S ∣ W 1 , … W n ) P(S|W_1,…W_n) P(SW1,Wn)求出之后,就得到一个概率,我们可以自己设置一个阈值,比如说概率大于95%时,认为此邮件为垃圾邮件。
拦截垃圾邮件要在保证准确率的前提下,提高召回率。邮箱服务非常重要,规定邮件是垃圾邮件的概率大于99.9%以上才能定为垃圾邮件进行拦截。在这个前提下,过滤关键词时的阈值 P ( S ′ ∣ W 1 , … W n ) P(S'|W_1,…W_n) P(SW1,Wn)进行变动时,计算召回率和准确率的变动,取准确率满足>99.9%时,召回率最高的过滤阈值。

计算过程存在的问题:

  1. 当词汇不存在时,即ni=0,此时Pr(S|Wi) = 0,会造成P=0,无法比较;
    解决:将所有词汇初始化出现的次数为1,并将分母初始化为2

  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等信息,即保存训练好的最佳模型的信息

朴素贝叶斯分类的优缺点

优点:

  1. 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。
  2. 对大数量训练和查询时具有较高的速度。对项目的训练和分类也仅仅是特征概率的数学运算而已。
  3. 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练
    (即可以实时的对新增的样本进行训练,数据量超出内存时,可以一批批的去增量训练);
  4. 对缺失数据不太敏感,算法也比较简单,常用于文本分类;

缺点:

  1. 朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的。在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  2. 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  3. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

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

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值