如何理解Python中sklearn库的.transform方法?

4

介绍

我正在学习一份教程,对于Python和机器学习都比较新(所以如果我看起来像一个新手,还请见谅……因为我确实是)。该教程可以在这里找到:Data Science Python Tutorial

涉及的代码行

我发现早期创建了一个名为bow_transformer的变量:

bow_transformer = CountVectorizer(analyzer=split_into_lemmas).fit(messages['message'])

我对“向量化”这个概念的理解不是很清楚...我们是说每个短信语料库中的单词都会有自己的行吗?

然后,这个变量被转换了(我认为这里的“转换”是为了创建某种单词的(x,y)表示,以便机器可以读取并计算它们的出现次数。):

bow4 = bow_transformer.transform(messages['message'])
messages_bow = bow_transformer.transform(messages['message'])

到目前为止,我感到有些困惑......我认为自己已经在头脑中做出了适当的逻辑推理(如果我上面犯了一些逻辑错误,请纠正我,这将极大地帮助我理解机器学习+Python。

现在,主要问题来了

以下代码块进一步加深了我的困惑:

tfidf_transformer = TfidfTransformer().fit(messages_bow)
tfidf4 = tfidf_transformer.transform(bow4)

我的解释

messages_bow是词袋变换(不管这意味着什么),然后将其拟合到tfidfTranformer上,将其赋值给tfidf_transformer变量。现在,这个新创建的tfidf_transformer变量看起来不像一个变量了,因为下一行使用上述过程/对象创建一个新变量(tfidf4)?

结论

我希望你们能理解我的困惑-我不知道如何搜索我的问题,因为我根本不知道我不知道什么。我的问题在呼喊“新手”,我希望这不会阻止任何人认真对待我的问题。


2
你可能会发现这个视频 [https://www.youtube.com/watch?v=ZiKMIuYidY0&list=PL5-da3qGB5ICeMbQuqbbCOQWcS6OYBr5A&index=10] 非常有用。它比我参加过的一些知名大学的课程更清晰易懂。祝你好运。 - user2738815
1个回答

6
向量化器将语料库(例如文本文档)转换为向量向量空间模型。有许多方法可以做到这一点,结果取决于所使用的技术。向量化器是必需的,因为模型使用数字而不是单词。特别地,CountVectorizer的实现将生成一个数组,其中包含每个单词出现的次数。在这种特殊情况下,CountVectorizer被用作先前步骤来生成TF-IDF(词频-逆文档频率)表示,这是确定文档中单词“重要性”最流行的技术之一。该模型的假设是出现更多的术语更有可能代表该文档(术语频率),但是,整个语料库之间的“常见单词”不应被考虑在内(逆文档频率),例如连接词。这种技术在信息检索领域广泛使用。
一旦您将语料库呈现为向量空间表示,您就可以将此表示用作机器学习技术的输入。
特别地,transform方法将返回将训练(fit)模型应用于传递的元素的结果。换句话说,变换将输入“翻译”为“模型表示语言”。

让我们通过一个例子来澄清这个问题:

假设我们有三个文档(内容没有意义,我知道):

  • 文档1:这是文档一,它很脾气不好。
  • 文档2:这是文档二,它很难过。
  • 文档3:这是文档三,它很开心。

当调用fit()时,CountVectorizer将学习词汇表。

[this, is, document, one, grumpy, two, sad, three, happy]

另一方面,当在语料库上调用transform时,它将使用词汇表生成此矩阵:

[1, 2, 1, 1, 1, 0, 0, 0, 0] (1) [1, 2, 1, 0, 0, 1, 1, 0, 0] [1, 2, 1, 0, 0, 0, 0, 1, 1]

该矩阵给出了每个文档中单词出现的次数。这里,值2对应于单词“is”,在每个文档中重复两次。同时,值“0”表示该单词未出现在该文档中。

现在,我们可以使用此矩阵来训练TF-IDF模型,并使用fit()生成以下向量:

(2) [3, 6, 3, 1, 1, 1, 1, 1, 1]

其中包含每个单词的全局出现次数。然后,当你将transform应用于(1)时,TF-IDF模型将利用在fit阶段生成的向量(2)来创建TF-IDF矩阵:

[0.33, 0.33, 0.33, 1, 1, 0, 0, 0, 0] [0.33, 0.33, 0.33, 0, 0, 1, 1, 0, 0] [0.33, 0.33, 0.33, 0, 0, 0, 0, 1, 1]

其中较低的数字代表更常见的单词。注意,“独特”的单词具有更高的数字。后面的矩阵是您将用于训练ML模型的矩阵。

总之,例如,如果您想要使用聚类技术(例如KMeans)对一堆文档进行分类,则过程如下:

  1. 将文档转换为生成VSM表示形式。拟合TF-IDF模型,其目的是确定每个文档中最重要的术语。

  2. 拟合KMeans模型,它将生成理想情况下包含相关文档的聚类。为此,该模型将使用上一步生成的结果通过识别它们之间共享的单词来建立文档关系。

所有这些解释都在自然语言处理的背景下,如果您想要使用ML来识别图像,当然不会使用tf-idf。

我希望这能帮到你!


绝对是个好答案...但我还有一些初学者的问题。1.您说[“transform”方法将返回将训练(fit)模型应用于作为参数传递的元素的结果]。那么Dictvectorizer和TF-IDF都是模型吗?2.您说[后面的矩阵是您将用来训练ML模型的矩阵],但该矩阵本身是使用TF-IDF生成的;所以您的意思是一个模型的输出可以在另一个模型内部使用吗?为什么?抱歉,我已经从答案中理解了我需要的内容,但这些仍然令人困惑。 - aderchox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接