一般来说,TF-IDF何时会降低准确度?

时间:2016-08-25 18:18:28

标签: sentiment-analysis tf-idf text-classification naivebayes

我使用Naive Bayes模型训练一个包含200000条评论的正文和负面评论的语料库,我注意到执行TF-IDF实际上降低了准确性(在50000条评论的测试集上进行测试) 2%。所以我想知道TF-IDF是否对其使用的数据或模型有任何基本假设,即任何通过使用它来降低准确性的情况?

3 个答案:

答案 0 :(得分:5)

在某些情况下,TF * IDF的IDF组件可能会损害您的分类准确性。

让我们假设以下人为的,简单的分类任务,为了说明而制作:

  • A类:包含“玉米”一词的文字
  • B类:不含“玉米”一词的文字

现在假设在A类中,您有100 000个示例,在B类中有1000个示例。

TFIDF会怎样?玉米的逆文档频率将非常低(因为它几乎存在于所有文档中),并且特征“玉米”将获得非常小的TFIDF,这是分类器使用的特征的权重。显然,'玉米'是这项分类任务的最佳特征。这是TFIDF可能降低分类准确性的示例。用更一般的术语来说:

  • 当班级不平衡时。如果你在一个班级中有更多的实例,频繁类别的好词特征具有较低的IDF,因此他们的最佳功能将具有较低的权重
  • 当你有高频率的单词时,可以预测其中一个类(在该类的大多数文档中找到的单词)

答案 1 :(得分:1)

您可以通过适当地执行网格搜索来启发式确定在训练数据上使用IDF是否会降低预测准确性。 例如,如果您正在使用sklearn,并且要确定IDF是否会降低模型的预测精度,则可以对TfidfVectorizer的use_idf参数执行网格搜索。 例如,此代码将在选择IDF以便使用SGDClassifier进行分类时实现gridsearch算法(您必须先导入所有要实例化的对象):

# import all objects first
X = # your training data
y = # your labels

pipeline = Pipeline([('tfidf',TfidfVectorizer()),
                     ('sgd',SGDClassifier())])
params = {'tfidf__use_idf':(False,True)}
gridsearch = GridSearch(pipeline,params)
gridsearch.fit(X,y)
print(gridsearch.best_params_)

输出将是:

Parameters selected as the best fit:
{'tfidf__use_idf': False}

{'tfidf__use_idf': True}

答案 2 :(得分:0)

据我所知,TF-IDF是一个功能。 TF是术语频率,即文档中出现的频率。 IDF是逆文档频率,即术语出现的文档的频率。

这里,模型使用训练语料库中的TF-IDF信息来估计新文档。举一个非常简单的例子,说一个带有单词bad的文件在训练集中有相当高的单词频率,将情绪标签视为否定。因此,任何包含不良内容的新文档都更有可能是负面的。

为了准确,您可以手动选择包含大多数使用的否定或正面词语的训练语料库。这将提高准确性。