随着ngram长度的增加,Python的Sklearn ngram准确度降低

时间:2017-03-28 14:45:48

标签: python machine-learning scikit-learn

我有一个讨厌的语音数据集,其中包含大约10个标记的推文:它看起来像这样

推文|班级 大家好没有攻击性 你丑陋的布偶|攻击性而非仇恨言论
你****犹太人仇恨言论

现在我试图在SKLearn库的python中使用MultinomialNB分类器,并且继承我的代码。

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

data = pd.read_excel('myfile', encoding = "utf-8")
data = data.sample(frac=1)
training_base = 0;
training_bounds = 10000;
test_base = training_bounds+1;
test_bounds = 12000;
tweets_train = data['tweet'][training_base:training_bounds]
tweets_test = data['tweet'][test_base:test_bounds]
class_train = data['class'][training_base:training_bounds]
class_test = data['class'][test_base:test_bounds]
vectorizer = CountVectorizer(analyzer='word', ngram_range=(1,1))
train_counts = vectorizer.fit_transform(tweets_train.values)

classifier = MultinomialNB()
train_targets = class_train.values
classifier.fit(train_counts, train_targets)
example_counts = vectorizer.transform(tweets_test.values);
predictions = classifier.predict(example_counts) 
accuracy = np.mean(predictions == class_test.values)   
print(accuracy)

使用ngram_range(1,1)时的准确度约为75%,但随着(2,2)到(8,8),它从75,72,67..55%减少。为什么是这样?我错过了什么?

2 个答案:

答案 0 :(得分:4)

你使问题越来越稀疏,从你的测试集中的训练集中找到确切的8个单词序列可能非常困难,因此准确性更差。

我建议混合不同的单词n-gram长度(这就是为什么有两个参数),例如。对于非常短的推文,(1,3)似乎是一个合理的选择。此外,字符n-gram中可能存在一些自然编码更多语言特征的隐藏信息 - 您可以将它们添加到特征空间中。

答案 1 :(得分:1)

基于the scikit-learn documentation for CountVectorizerngram_range(1,1)表示您只使用1克(单个单词),ngram_range(2,2)表示您只需使用2克(对)对于每个ngram_range(x,x)来说,等等。

仅使用2克,特别是仅使用3克,4克等的问题是即使你有足够的单个单词的例子来获得良好的1克准确度,你可能没有足够的例子每2克,当你的n变得更大,这就变成了一个更大的问题。

您是否尝试过增加第二个数字?所以去ngram_range(1,2)看看是否有1克和2克都有帮助。