Python 情绪分析模型的高精度

Python 情绪分析模型的高精度,python,scikit-learn,nltk,sentiment-analysis,Python,Scikit Learn,Nltk,Sentiment Analysis,我正在使用NLTK和scikitlearn构建情绪分析模型。我决定测试几个不同的分类器,以确定哪一个最准确,并最终使用它们作为生成置信度分数的手段 用于该测试的数据集均为综述,标记为阳性或阴性 我使用6个不同(但非常相似)的数据集,对每个分类器进行了5次独立的5000次评测。每项测试都有一组新的5000条评论 我对每个测试和数据集的准确度进行平均,以得出总体平均准确度。看一看: 多项式朴素贝叶斯:91.291% 逻辑回归:96.103% SVC:95.844% 在一些测试中,准确率高达99.

我正在使用
NLTK
scikitlearn
构建情绪分析模型。我决定测试几个不同的分类器,以确定哪一个最准确,并最终使用它们作为生成置信度分数的手段

用于该测试的数据集均为综述,标记为阳性或阴性

我使用6个不同(但非常相似)的数据集,对每个分类器进行了5次独立的5000次评测。每项测试都有一组新的5000条评论

我对每个测试和数据集的准确度进行平均,以得出总体平均准确度。看一看:

  • 多项式朴素贝叶斯:91.291%
  • 逻辑回归:96.103%
  • SVC:95.844%
在一些测试中,准确率高达99.912%。事实上,其中一个数据集的最低平均准确率为81.524%

以下是相关的代码片段:

def get_features(comment, word_features):
    features = {}
    for word in word_features:
        features[word] = (word in set(comment))
    return features

def main(dataset_name, column, limit): 
    data = get_data(column, limit)
    data = clean_data(data)  # filter stop words

    all_words = [w.lower() for (comment, category) in data for w in comment]
    word_features = nltk.FreqDist(all_words).keys()

    feature_set = [(get_features(comment, word_features), category) for
                       (comment, category) in data]

    run = 0
    while run < 5:
        random.shuffle(feature_set)

        training_set = feature_set[:int(len(data) / 2.)]
        testing_set = feature_set[int(len(data) / 2.):]

        classifier = SklearnClassifier(SVC())
        classifier.train(training_set)

        acc = nltk.classify.accuracy(classifier, testing_set) * 100.
        save_acc(acc)  # function to save results as .csv

        run += 1
def get_功能(注释、word_功能):
特征={}
对于word中的word功能:
特征[word]=(集合中的word(注释))
返回特性
def main(数据集名称、列、限制):
数据=获取数据(列、限制)
数据=清除数据(数据)#过滤停止字
all_words=[w.lower()表示注释中的w的数据中的(注释,类别)]
word\u features=nltk.FreqDist(所有单词).keys()
feature_set=[(获取特征(注释、单词特征)、类别)
(注释,类别)在数据中]
运行=0
当运行时间<5时:
随机洗牌(功能集)
训练集=特征集[:int(len(data)/2.)]
测试集合=特征集合[int(len(data)/2.):]
分类器=SklearnClassifier(SVC())
分类器.训练(训练集)
acc=nltk.分类精度(分类器、测试集)*100。
save_acc(acc)#将结果另存为.csv的函数
运行+=1
虽然我知道这类分类器通常可以返回很好的结果,但这似乎有点太好了,不可能是真的


我需要检查哪些内容以确保这是有效的?

如果你得到99,66%到81,5%的范围,那就不太好了

要在文本分类的情况下分析数据集,您可以检查:

  • 数据集是否平衡
  • 为每个标签分配单词,有时每个标签使用的词汇可能真的不同
  • 正/负,但来源相同?就像前面的观点一样,如果领域不同,评论可以使用不同的表达方式进行正面或负面评论。这有助于在多个源中获得高精度
  • 尝试从不同的来源进行评论

如果你得到了那么高的准确度,恭喜!您的get_功能非常好。:)

如果你得到的范围是99,66%到81,5%,那就不太好了

要在文本分类的情况下分析数据集,您可以检查:

  • 数据集是否平衡
  • 为每个标签分配单词,有时每个标签使用的词汇可能真的不同
  • 正/负,但来源相同?就像前面的观点一样,如果领域不同,评论可以使用不同的表达方式进行正面或负面评论。这有助于在多个源中获得高精度
  • 尝试从不同的来源进行评论

如果你得到了那么高的准确度,恭喜!您的get_功能非常好。:)

也许平衡是我的问题。我是否应该确保我的培训数据为50%正面和50%负面?此外,我不清楚关于你的观点2)和3)1)我不清楚该检查什么。是的,建议使用相同数量的样品作为标签。2) 通过正/负和单独的性能(如freqDist)分离数据集,但如果您的get_功能不干净,请检查前n项中的所有内容是否不同。3) 与第2点类似,但用于源。如果推特是来自Twitter、亚马逊、脸谱网等的,在每个词中使用的词都是正负的,也可以考虑其他错误度量,如精度、回忆和F分数,这可以提示你遇到问题。还可以尝试一个简单的基准测试,比如总是说肯定的(或者否定的,取决于你的大班),然后对照ML模型检查他们的分数。@MarcusV。谢谢,我将研究这些。@Tzomas我已经在问题中添加了我的
get\u功能的定义。为什么你说这个函数是获得高精度的决定性因素?它没有做任何特别的事情-当然,它是所选择的分类算法感兴趣?也许平衡是我的问题。我是否应该确保我的培训数据为50%正面和50%负面?此外,我不清楚关于你的观点2)和3)1)我不清楚该检查什么。是的,建议使用相同数量的样品作为标签。2) 通过正/负和单独的性能(如freqDist)分离数据集,但如果您的get_功能不干净,请检查前n项中的所有内容是否不同。3) 与第2点类似,但用于源。如果推特是来自Twitter、亚马逊、脸谱网等的,在每个词中使用的词都是正负的,也可以考虑其他错误度量,如精度、回忆和F分数,这可以提示你遇到问题。还可以尝试一个简单的基准测试,比如总是说肯定的(或者否定的,取决于你的大班),然后对照ML模型检查他们的分数。@MarcusV。谢谢,我将研究这些。@Tzomas我已经在问题中添加了我的
get\u功能的定义。为什么你说这个函数是获得高精度的决定性因素?它没有做任何特殊的事情-当然是所选择的分类算法引起了人们的兴趣?在
get\u功能中有什么?你有交叉验证吗?是否有测试中的列车实例?顺便说一句,取决于