使用 TF-IDF 测试和训练具有不同数量特征的集

Posted

技术标签:

【中文标题】使用 TF-IDF 测试和训练具有不同数量特征的集【英文标题】:Testing and Training sets with different number of features using TF-IDF 【发布时间】:2017-11-26 11:12:06 【问题描述】:

我正在做一个简单的二进制分类,我给你一个我遇到的问题的例子:假设我们有 n 个文档(Doc 1、Doc 2、...、Doc n。)我们将使用 TF-IDF 作为特征值来训练使用词袋的二元分类器。我们的训练文件有 m 个特征(从技术上讲,m 是我们在清理和预处理之后在所有这 n 个文档中拥有的唯一标记的数量)。

现在,假设我们有一个训练有素的模型,我们要预测一个新文档的标签。我们应该首先像处理训练文档一样预处理测试文档。然后,我们应该使用 TF-IDF 为我们的测试文档构建一个特征向量。这里有两个问题:

训练集和测试集的特征数量不会相同。我已经阅读了一些解决方案,但是从科学的角度来看,我不能满足! 仅针对一个测试文档甚至其中几个文档计算 TF-IDF 并没有真正意义。因为我们在训练集和测试集中拥有的token字典不一定相同,即使我们对这两者有相同数量的特征,也不一定意味着这些特征是相同的。

所以现在我只是想弄清楚如何使用我们用词袋模型和 TF-IDF 值训练的模型准确地标记新文档。特别是,我正在寻找我上面提到的两个具体问题的合理答案。

我们可以计算模型的准确性(例如使用交叉验证),但我不知道我们应该如何标记新文档。

附:我正在使用 scikit-learn 和 python。

更新:我可以找到我的问题的答案。在这种情况下,我们可以简单地使用我们用来训练分类器的相同 TfidfVectorizer。所以现在每次我训练一个新的分类器并使用 tfidfVectorizer 构建我的特征向量时,我都会使用 pickle 将我的向量化器保存在一个文件中,并在创建测试集特征向量时使用这个向量化器。

【问题讨论】:

想想你将如何在现实世界的场景中进行,你已经使用所有可用数据进行了训练,但在预测时仍然存在新的文本数据。 【参考方案1】:

您应该在训练期间弄清楚所有可能的特征及其 IDF 权重;在测试时,您使用基于训练数据集找到的特征和权重。不要在测试文档上计算 IDF。

1) 使用词袋方法时,常用的方法是丢弃训练期间未见过的词。如果您在训练期间没有看到一个单词,那么您对它的信息为零,因此它不会影响预测结果。

2) 是的,在预测时构建词汇表和计算 IDF 权重是没有意义的。使用在训练阶段找到的特征和权重。

scikit-learn 提供了一个 tutorial 涵盖了这一点。

将 tf*idf 拟合到比训练数据集更大的数据集上可能是有意义的,以便为训练数据中找到的单词获得更精确的 IDF 估计,但我不确定人们这样做的频率。

【讨论】:

【参考方案2】:

我无法科学地支持这一点,但您可以尝试使用 m 特征的字典并计算测试集上这些特征的 TF-IDF 分数。这将做的是为每个测试文档创建一个与训练向量大小相同的向量,并与训练模型时使用的相同特征相关联。但是,您必须解决训练集中未出现在测试集中的单词的问题。

我能问一下您为什么使用 TF-IDF 而不是朴素贝叶斯或随机森林之类的东西吗?

【讨论】:

“训练集中没有出现在测试集中的单词”这正是我正在寻找答案的问题!据我了解,一旦我们有了特征向量,随机森林和朴素贝叶斯就是我们使用的算法。问题是使用 TF-IDF 为训练和测试集创建特征向量。特别是,我认为无论我们使用什么算法,我们都应该首先创建特征向量。

以上是关于使用 TF-IDF 测试和训练具有不同数量特征的集的主要内容,如果未能解决你的问题,请参考以下文章

测试和训练集中不同数量的特征

训练和测试集中不同数量的特征 - 随机森林 sklearn Python

使用不同尺寸但相同数量的 HoG 特征的图像训练分类器

用于分类的 Python 矢量化 [重复]

Sklearn PCA:用于训练和测试的组件数量不同

python尝试不同的随机数进行数据划分使用卡方检验依次计算不同随机数划分下训练接和测试集所有分类特征的卡方检验的p值,如果所有p值都大于0.05则训练集和测试集都具有统计显著性数据划分合理