我正在使用朴素贝叶斯模型训练一个包含200000条评论的正文和负面评论的语料库,我注意到执行TF-IDF实际上降低了准确性(在50000评论的测试集上测试时)约2%。所以我想知道TF-IDF是否对其使用的数据或模型有任何基本假设,即任何通过使用它来降低准确性的情况?
在某些情况下,TF * IDF的IDF组件可能会损害您的分类准确性。
让我们假设以下人为的,简单的分类任务,为了说明而做:
现在假设在A类中,您有100 000个示例,而在B类中,有1000个示例。
TFIDF会怎样?玉米的逆文档频率将非常低(因为它几乎存在于所有文档中),并且特征“玉米”将获得非常小的TFIDF,这是分类器使用的特征的权重。显然,'玉米'是这项分类任务的最佳特征。这是TFIDF可能降低分类准确性的示例。更笼统地说:
您可以通过适当地执行网格搜索来启发性地确定训练数据上IDF的使用是否会降低您的预测准确性。例如,如果您正在使用sklearn,并且想要确定IDF是否会降低模型的预测准确性,则可以对TfidfVectorizer的use_idf参数执行网格搜索。例如,此代码将在选择IDF时实现gridsearch算法,以便使用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}
据我所知,TF-IDF是一个功能。 TF是术语频率,即文档中出现的频率。 IDF是逆文档频率,即术语出现的文档的频率。
这里,模型使用训练语料库中的TF-IDF信息来估计新文档。举一个非常简单的例子,说一个带有单词bad的文件在训练集中有相当高的单词频率,将情绪标签视为否定。因此,任何包含不良内容的新文档都更有可能是负面的。
为了准确,您可以手动选择包含大多数使用的否定词或正词的训练语料库。这将提高准确性。