我正在尝试使用朴素贝叶斯分类器实现我的第一个垃圾邮件过滤器。我正在使用UCI的机器学习数据存储库(http://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection)提供的数据。该数据是与几千个垃圾邮件和非垃圾邮件(火腿)消息相对应的特征表。因此,我的功能仅限于表格提供的功能。
我的目标是实现一个可以计算P(S | M)的分类器,即给定消息的垃圾邮件概率。到目前为止,我一直在使用以下公式来计算P(S | F),即给定特征的垃圾邮件概率。
P(S|F)= P(F|S)/(P(F|S)+ P(F|H)) 来自http://en.wikipedia.org/wiki/Bayesian_spam_filtering
其中P(F | S)是给出垃圾邮件的特征的概率,P(F | H)是给出火腿的特征的概率。我无法弥补从知道P(S | F)到P(S | M)的差距,其中M是一条消息,而消息只是一包独立的特征。
一眼就看,我想把这些功能加在一起。但这会使大多数数字非常小,我不确定这是否正常。
总之,这些是我现在的问题 1.)如何将一组P(S | F)取为P(S | M)。 2.)一旦计算出P(S | M),我该如何为我的分类器定义一个阈值? 3.)幸运的是我的功能集是为我选择的,我将如何选择或找到我自己的功能集?
我也很感激资源可以帮助我。谢谢你的时间。
答案 0 :(得分:0)
你想使用Naive Bayes:
http://en.wikipedia.org/wiki/Naive_Bayes_classifier
解释它可能超出了这个答案的范围,但基本上你将每个特征的概率乘以一起,并将其乘以先前的垃圾邮件概率。然后重复火腿(即将火腿放在一起的多个特征,并将其乘以火腿的先前概率)。现在你有两个数字可以通过将每个数字除以两者的总和来归一化为概率。这将给你S | M和S | H的概率。再次阅读上面的文章。如果要避免数字下溢,请记录每个条件和先验概率(任何基数)的对数并添加,而不是乘以原始概率。添加日志相当于将原始数字相乘。这不会在最后给你一个概率数字,但是你仍然可以拿一个值较大的那个作为预测类。
您不需要设置阈值,只需按可能性,垃圾邮件或火腿(或以较大的对数可能性为准)对每个实例进行分类。
对此没有简单的答案。使用一袋单词模型对于这个问题是合理的。避免非常罕见(发生在< 5文档中)以及非常频繁的单词,例如,和。停止词列表通常用于删除这些。特征选择算法也可以提供帮助。删除高度相关的功能将有所帮助,尤其是Naive Bayes,它对此非常敏感。