gpt4 book ai didi

scikit-learn - TfidfVectorizer 如何计算测试数据的分数

转载 作者:行者123 更新时间:2023-12-04 04:14:25 31 4
gpt4 key购买 nike

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

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

  • 新文档中某个单词的分数通过将训练集中的文档中的相同单词的分数进行某种聚合来计算。
  • 新文档被“添加”到现有语料库中并计算新分数。

  • 我曾尝试从 scikit-learn 的源代码中推导出操作 code但不能完全弄清楚。它是我之前提到的选项之一还是完全其他选项?
    请协助。

    最佳答案

    绝对是前者:每个字的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 中不存在。所以甚至不会出现在矢量化中。因此,只有“爱”、“真的”和“我们”才会有 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实现了这种方法。

    关于scikit-learn - TfidfVectorizer 如何计算测试数据的分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55707577/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com