sklearn中的“ transform”和“ fit_transform”有什么区别


Answers:


22

在这里,仅当您已经在矩阵上计算了PCA时,才可以使用pca.transform的区别

   In [12]: pc2 = RandomizedPCA(n_components=3)

    In [13]: pc2.transform(X) # can't transform because it does not know how to do it.
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-13-e3b6b8ea2aff> in <module>()
    ----> 1 pc2.transform(X)

    /usr/local/lib/python3.4/dist-packages/sklearn/decomposition/pca.py in transform(self, X, y)
        714         # XXX remove scipy.sparse support here in 0.16
        715         X = atleast2d_or_csr(X)
    --> 716         if self.mean_ is not None:
        717             X = X - self.mean_
        718 

    AttributeError: 'RandomizedPCA' object has no attribute 'mean_'

    In [14]: pc2.ftransform(X) 
    pc2.fit            pc2.fit_transform  

    In [14]: pc2.fit_transform(X)
    Out[14]: 
    array([[-1.38340578, -0.2935787 ],
           [-2.22189802,  0.25133484],
           [-3.6053038 , -0.04224385],
           [ 1.38340578,  0.2935787 ],
           [ 2.22189802, -0.25133484],
           [ 3.6053038 ,  0.04224385]])

如果要使用.transform,则需要将转换规则教给您的pca

In [20]: pca = RandomizedPCA(n_components=3)

In [21]: pca.fit(X)
Out[21]: 
RandomizedPCA(copy=True, iterated_power=3, n_components=3, random_state=None,
       whiten=False)

In [22]: pca.transform(z)
Out[22]: 
array([[ 2.76681156,  0.58715739],
       [ 1.92831932,  1.13207093],
       [ 0.54491354,  0.83849224],
       [ 5.53362311,  1.17431479],
       [ 6.37211535,  0.62940125],
       [ 7.75552113,  0.92297994]])

In [23]: 

特别地,PCA变换将通过矩阵X的PCA分解获得的基数更改应用于矩阵Z。


我已经修改了我的问题。这两个函数返回相同类型的值。
tqjustc 2014年

2
你的意思是fit_transform是两种功能的组合fittransform
tqjustc

6
如果在同一矩阵上使用拟合和变换,则为是。如果您先拟合矩阵x然后转换矩阵z
则不会这样做

Line In [14]说“ ftransform”,那是什么?
Rajdeep Biswas

92

scikit-learn estimator api中

fit() :用于从训练数据生成学习模型参数

transform():从fit()方法生成的参数,应用于模型以生成转换后的数据集。

fit_transform()fit()transform()api在同一数据集上的组合

在此处输入图片说明

结帐章-4从这本书及答案从stackexchange为了更清楚


54

这些方法用于确定给定数据的中心/特征标度。它基本上有助于规范特定范围内的数据

为此,我们使用Z评分方法。

Z分数

我们在训练数据集上执行此操作。

1. Fit():方法计算参数μ和σ并将其保存为内部对象。

2. Transform():使用这些计算出的参数的方法将转换应用于特定的数据集。

3. Fit_transform():将fit()和transform()方法结合在一起以进行数据集转换。

特征缩放/标准化的代码片段(在train_test_split之后)。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_transform(X_train)
sc.transform(X_test)

我们在测试集上应用相同的(训练集相同的两个参数μ和σ(值))参数转换。


1
谢谢您的解释。我很好奇“适合”的价值观是否能延续下去,并且这有所帮助!
阿迪布

2
代码示例为+1。无论是在火车上使用fit_transform然后转换测试集,还是在火车上需要单独拟合,我都很困惑
Vivek

2
fit_tranform(..)不能用于X_test,因为测试测试应使用从X_train数据集计算出的μ和σ。fit_tranform(..)仅可用于训练数据集。请更正我的理解。
Daya

1
是的,你是对的。只有transform(..)可以用于测试,因为它使用从X_train获得的参数来标准化X_test数据
shaurya uppal

7

两种方法之间的通用差异:

  • 适合(raw_documents [,y]):学习原始文档中所有标记的词汇词典。
  • fit_transform(raw_documents [,y]):学习词汇词典并返回术语文档矩阵。这等效于紧随其后的变换,但实现效率更高。
  • transform(raw_documents):将文档转换为文档术语矩阵。使用适合的词汇表或提供给构造函数的词汇表从原始文本文档中提取令牌计数。

fit_transform和transform都返回相同的Document-term矩阵。

资源


4

这里.fit()&的基本区别.fit_transform()

。适合():

在有两个对象/参数(x,y)的监督学习中用于拟合模型并使模型运行,我们知道我们要预测的内容

.fit_transform():

在无监督学习中使用一个对象/参数(x),而我们不知道该预测什么。


这不是很精确。fit()也可以用于无监督学习中。但是,如果您只是为了简洁起见而试图过分简化,那么这是向初学者解释的好方法。
Rajdeep Biswas

1

用外行的术语来说,fit_transform意味着先进行一些计算,然后再进行转换(例如,根据一些数据计算列的均值,然后替换缺少的值)。因此,对于训练集,您既需要计算又要进行转换。

但是对于测试集,机器学习根据训练集中学习到的内容应用预测,因此不需要计算,只需执行转换即可。


0

为什么和何时使用每一个:

所有答复都很好,但是我将重点介绍为什么和何时使用每种方法。

fit(),transform(),fit_transform()

通常,我们有一个监督学习问题,其中(X,y)作为数据集,我们将其分为训练数据和测试数据:

import numpy as np
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)

X_train_vectorized = model.fit_transform(X_train)
X_test_vectorized = model.transform(X_test)

想象一下,我们正在安装一个令牌生成器,如果我们安装了X,我们会将测试数据包含到令牌生成器中,但是我已经多次看到这个错误!

正确的方法是只适合X_train,因为您不知道“您的未来数据”,因此您不能使用X_test数据来拟合任何东西!

然后,您可以转换测试数据,但是要分别进行转换,这就是为什么存在不同方法的原因。

最后的提示:X_train_transformed = model.fit_transform(X_train)等同于: X_train_transformed = model.fit(X_train).transform(X_train),但是第一个提示更快。

请注意,我所谓的“模型”通常是缩放器,tfidf转换器,其他类型的矢量化器,令牌化器...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.