TF-IDF 向量化器并不比 countvectorizer 好用

数据挖掘 Python scikit-学习
2021-10-13 14:59:36

我正在研究一个有 10 个标签的多标签文本分类问题。数据集很小,总共有 +- 7000 个项目和 +-7500 个标签。我正在使用 python sci-kit learn,结果出现了一些奇怪的东西。作为基线,我开始使用 countvectorizer,实际上计划使用我认为效果更好的 tfidf 矢量化器。但它没有.. 使用 countvectorizer 我得到了高 0.1 的 f1score 的性能。(0.76 对 0.65)

我无法理解为什么会这样?有10个类别,一个叫做杂项。尤其是这个使用 tfidf 的性能要低得多。

有谁知道 tfidf 何时或为什么表现比 count 差?我需要将其正式化为我的论文。

2个回答

有几种可能性。首先,性能存在一些可变性。countvectorizer 的性能优于 tf-idf 可能只是偶然。您是否使用了交叉验证(有多少次折叠)?countvectorizer的优越性能可靠吗?我会比较折叠的性能,以确保 countvectorizer 始终表现更好。

其次,如果您发现 countvectorizer 在您的数据集上可靠地优于 tf-idf,那么我会更深入地研究导致这种效果的词。可能是常用词(将出现在多个文档中的词)有助于区分类别。有大量研究表明,某些虚词(例如第一人称单数代词“I”)的使用会根据某人的心理状态而改变。像代词这样的功能词非常常见,并且在 tf-idf 中会降低权重,但在 countvectorizer 中与稀有词具有相同的权重。我并不是说第一人称单数代词会特别推动你的结果,但值得看看是什么词推动了结果。我会检查在两种类型的模型中哪些词是重要的,countvectorizer 和 tf-idf,然后考虑对 countvectorizer 最重要的词在您的文本文档和标签的上下文中是否有意义。另外,您要删除停用词吗?您还可以看到模型在使用和不使用停用词时的表现,这将是另一种测试常用词是否真的帮助您区分类别的方法。

我很好奇。您使用了哪种算法。在 sklearn 上,据说朴素贝叶斯算法在单词出现时执行。他们补充说,例如 MultinomialNB 可以与 TDIDF 功能之类的比率图一起使用,但似乎不能保证。

我目前正在研究与您的问题类似的问题,并使用 OneVsRestClassfiier 包装分类器(如 SGDClassifier 或 LinearSVC),MultinomialNB 的 TFIDF 功能预测得分为 0!比其他分类器差得多。