【问题标题】:Suspiciously high accuracy in sentiment analysis model情感分析模型的准确度令人怀疑
【发布时间】:2018-02-07 11:21:58
【问题描述】:

我正在使用NLTKscikitlearn 构建情绪分析模型。我决定测试几个不同的分类器,看看哪个最准确,并最终将它们全部用作产生置信度分数的方法。

用于此测试的数据集都是评论,标记为正面或负面。

我用 5000 条评论、5 次不同的时间、6 个不同(但非常相似)的数据集训练了每个分类器。每项测试都使用一组新的 5000 条评论。

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

  • 多项朴素贝叶斯:91.291%
  • 逻辑回归:96.103%
  • SVC:95.844%

在一些测试中,准确率高达 99.912%。事实上,其中一个数据集的最低平均准确率为 81.524%。

下面是相关代码sn-p:

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

虽然我知道这类分类器通常可以返回很好的结果,但这似乎有点好得令人难以置信。

我需要检查哪些内容以确保其有效?

【问题讨论】:

  • get_features 中有什么内容?您是否交叉验证了 scikit-learn.org/stable/modules/cross_validation.html ?是否有 train 正在测试的实例?
  • 顺便说一句,根据最终的应用程序,96% 可能没有你想象的那么好。想象一下,100 人中有 4 人死亡。然后乘以一个因子,在 10,000 人中,有 400 人死亡。然后再次平方,在 100,000,000 人中,有 400,000 人死于您的算法。
  • @alvas 我确保测试数据不包含训练数据的实例。在做了一些检查之后,我最大的问题是训练和测试数据都太不平衡了!我的 get_data 方法返回的数据为 80% pos 和 20% neg。我已经解决了这个问题,现在准确度较低。
  • 一个愚蠢的基线是对所有行使用 1 个标签。

标签: python scikit-learn nltk sentiment-analysis


【解决方案1】:

如果你得到一个从 99.66% 到 81.5% 的范围,那就不是很好了。

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

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

如果您毕竟获得了如此高的准确度,那么恭喜!你的 get_features 真的很好。 :)

【讨论】:

  • 也许平衡是我的问题。我应该确保我的训练数据是 50% 正面和 50% 负面吗?我也不清楚关于你的观点 2) 和 3) 需要检查什么
  • 1) 是的,建议标签的样本数量相同。 2)通过正面/负面和单独的性能(如freqDist)分离数据集,但使用您的get_features不清除的单词,检查前n个是否都不同。 3) 与第 2 点类似,但针对来源。如果评论来自 twitter、amazon、facebook 等。是否每个评论都使用相同的词来表示正面/负面=
  • 还要考虑其他错误指标,例如精度、召回率和 F-Score,它们可以提示您发现问题。还可以尝试一个简单的基准测试,例如总是说正面(或负面,取决于你的大班),然后对照 ML 模型检查他们的分数。
  • @MarcusV。谢谢,我会调查的。
  • @Tzomas 我已将get_features 的定义添加到问题中。为什么你说这个功能是获得高精度的决定性因素?它没有做任何特别的事情 - 肯定是感兴趣的所选分类算法?
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多