我应该如何理解 python-sklearn 中的 .transform 方法?

Posted

技术标签:

【中文标题】我应该如何理解 python-sklearn 中的 .transform 方法?【英文标题】:How should I understand the .transform method in python-sklearn? 【发布时间】:2017-05-15 17:12:01 【问题描述】:

简介

我正在学习一个教程,而且我对 Python 和机器学习还很陌生。 (所以,如果我看起来像个菜鸟,请道歉……因为我是)。教程可以在这里找到:Data Science Python Tutorial

问题中的代码行

我看到很早就创建了一个bow_transformer 变量:

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

我对“向量化”的理解在这里并不是很清楚......我们是说语料库中每条 SMS 消息的每个单词都有自己的行吗?

然后,这个变量被转换(我假设 transform 这里是创建某种单词的 (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 进行了弓形变换(无论这意味着什么),然后将messages_bow 拟合到tfidfTransformer 上,并为其分配tfidf_transformer 变量。这个新创建的tfidf_transformer 变量现在看起来不再像变量了,因为下一行是使用上述过程/对象创建一个新变量 (tfidf4)?

结论

我希望你们能理解我的困惑——我不知道如何搜索我的问题,因为我根本不知道我不知道什么。我的问题是尖叫“Noobie”,我希望这不会阻止任何人认真对待我的问题。

【问题讨论】:

您可能会发现这个 [youtube.com/… 非常有用。这比我从知名大学上的几门课程更清楚。祝你好运。 【参考方案1】:

向量器将语料库(例如文本文档)转换为向量Vector Space Model。有很多方法可以做到这一点,结果将取决于所使用的技术。矢量化器是必要的,因为模型使用数字而不是单词。 特别是,CountVectorizer 的实现将生成一个包含每个单词出现次数的数组。在这种特殊情况下,CountVectorizer 被用作生成 TF-IDF(词频 - 逆文档频率)表示的前一步,这是确定文档中单词“重要性”的最流行技术之一。该模型的假设是出现更多的词更可能代表该文档(词频),但是不应考虑整个语料库之间的“常用词”(逆文档频率),例如,连接符.该技术广泛应用于信息检索领域。

在向量空间表示中获得语料库后,您就可以开始将此表示用作机器学习技术的输入。

特别是 transform 方法将返回将训练(拟合)模型应用于作为参数传递的元素的结果。换句话说,转换将输入“翻译”成“模型表示语言”。

让我们用一个例子来说明这一点:

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

文档 1:这是一个脾气暴躁的文档。 文件 2:这是文件 2,很伤心。 文档 3:这是文档 3 的快乐。

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

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

另一方面,当在语料库上调用变换时,它将使用词汇表来生成这个矩阵:

[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' 表示文档中不存在该单词。

现在,我们可以使用这个矩阵通过 fit() 训练 TF-IDF 模型,它将生成以下向量:

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

其中包含每个单词的全局出现次数。然后,当您将变换应用于 (1) 时,tf-idf 模型将使用在拟合阶段 (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)对一堆文档进行分类,那么该过程将是:

    转换文档以生成 VSM 表示。拟合一个 TF-IDF 模型,该模型将服务于识别每个文档中哪些术语最重要的建议。

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

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

希望对你有帮助!

【讨论】:

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

以上是关于我应该如何理解 python-sklearn 中的 .transform 方法?的主要内容,如果未能解决你的问题,请参考以下文章

python-sklearn中出现“ValueError:预期的二维数组,得到一维数组”错误[重复]

python-sklearn数据拆分与决策树的实现

Ubuntu中安装 python-sklearn 出现无法找到软件包是怎么回事

Python-sklearn数据预处理(单/多个数据集数据标准化稳健标准化缺失值填补)

猿创征文|Python-sklearn机器学习快速入门:你的第一个机器学习实战项目

LDA模型原理+代码+实操