一般来说,TF-IDF 什么时候会降低准确率?
In general, when does TF-IDF reduce accuracy?
我正在使用朴素贝叶斯模型将包含 200000 条评论的语料库训练成正面评论和负面评论,我注意到执行 TF-IDF 实际上降低了准确度(同时对 50000 条评论的测试集进行测试)大约2%。所以我想知道 TF-IDF 是否对它使用的数据或模型有任何潜在的假设,即任何使用它会降低准确性的情况?
TF-IDF据我了解是一个特征。 TF 是术语频率,即文档中出现的频率。 IDF 是逆文档频率,即术语出现的文档频率。
这里,模型使用训练语料库中的 TF-IDF 信息来估计新文档。举一个非常简单的例子,假设一个带有单词 bad 的文档在训练集中单词 bad 的词频很高,将情感标签标记为负面。所以,任何包含坏的新文档都更有可能是负面的。
为了提高准确性,您可以手动 select 训练语料库,其中包含最常用的否定词或肯定词。这将提高准确性。
在某些情况下,TF*IDF 的 IDF 组件可能会损害您的 class化准确性。
假设以下人为的、简单的class化任务,为了说明而制作:
- Class A:包含单词 'corn'
的文本
- Class B:不包含单词 'corn'
的文本
现在假设在 Class A 中有 100 000 个示例,在 class B 中有 1000 个示例。
TFIDF 会怎样? corn的逆向文档频率会很低(因为它几乎在所有文档中都有),特征'corn'会得到一个非常小的TFIDF,这是[=37=使用的特征的权重] 器。显然,'corn' 是这个 classification 任务的最佳特征。这是一个 TFIDF 可能会降低您的 class 化准确性的示例。更笼统地说:
- 当存在 class 不平衡时。如果你在一个 class 中有更多的实例,频繁 class 的好词特征可能具有较低的 IDF,因此它们的最佳特征将具有较低的权重
- 当您的高频词非常能预测其中一个 classes(在该 class 的大多数文档中找到的词)
您可以通过适当地执行网格搜索来启发式地确定对训练数据使用 IDF 是否会降低您的预测准确性。
例如,如果您在 sklearn 中工作,并且想要确定 IDF 是否会降低模型的预测准确性,则可以对 TfidfVectorizer 的 use_idf 参数执行网格搜索。
例如,此代码将在选择 IDF 时实现网格搜索算法以使用 SGDClassifier 进行分类(您必须先导入所有实例化的对象):
# 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}
我正在使用朴素贝叶斯模型将包含 200000 条评论的语料库训练成正面评论和负面评论,我注意到执行 TF-IDF 实际上降低了准确度(同时对 50000 条评论的测试集进行测试)大约2%。所以我想知道 TF-IDF 是否对它使用的数据或模型有任何潜在的假设,即任何使用它会降低准确性的情况?
TF-IDF据我了解是一个特征。 TF 是术语频率,即文档中出现的频率。 IDF 是逆文档频率,即术语出现的文档频率。
这里,模型使用训练语料库中的 TF-IDF 信息来估计新文档。举一个非常简单的例子,假设一个带有单词 bad 的文档在训练集中单词 bad 的词频很高,将情感标签标记为负面。所以,任何包含坏的新文档都更有可能是负面的。
为了提高准确性,您可以手动 select 训练语料库,其中包含最常用的否定词或肯定词。这将提高准确性。
在某些情况下,TF*IDF 的 IDF 组件可能会损害您的 class化准确性。
假设以下人为的、简单的class化任务,为了说明而制作:
- Class A:包含单词 'corn' 的文本
- Class B:不包含单词 'corn' 的文本
现在假设在 Class A 中有 100 000 个示例,在 class B 中有 1000 个示例。
TFIDF 会怎样? corn的逆向文档频率会很低(因为它几乎在所有文档中都有),特征'corn'会得到一个非常小的TFIDF,这是[=37=使用的特征的权重] 器。显然,'corn' 是这个 classification 任务的最佳特征。这是一个 TFIDF 可能会降低您的 class 化准确性的示例。更笼统地说:
- 当存在 class 不平衡时。如果你在一个 class 中有更多的实例,频繁 class 的好词特征可能具有较低的 IDF,因此它们的最佳特征将具有较低的权重
- 当您的高频词非常能预测其中一个 classes(在该 class 的大多数文档中找到的词)
您可以通过适当地执行网格搜索来启发式地确定对训练数据使用 IDF 是否会降低您的预测准确性。 例如,如果您在 sklearn 中工作,并且想要确定 IDF 是否会降低模型的预测准确性,则可以对 TfidfVectorizer 的 use_idf 参数执行网格搜索。 例如,此代码将在选择 IDF 时实现网格搜索算法以使用 SGDClassifier 进行分类(您必须先导入所有实例化的对象):
# 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}