繁体   English   中英

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

[英]Which way is right in tf-idf? Fit all then transform train set and test set or fit train set then transform test set

1.Fit train set then transform test set scikit-learn 提供这个例子

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)

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

这实际上取决于您的用例。

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

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

tl;博士都工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM