在整个数据集上或仅在训练数据上计算 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