朴素贝叶斯和零频问题

6

我认为我已经正确地实现了大部分内容。有一部分让我感到困惑:

零频率问题: 当属性值未与每个类值一起出现时,为每个属性值-类组合(拉普拉斯估计器)的计数添加1。

这是我的一些客户端代码:

//Clasify
string text = "Claim your free Macbook now!";
double posteriorProbSpam = classifier.Classify(text, "spam");
Console.WriteLine("-------------------------");
double posteriorProbHam = classifier.Classify(text, "ham");

现在假设单词“free”在训练数据中出现过。
//Training
classifier.Train("ham", "Attention: Collect your Macbook from store.");
*Lot more here*
classifier.Train("spam", "Free macbook offer expiring.");

但是这个单词只在我的类别为“垃圾邮件”的训练数据中出现,而不是在“正常邮件”中。所以当我计算后验概率 ham 时,当遇到单词 “free” 时该怎么办。
1个回答

6

再加一个原因:朴素贝叶斯模型将 P("free" | spam)P("free" | ham) 视为完全独立的,所以您需要完全独立地估计每个概率的可能性。您正在使用 Laplace 估计器估计 P("free" | spam),公式如下:(count("free" | spam) + 1) / count(spam)P("ham" | spam) 也同样适用。

如果您考虑不添加其中任何一个,那将没有任何意义:在 ham 中看到 "free" 一次将使在 spam 中出现 "free" 的可能性降低。


谢谢。我刚刚编辑了一下,包括我正在遵循的公式。例如P(viagra|Spam),如果训练数据在类别“垃圾邮件”中对于viagra的计数为0,那么我应该加1吗? - Science_Fiction
如果您想使用Laplacian平滑,需要将所有的分子和分母都加1,而不仅仅是零计数。因此,如果您有10个free|spam,5个free|non-spam,50个spam总数,100个non-spam总数,您将估计P(free|spam) = (10+1)/(50+1)P(spam) = (50+1)/(150+1)P(free) = (15+1)/(150+1)。您还可以使用小于1的数字(例如0.1,通常称为“alpha”),因为它对应于在这些概率上使用Dirichlet-alpha分布作为您的prior - Danica
是的,那就是我最终所做的。有时候情况看起来不错,但有时分母的结果可能大于1。根据上面的公式,这很容易发生。 - Science_Fiction
@科幻小说 您是否指的是 P(垃圾邮件 | 单词1,单词2,...) > 1?我可能错了,但我认为不应该发生这种情况...不过,例如 \sum_w P(w | 垃圾邮件) 将会大于1。 - Danica
3
您的问题是因为您的分母不正确:如果将所有计数加一,则分母为count(垃圾邮件)+ v,其中您的词汇表中有v个单词。而不是建议中的count(垃圾邮件)+1:如果这样做,所有单词的总和将大于1。这不会影响决策,但会破坏您尝试计算的任何概率。 - Ben Allison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接