在 tf-idf 中哪种方式是正确的?拟合所有然后变换训练集和测试集或拟合训练集然后变换测试集

时间:2021-04-02 08:04:51

标签: python numpy scikit-learn tf-idf tfidfvectorizer

1.拟合训练集然后变换测试集 scikit-learn provide this example

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english')
X_train = vectorizer.fit_transform(data_train.data)
X_test = vectorizer.transform(data_test.data)

2.Fit all 然后转换训练集和测试集,我在很多情况下都见过

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english')
X_all = np.append(train_x, test_x, axis=0)
vectorizer.fit(X_all)
X_train = vectorizer.transform(train_x)
X_test = vectorizer.transform(test_x)

所以,我很困惑哪种方式是正确的以及为什么

1 个答案:

答案 0 :(得分:0)

这真的取决于您的用例。

在第一种情况下,您的测试集 TF-IDF 值仅基于训练集中的频率。这允许您控制“参考”语料库并将您的结果与测试集中的数据去相关,当您的测试集中的数据从与您在正常情况下预期的数据分布非常不同的数据分布中采样时,这很有意义。请注意,这只是因为 scikit 以一种对以前看不见的单词健壮的方式实现了 TF-IDF。

在第二种情况下,当您使用测试集进行训练时,您的频率也将基于测试集中的内容。这允许您的测试集域中的数据具有更多代表性的频率值,这可以提高下游任务的性能,并确保在测试时不会出现新的未见过的词。

tl;博士都工作