Naive Bayes分类器性能出乎意料

时间:2013-12-11 13:31:30

标签: machine-learning

我刚刚开始使用Naive Bayes进行文本分类。我已经从附加的伪代码快照编码了它。

我有两个类,即正面和负面。我总共有2000个样本(IMDB电影评论),其中1800(900正,900负)用于训练分类器,而200(100负,100正)用于测试系统。

它标志着积极的班级文件,但未能对阴性班级文件进行分类。所有属于负类的文件都被错误分类为正类,因此准确率为50%。

如果我个别来自每个班级的文件,如首先测试所有属于负类的文件,然后是阳性测试样本那么它给我100%的准确度,但当我喂它混合测试样品时,它失败并在一个类别中分类(在我的情况下积极)。

我在做什么或在此算法中无法使用? 训练样本是否会减少,训练样本增加后分类器的性能会增加?

我已经使用wekarapid miner测试了相同的样本,两者都提供了更好的准确性。我知道我犯了一个错误,但是我无法抓住它?它是理解中最简单的一个但准确性结果完全出乎意料并让我发疯。这是我的代码算法伪代码。我使用tf-idf生成文档向量用于术语加权,文档向量用于计算。

TrainMultinomialNB(C, D)

1.  V = ExtractVocabulary(D)
2.  N = CountDocs(D)
3.  For each c E C
4.  Do Nc = CountDocsInClass (D, c)
5.  Prior[c] = Nc/N
6.  Textc = ConcatenateTextOfAllDocsInClass (D,c)
7.  For each t E V
8.  Do Tct = CountTokensOfTerm(textc, t)
9.  For each t E V
10. Do condprob[t][c] = (Tct + 1) /(Sum(Tct) + |V|)
11. Return V, prior, condprob

ApplyMultinomialNB(C, V, prior, condprob, d)

1.  W = ExtractTokensFromDoc (V, d)
2.  For each c E C
3.  Do score [c] = log (prior)
4.  For each t E W
5.  Do score [c] + = log (condprob[t][c])
6.  Return argmax(cEC) score [c]

algorithm

1 个答案:

答案 0 :(得分:0)

如果不看真实的代码和数据集,就不容易说出问题所在。然而,我试图概括一些可能的方法来改善朴素的贝叶斯性能。您可能需要通过解析单词边界上的每个文档来减少训练中使用的特征词列表。过滤掉停用词并包含bigram搭配,如此article所示。

另一种可能的方法是Fisher method,其中计算文档中每个特征词的正负概率,然后获得组合概率。

相关问题