【问题标题】:Which way is right in tf-idf? Fit all then transform train set and test set or fit train set then transform test set在 tf-idf 中哪种方式是正确的?拟合所有然后变换训练集和测试集或拟合训练集然后变换测试集
【发布时间】:2021-06-29 03:30:10
【问题描述】:

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)

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

【问题讨论】:

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


    【解决方案1】:

    这真的取决于你的用例。

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

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

    tl;博士都工作

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2021-06-19
      • 2017-11-01
      • 2017-12-12
      • 2019-01-14
      • 2013-06-18
      • 2015-01-17
      • 2019-08-15
      相关资源
      最近更新 更多