当前位置: 首页 > 知识库问答 >
问题:

TfidfVectorizer如何计算测试数据的分数

暨承平
2023-03-14

在scikit learnTfidfVectorizer中,我们可以拟合训练数据,然后使用相同的矢量器转换测试数据。列车数据转换的输出是一个矩阵,表示给定文档中每个单词的tf idf分数。

然而,安装的矢量器如何计算新输入的分数?我猜:

  1. 一个单词在一个新文档中的分数,通过将同一单词在训练集中的文档上的分数进行聚合计算得出

我曾经尝试过从Scikit学习的源代码中推断出这个操作,但不太明白。这是我之前提到的选择之一还是完全不同的选择?请协助。

共有1个答案

孟财
2023-03-14

肯定是前者:每个单词的idf(逆文档频率)仅基于培训文档计算。这是有意义的,因为这些值正是在向量器上调用fit时计算的值。如果您描述的第二个选项是正确的,那么我们每次基本上都会重新安装一个矢量器,而且我们还会导致信息泄漏,因为在模型评估期间会使用测试集中的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]])

按照fit方法的工作原理,您可以自己重新计算这些tfidf值:

“苹果”和“香蕉”显然有0分的tfidf分数,因为它们不出现在x_test中。另一方面,“梨”不存在于x_train中,因此甚至不会出现在矢量化中。因此,只有“爱”、“真的”和“我们”才会有tfidf分数。

Scikit-学习将tfidf实现为log((1n)/(1df)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实现这种方法的方式。

 类似资料:
  • 问题内容: 我正在对30个带有2个聚类的样本进行k均值聚类(我已经知道有两个类)。我将数据分为训练集和测试集,并尝试计算测试集的准确性得分。但是有两个问题:首先,我不知道我是否真的可以针对k均值聚类做到这一点(测试集上的准确性得分)。第二:如果我被允许这样做,那么我的实现是写的还是错误的。这是我尝试过的: 但是,当我在 最后三行中 打印 测试集的k-means标签( k_means.predict

  • 主要内容:创建JMeter测试计划,添加JDBC请求,保存并执行测试计划,验证输出在本节中,将学习如何创建测试数据库服务器的基本测试计划。 为了我们的测试目的,这里将创建一个数据库。 可以根据自己的方便使用任何其他数据库服务器。还可以参考我们的MySQL数据库教程:https://www.xnip.cn/mysql 来了解有关数据库创建的更多信息。 在系统上安装数据库服务器之后。 按着这些次序: 创建名为testdb的数据库。 创建表 - 。 将记录插入到表中。 下图显示了创建

  • 在我的SVM中,我使用tf-idf对文档进行特征提取。这些tf-idf是根据全部培训文件计算的。 现在,当我得到一个我想要分类的测试文档时,我如何为它生成向量? 我在计算tf-idf之前使用了词干分析。我也可以在测试文档上执行。我count_of_words火车文件。 为了计算测试文档的tf idf,我应该增加训练文档中的单词计数,还是直接使用它?

  • 问题内容: 对于一个简单的数据结构,例如: 供参考,层次树如下所示: 我想计算每个级别的孩子人数。因此,我将获得一个新列“ NoOfChildren”,如下所示: 我读了一些有关分层数据的内容,但是我不知何故卡在了parentID的多个内部联接上。也许有人可以在这里帮助我。 问题答案: 使用 CTE可以满足您的需求。 递归地遍历所有孩子,记住根。 每个根的项目。 这些再次与您的原始表一起产生结果。

  • 我遵循了此处提出的计算循环数据平均值的建议: https://en.wikipedia.org/wiki/Mean_of_circular_quantities 但是我也想计算均方差。 上面给出了平均值,但我不知道如何计算SD 我试着只取正弦和余弦的标准偏差的平均值,但我得到了不同的答案。

  • 我试图为使用Spring Data REST构建的REST API设置单元测试。我有这样一个存储库: 我的测试看起来是这样的: 最后,日志 编辑:beerRepositoryMock 谢谢