在整个数据集上或仅在训练数据上计算 TF-IDF?

Posted

技术标签:

【中文标题】在整个数据集上或仅在训练数据上计算 TF-IDF?【英文标题】:Computing TF-IDF on the whole dataset or only on training data? 【发布时间】:2018-05-26 11:31:03 【问题描述】:

在《TensorFlow Machine Learning Cookbook》这本书的第七章中,作者在预处理数据时使用了 scikit-learn 的fit_transform 函数来获取文本的tfidf 特征进行训练。作者将所有文本数据提供给函数,然后将其分为训练和测试。这是一个真正的动作还是我们必须先分离数据,然后在火车上执行fit_transform,在测试上执行transform

【问题讨论】:

在这种情况下,总是想在现实世界的问题中应该做什么。在那里,您将所有可用数据视为训练,将新的看不见的数据视为测试。现在,由于在这种情况下将无法获得测试数据,您会怎么做。将可用数据拆分为训练和测试的过程是复制相同的。 @Vivek Kumar 是的,实际上你的意思是 fit_transform 对所有数据的方法是不正确的,因为我们没有在实际问题中测试数据。 是的。所以只对训练数据执行 fit() 或 fit_transform()。 【参考方案1】:

根据 scikit-learn 的文档,fit() 用于

从训练集中学习词汇和 idf。

另一方面,fit_transform() 用于

学习词汇和idf,返回词-文档矩阵。

transform()

将文档转换为文档术语矩阵。

在训练集上,您需要同时应用fit()transform()(或者只是本质上加入这两个操作的fit_transform())但是,在测试集上,您只需要transform() 测试实例(即文件)。

请记住,训练集用于学习目的(通过fit() 实现学习),而测试集用于评估训练后的模型是否可以很好地泛化到新的unseen数据点。


更多详情可以参考文章fit() vs transform() vs fit_transform()

【讨论】:

是的,没错,我们不应该在训练中使用测试数据。如果我们在所有数据集上 fit_transform,这意味着我们在训练级别使用测试数据。这两种方式得到的词汇也不同。【参考方案2】:

作者在分离训练和测试之前给出所有文本数据 功能。这是一个真正的动作还是我们必须先分离数据然后 在训练时执行 tfidf fit_transform 并在测试时执行变换?

我认为这已经将有关测试集的一些信息泄露到了训练集中。

我倾向于始终遵循这样的规则,即在进行任何预处理之前首先要做的是分离数据,创建一个保留集。

【讨论】:

【参考方案3】:

当我们谈论文本数据时,我们必须确保模型仅在训练集的词汇上进行训练,因为当我们在现实生活中部署模型时,它会遇到以前从未见过的词所以我们必须牢记这一点,对测试集进行验证。 我们必须确保测试集中的新词不属于模型的词汇表。 因此,我们必须在训练数据上使用 fit_transform 并在测试数据上使用 transform。 如果您考虑进行交叉验证,那么您可以在所有折叠中使用此逻辑。

【讨论】:

以上是关于在整个数据集上或仅在训练数据上计算 TF-IDF?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?

如何评估不同模型在一个数据集上的性能?

使用 dplyr 和 broom 在训练和测试集上计算 kmeans

Keras:使用批量标准化在同一数据集上的不同训练和验证结果

在时间序列数据集上使用递归神经网络进行预测

过拟合问题