【发布时间】:2018-02-07 11:21:58
【问题描述】:
我正在使用NLTK 和scikitlearn 构建情绪分析模型。我决定测试几个不同的分类器,看看哪个最准确,并最终将它们全部用作产生置信度分数的方法。
用于此测试的数据集都是评论,标记为正面或负面。
我用 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