数据分析、数据挖掘之文档过滤、垃圾邮件

总结:
 模型:  {
            good:{
                    word1:count1,word2:count2,word3:count3,...,wordN:countN
               }
          }
          二维表good word1 word2 ... wordN
 
数据的处理:过滤掉stop词,选取长度在3-20间的,不能选取10%-50%间的热门词
算法的思想
               贝叶斯分类(各个词之间是相互独立的):在列的维度上,根据(某个分类出现word的文档数)/(某个分类的文档数)来计算概率P(Word|Category),然后对文章中词的P(Word|Category)相乘求得Pr(Document|Category),由贝叶斯公式得Pr(Catetory|Document)=Pr(Document|Category)*P(Category)/P(Document)而P(Document)固定,所以Pr(Catetory|Document)=Pr(Document|Category)*P(Category),其中P(Category)是所有文档中出现此分类的概率
               费舍尔方法:根据(某个分类出现word的文档数)/(出现word的文档数)来计算概率P(Category|Word),如果假设在未来收到的各种分类文档是相当的,则效果会更好,因为他能够用更有效的利用每个特征;但是当分类不均匀时,效果较差。
                         然后进行归一化处理,用P(Word|Category1)/(P(Word|Category1)+...+P(Word|CategoryN))来计算P(Word|Category1);同时一篇文章中的各个word不是相互独立的(这么做的好处在于可以复用前面计算P(Word|Category)的方法,因为分子的分母和分母的分母是一样的,最后化简得到P(Word&Category)/P(Word in all Category)
                         然后将文档中的热门词的P(Category|Word)相乘,对乘积取对数,然后乘以(-2),当概率相互独立且随机分布时,将满足对数卡方分布(chi-squared distribution),将得到的数传给倒置对数卡方函数,求得P(Category|Document)
 
解决在训练集特别小时,出现次数少词的敏感问题:
          在当前特征极为有限时,根据假设来做出判断,推荐值为0.5,同时还需给定一个权重,权重为2代表此权重与2个单词相当,在遇到一个新的词时,其条件概率为(1*1+2*0.5)/(1+2)
 
过滤的阀值:
          为了更好的对结果进行筛选,定义一个阀值,当概率超过阀值时才将其归为某一类
 
程序中的结构:
          两个结构:dict{f,{c,num}} dict{c,num}
 
对数卡方函数:
          
def invchi2(chi,df) #chi为对数*-2,df为文档中word的总数
  m=chi/2.0
  sum=term=math.exp(-m)
  for i in range(1, df//2)
    term *= m/i
    sum += term
  return min(sum,1.0)
 

1.应用:垃圾邮件过滤

 
2.数据准备(文档和单词):
     分类器需要根据某些特征对不同的内容进行分类,这里的内容即是文档,特征就是单词
     特征必须具备足够的普遍性,即时常出现,但又没有普遍性,理论上整篇文章的单词可以作为特征,但是除非我们收到内容相同的邮件,否则这样做是没有意义的,简单的提取做法:a.分割文章,取长度在3-20间的词,b.搜集所有在a中的词
 
3.模型构建(对分类器进行训练):
     i.对已经分组的文档机器特征单词,计算每个单词在Good,bad分类中出现的次数cf,每个分类出现的总次数cc
 
     ii.计算概率:
          根据一个单词在一个分类中出现的总次数/分类包含内容项的总次数,计算Pr(word|classfication),即给定一个分类,某个单词的出现概率
 
          问题:如果训练集特别小,那些极少出现的单词会变得异常敏感
          解决方案:在当前特征极为有限时,根据假设来做出判断,推荐值为0.5,同时还需给定一个权重,权重为2代表此权重与2个单词相当,在遇到一个新的词时,其条件概率为(1*1+2*0.5)/(1+2)
 
     iii.朴素贝叶斯分类器:一旦得到单词在一篇属于某个分类的文档中出现的概率后,就需要对各个单词的概率进行组合:
          i.定义:假设将要被组合的各个概率是彼此独立的,一个单词在属于某一指定分类的文档中出现的概率,与其他单词在属于某一指定分类的文档中出现的概率是不相关的
          ii.公式:则整篇文章的概率为其特征单词,在某一指定分类文档中出现概率的乘积,得到Pr(Document|Category),由Pr(Document|Category)计算Pr(Catetory|Document)=Pr(Document|Category)*P(Category)/P(Document)
          公式中P(Document)对于一篇文章来说是固定的,所以可以简化去掉最后得到Pr(Catetory|Document)=Pr(Document|Category)*P(Category),其中P(Category)是所有文档中出现此分类的概率
 
          iii.分类的选择:
               为了避免将普通邮件当成垃圾邮件被处理掉,可以为每个分类定义一个阀值,对于即将划入某一分类的邮件而言,其概率与针对其他所有分类的概率相比,必须大于某一指定的倍数阀值才行
         
4.模型改进(费舍尔方法:针对特征的分类概率):
     i.根据贝叶斯分类器,将所有的Pr(feature|category)组合起来,可以得到当一篇文档中出现某个特证时,该文档属于某个分类的可能性
          Pr(category|feature)=(具有指定特征的属于某分类的文档数)/具有指定特征的文档总数
     
     如果假设”未来将会收到的文档在各个分类中的数量是相当的“,方法将会有更好的表现:
          进行归一化处理:
               a.属于某个分类的概率
               b.属于所有分类的概率之和
               c.a/b得到的值作为Pr(category|feature)
 
     ii.组合特征概率:
     费舍尔方法:所有概率相乘,然后取自然对数,在将结果乘以-2
 
     iii.对内容项进行分类
     通过指定一种分类的下限来为费舍尔方法返回值分类,如bad为0.6,则低于此值且在bad分类中的邮件划分到”未知“类中
 
5.对特征监测的改进:
     

 

posted @ 2017-01-07 10:20  成金之路  阅读(405)  评论(0编辑  收藏  举报