提高准确性朴素贝叶斯分类器

Posted

技术标签:

【中文标题】提高准确性朴素贝叶斯分类器【英文标题】:Improve accuracy Naive Bayes Classifier 【发布时间】:2017-12-21 07:02:40 【问题描述】:

我编写了一个简单的文档分类器,目前正在布朗语料库上对其进行测试。但是,我的准确率仍然很低(0.16)。我已经排除了停用词。关于如何提高分类器性能的任何其他想法?

import nltk, random

from nltk.corpus import brown, stopwords



documents = [(list(brown.words(fileid)), category)
        for category in brown.categories()
        for fileid in brown.fileids(category)]


random.shuffle(documents)

stop = set(stopwords.words('english'))


all_words = nltk.FreqDist(w.lower() for w in brown.words() if w in stop) 

word_features = list(all_words.keys())[:3000]

def document_features(document):
    document_words = set(document)
    features = 
    for word in word_features:
       features['contains(%s)' % word] = (word in document_words)
    return features

featuresets = [(document_features(d), c) for (d,c) in documents] 

train_set, test_set = featuresets[100:], featuresets[:100]

classifier = nltk.NaiveBayesClassifier.train(train_set)

print(nltk.classify.accuracy(classifier, test_set))

【问题讨论】:

我认为代码版本有问题,在classifier = nltk...之前似乎有两行注释是必需的。顺便说一句,这不使用朴素贝叶斯分类器,而是使用决策树分类器,因此您可能应该更改标签和标题。 您并没有排除停用词,您只是将它们包括在内。更改:all_words = nltk.FreqDist(w.lower for w in brown.words() if w in stop)all_words = nltk.FreqDist(w.lower for w in brown.words() if w not in stop) 【参考方案1】:

我将首先更改第一条评论:

导入语料库文档 = [(list(brown.words(fileid)), category) 到:

documents = [(list(brown.words(fileid)), category) ...

除了像其他答案所说的那样改变 w.lower 之外。

更改此设置并按照下面的这两个链接实现基本的朴素分类器而不删除停用词给了我 33% 的准确度,远高于 16%。 https://pythonprogramming.net/words-as-features-nltk-tutorial/ https://pythonprogramming.net/naive-bayes-classifier-nltk-tutorial/?completed=/words-as-features-nltk-tutorial/

有很多事情你可以尝试看看它是否能提高你的准确性:

1- 去除停用词

2- 删除标点符号

3- 去除最常用词和最不常用词

4- 规范化文本

5- 词干化或词形还原

6- 我认为这个特征集在单词存在时给出 True,如果不存在则给出 False。您可以实现计数或频率。

7- 您可以使用一元、二元和三元或它们的组合。

希望有所帮助

【讨论】:

谢谢,我是 Python 初学者,非常感谢您的帮助【参考方案2】:

如果这真的是你的代码,那么你得到任何东西都是一个奇迹。 w.lower 不是字符串,它是一个函数(方法)对象。您需要添加括号:

>>> w = "The"
>>> w.lower
<built-in method lower of str object at 0x10231e8b8>
>>> w.lower()
'the'

(但谁知道呢。你需要修复你的问题中的代码,它充满了剪切和粘贴错误,谁知道还有什么。下次,帮助我们更好地帮助你。)

【讨论】:

以上是关于提高准确性朴素贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯分类器

朴素贝叶斯分类器的准确性?

朴素贝叶斯文本分类在一个类别中失败。为啥? [关闭]

朴素贝叶斯分类器和判别分析的准确性还差得很远

机器学习——朴素贝叶斯分类器

贝叶斯分类器(3)朴素贝叶斯分类器