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%
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功能中有什么?你有交叉验证吗?是否有测试中的列车实例?顺便说一句,取决于