我正在使用python中的朴素贝叶斯分类器进行文档分类项目。我已经使用了nltk python模块。这些文档来自路透社的数据集。我执行了预处理步骤,例如词干和删除词,并继续计算索引词的tf-idf。我使用这些值来训练分类器,但准确性很差(53%)。我该怎么做才能提高准确度?
答案 0 :(得分:1)
可能有所帮助的几点:
您还可以找到其他加权技术,例如log(1 + TF) * log(IDF)
,以提高准确性。祝你好运!
答案 1 :(得分:0)
分类器不起作用可能有很多原因,并且有很多方法可以调整它。
所以问题相当广泛。也许如果您提供更多详细信息您可以获得更多相关建议。
答案 2 :(得分:0)
如果您使用的是nltk朴素贝叶斯分类器,那么您实际上可能正在使用平滑的多变量bernoulli 朴素贝叶斯文本分类。如果您的特征提取函数映射到所有浮点值的集合(这听起来可能就是这样),这可能是一个问题 你使用tf-idf)而不是所有布尔值的集合。
如果你的特征提取器返回tf-idf值,那么我认为nltk.NaiveBayesClassifier将检查它是否为真
tf-idf(word1_in_doc1) == tf-idf(word1_in_class1)
而不是任何适合tf-idf的连续分布的适当问题。
这可以解释您的准确性低,特别是如果您的训练集中有53%的时间出现一个类别。
您可能想查看scikit-learn中实现的多项式朴素贝叶斯分类器。
有关多项和多元伯努利分类器的更多信息,请参阅this very readable paper。
答案 3 :(得分:0)
与Maus所说的一样,NLTK朴素贝叶斯(NB)使用伯努利模型加平滑来控制特征条件概率== 0(对于训练中分类器未见的特征)平滑的常用技术是拉普拉斯平滑你在条件概率的分子上加1,但我相信NLTK在分子上加0.5 .NLTK NB模型使用布尔值并根据它计算其条件,所以使用tf-idf作为一个特征不会产生好的或甚至有意义的结果。
如果你想留在NLTK内,那么你应该使用单词本身作为功能和双字母。查看Jacob Perkins关于使用NB在NLTK中进行文本处理的文章:http://streamhacker.com/tag/information-gain/。本文非常好地解释和演示了您可以对数据进行预处理的一些事项;它使用来自NLTK的电影评论语料库进行情感分类。
还有另一个用于文本处理的模块Python,称为scikit-learn,其中包含各种NB模型,如Multinomial NB,它使用每个单词的频率而不是每个单词的出现来计算其条件概率。
以下是关于NB以及Multinomial和Bernoulli模型如何工作的一些文献: http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html;使用网页上的上一个/下一个按钮浏览文献。