sklearn中'transform'和'fit_transform'之间的区别是什么?

时间:2014-05-23 20:43:00

标签: python python-2.7 scikit-learn

在sklearn-python工具箱中,有两个函数transformfit_transform关于sklearn.decomposition.RandomizedPCA。两个功能的描述如下

enter image description here enter image description here

但它们之间有什么区别?

8 个答案:

答案 0 :(得分:47)

scikit-learn estimator api 中,

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

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

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

enter image description here

结帐第4章来自此book&来自stackexchange的答案更清晰

答案 1 :(得分:19)

这些方法用于对给定数据进行居中/特征缩放。 它基本上有助于规范化特定范围内的数据

为此,我们使用Z-score方法。

Z-Score

我们在训练数据集上这样做。

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

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

3. Fit_transform():连接fit()和transform()方法以转换数据集。

功能扩展/标准化的代码片段(在train_test_split之后)。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)

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

答案 2 :(得分:17)

这里的区别 只有在已经在矩阵上计算了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.

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

方法之间的通用差异:

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

fit_transform和transform都返回相同的文档项矩阵。

Source

答案 5 :(得分:3)

为什么以及何时使用每一个:

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

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转换器,其他类型的矢量化器,令牌化器...

答案 6 :(得分:2)

当我们有两个具有不同元素的数组时,我们分别使用“拟合”和变换,我们根据其内部函数拟合“数组 1”,例如 MinMaxScaler (内部函数是求均值和标准差)。例如,如果我们根据其平均值拟合“数组 1”并变换数组 2,则数组 1 的平均值将应用于我们变换的数组 2。简单来说,我们将一个数组转换为另一个数组的基本内部函数。

代码演示:

import numpy as np
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')

temperature = [32., np.nan, 28., np.nan, 32., np.nan, np.nan, 34., 40.]
 windspeed  = [ 6.,  9., np.nan,  7., np.nan, np.nan, np.nan,  8., 12.]
n_arr_1 = np.array(temperature).reshape(3,3)
print('temperature:\n',n_arr_1)
n_arr_2 = np.array(windspeed).reshape(3,3)
print('windspeed:\n',n_arr_2)

输出:

temperature:
 [[32. nan 28.]
 [nan 32. nan]
 [nan 34. 40.]]
windspeed:
 [[ 6.  9. nan]
 [ 7. nan nan]
 [nan  8. 12.]]

fittransform 分别将数组 2 转换为拟合(基于均值)数组 1:

imp.fit(n_arr_1)
imp.transform(n_arr_2)

输出

检查下面的输出,观察基于前两个输出的输出你会看到差异。基本上,在数组 1 上,它取每一列的平均值,并根据其缺失值的列拟合数组 2。

array([[ 6.,  9., 34.],
       [ 7., 33., 34.],
       [32.,  8., 12.]])

当我们想根据另一个数组转换一个数组时,我们会这样做。但是当我们有一个数组并且我们想根据它自己的平均值对其进行转换时。在这种情况下,我们一起使用 fit_transform

见下文;

imp.fit_transform(n_arr_2)

输出

array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])

(上图)我们可以选择:

imp.fit(n_arr_2)
imp.transform(n_arr_2)

输出

array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])

为什么我们分别对同一个数组进行拟合和变换,需要两行代码,为什么不使用简单的fit_transform,它可以在一行代码中拟合和变换相同的数组。这就是 fit 和 transform 和 fit_transform 之间的区别。

答案 7 :(得分:0)

这是b.w.fit()和.fit_transform()的基本区别:

.fit(): is use in the Supervised learning having two object/parameter(x,y) to fit model and make model to run, where we know that what we are going to predict, while
.fit_transform()L is use in Unsupervised Learning having one object/parameter(x), where we don't know, what we are going to predict.