【问题标题】:How does TfidfVectorizer compute scores on test dataTfidfVectorizer 如何计算测试数据的分数
【发布时间】:2019-09-06 12:30:51
【问题描述】:

在 scikit-learn 中,TfidfVectorizer 允许我们拟合训练数据,然后使用相同的矢量化器来转换我们的测试数据。 对训练数据进行转换的输出是一个矩阵,表示给定文档中每个单词的 tf-idf 分数。

但是,拟合向量器如何计算新输入的分数?我已经猜到了:

  1. 新文档中单词的分数是通过对训练集中的文档中相同单词的分数进行某种聚合计算得出的。
  2. 新文档被“添加”到现有语料库中并计算新分数。

我已经尝试从 scikit-learn 的源代码 code 中推断出该操作,但无法完全弄清楚。它是我之前提到的选项之一还是完全不同的选项? 请帮忙。

【问题讨论】:

    标签: scikit-learn nlp tf-idf tfidfvectorizer


    【解决方案1】:

    肯定是前者:每个词的idf(逆文档频率)仅根据训练文档计算。这是有道理的,因为这些值正是您在矢量化器上调用 fit 时计算的值。如果您描述的第二个选项为真,我们基本上每次都会重新调整矢量化器,并且我们还会导致information leak,因为在模型评估期间将使用来自测试集的 idf。

    除了这些纯概念性的解释之外,你还可以运行以下代码来说服自己:

    from sklearn.feature_extraction.text import TfidfVectorizer
    vect = TfidfVectorizer()
    x_train = ["We love apples", "We really love bananas"]
    vect.fit(x_train)
    print(vect.get_feature_names())
    >>> ['apples', 'bananas', 'love', 'really', 'we']
    
    x_test = ["We really love pears"]
    
    vectorized = vect.transform(x_test)
    print(vectorized.toarray())
    >>> array([[0.        , 0.        , 0.50154891, 0.70490949, 0.50154891]])
    

    根据拟合方法的工作原理,您可以自己重新计算这些 tfidf 值:

    “apples”和“bananas”的 tfidf 分数显然为 0,因为它们没有出现在 x_test 中。另一方面,“梨”在x_train 中不存在,因此甚至不会出现在矢量化中。因此,只有“love”、“really”和“we”会有 tfidf 分数。

    Scikit-learn 将 tfidf 实现为 log((1+n)/(1+df) + 1) * f 其中 n 是训练集中的文档数(我们是 2),df 是训练集中的文档数其中单词仅出现在训练集中,f 是单词在测试集中出现的频率计数。因此:

    tfidf_love = (np.log((1+2)/(1+2))+1)*1
    tfidf_really = (np.log((1+2)/(1+1))+1)*1
    tfidf_we = (np.log((1+2)/(1+2))+1)*1
    

    然后,您需要按文档的 L2 距离缩放这些 tfidf 分数:

    tfidf_non_scaled = np.array([tfidf_love,tfidf_really,tfidf_we])
    tfidf_list = tfidf_non_scaled/sum(tfidf_non_scaled**2)**0.5
    
    print(tfidf_list)
    >>> [0.50154891 0.70490949 0.50154891]
    

    您可以看到,确实,我们得到了相同的值,这证实了 scikit-learn 实施此方法的方式。

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 2020-07-22
      • 1970-01-01
      • 2021-08-17
      • 2017-07-15
      • 2016-10-07
      • 2022-08-20
      • 1970-01-01
      • 2014-07-07
      相关资源
      最近更新 更多