情感分析模型的准确率令人怀疑
Suspiciously high accuracy in sentiment analysis model
我正在使用 NLTK
和 scikitlearn
构建情绪分析模型。我决定测试几个不同的分类器,看看哪个分类器最准确,并最终将它们全部用作产生置信度分数的方法。
用于此测试的数据集都是评论,标记为正面或负面。
我用 5,000 条评论训练了每个分类器,训练了 5 次,使用了 6 个不同(但非常相似)的数据集。每个测试都是用一组新的 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
虽然我知道这些类型的分类器通常可以 return 很好的结果,但这似乎好得令人难以置信。
我需要检查哪些内容以确保其有效?
如果范围从 99.66% 到 81.5%,那就不太好了。
要在文本分类的情况下分析数据集,您可以检查:
- 数据集是否平衡?
- 每个标签的分布词,有时每个标签使用的词汇可能真的不一样。
- Positive/negative,但来源相同?就像之前的观点一样,如果域不同,评论可以使用不同的表达方式来表示正面或负面评论。这有助于在多个来源中获得高精度。
- 尝试使用来自不同来源的评论。
如果你最终获得了那么高的准确率,恭喜!你的 get_features 真的很棒。 :)
我正在使用 NLTK
和 scikitlearn
构建情绪分析模型。我决定测试几个不同的分类器,看看哪个分类器最准确,并最终将它们全部用作产生置信度分数的方法。
用于此测试的数据集都是评论,标记为正面或负面。
我用 5,000 条评论训练了每个分类器,训练了 5 次,使用了 6 个不同(但非常相似)的数据集。每个测试都是用一组新的 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
虽然我知道这些类型的分类器通常可以 return 很好的结果,但这似乎好得令人难以置信。
我需要检查哪些内容以确保其有效?
如果范围从 99.66% 到 81.5%,那就不太好了。
要在文本分类的情况下分析数据集,您可以检查:
- 数据集是否平衡?
- 每个标签的分布词,有时每个标签使用的词汇可能真的不一样。
- Positive/negative,但来源相同?就像之前的观点一样,如果域不同,评论可以使用不同的表达方式来表示正面或负面评论。这有助于在多个来源中获得高精度。
- 尝试使用来自不同来源的评论。
如果你最终获得了那么高的准确率,恭喜!你的 get_features 真的很棒。 :)