数据分析、数据挖掘之文档过滤、垃圾邮件
总结:
模型: {
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.对特征监测的改进: