【问题标题】:sklearn中的'transform'和'fit_transform'有什么区别
【发布时间】:2014-07-13 08:01:33
【问题描述】:

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

但是它们之间有什么区别呢?

【问题讨论】:

标签: python scikit-learn


【解决方案1】:

.transform 方法适用于您已经计算出 PCA 的情况,即如果您已经调用了它的 .fit 方法。

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]])
    
  

所以你想fit RandomizedPCA 然后transform 为:

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 .transform 将通过矩阵 X 的 PCA 分解获得的基变化应用于矩阵 Z

【讨论】:

  • 我已经修改了我的问题。这两个函数返回相同类型的值。
  • 你的意思是fit_transformfittransform两个函数的组合?
  • 如果你在同一个矩阵上使用 fit 和 transform 是的。如果你适合矩阵 x 然后变换矩阵 z
  • Line In[14] 说“ftransform”,那是什么?
【解决方案2】:

scikit-learn estimator api中,

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

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

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

book 结帐第 4 章并从stackexchange 回答以更清楚

【讨论】:

    【解决方案3】:

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

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

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

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

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

    3.Fit_transform():加入fit()和transform()方法进行数据集的变换。

    用于特征缩放/标准化的代码 sn-p(在 train_test_split 之后)。

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

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

    【讨论】:

    • 感谢您的解释。我很好奇“适合”的价值观是否会延续,这有帮助!
    • +1 用于代码示例。我很困惑您是否可以在火车集上使用 fit_transform 然后转换测试集,或者您是否需要在火车上单独拟合
    • fit_tranform(..) 不能用于 X_test,因为测试测试应该使用从 X_train 数据集计算的 μ 和 σ。 fit_transform(..) 只能用于训练数据集。请纠正我的理解。
    • 是的,你是对的。只有 transform(..) 可以用于测试,因为它使用从 X_train 学习的参数来标准化 X_test 数据
    • Y_train 和 Y_test 呢?总是 fit_tranform(Y_train) 和 transform(Y_test)?
    【解决方案4】:

    方法之间的一般区别:

    • fit(raw_documents[, y]):学习原始文档中所有标记的词汇字典。
    • fit_transform(raw_documents[, y]):学习词汇字典并返回词-文档矩阵。这相当于 fit 后跟 transform,但更有效地实现。
    • transform(raw_documents):将文档转换为文档术语矩阵。使用符合 fit 的词汇表或提供给构造函数的词汇表从原始文本文档中提取标记计数。

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

    Source

    【讨论】:

      【解决方案5】:

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

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

      .fit_transform() 用于具有一个对象/参数(x)的无监督学习, 在我们不知道的地方,我们将要预测什么。

      【讨论】:

      • 不是很精确; fit() 也可以用于无监督学习。但是,如果您只是为了简洁而试图过度简化,那么这是向初学者解释的好方法。
      • 这是完全错误和误导的;问题显然是关于RandomizedPCA(可以说是类似的预处理东西),它具有fit()transform()fit_transform()这三种方法。
      【解决方案6】:

      为什么和何时使用每一个 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 转换器、其他类型的矢量化器、标记器...

      记住:X 代表特征,y 代表每个样本的标签。 X 是一个数据框,y 是一个熊猫系列对象(通常)

      【讨论】:

        【解决方案7】:

        通俗地说,fit_transform 的意思是先进行一些计算,然后再进行转换(比如从一些数据中计算列的均值,然后替换缺失的值)。所以对于训练集,你需要计算和转换。

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

        【讨论】:

          【解决方案8】:

          当我们有两个具有不同元素的数组时,我们分别使用“拟合”和变换,我们根据其内部函数拟合“数组 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 之间的区别。

          【讨论】:

          • Google Colab 请求访问请求(链接已删除)。
          • 再检查一遍。
          【解决方案9】:

          以下答案适用于任何类型的 sklearn 相关库。在了解fit_transform之前,先看看fit方法是什么:

          fit(X) - 通过提取第一个主成分来拟合模型与 X。

          fit_transform(X) - 用 X 拟合模型并在 X 上应用降维。

          fit_transform ---> fit(x).transform(x)

          transform(x) - 在 X 上应用降维。

          您可以查看 sklearn 随机 PCA 文档 here 了解更多详情。

          【讨论】:

            猜你喜欢
            • 2016-12-06
            • 2021-03-11
            • 2018-08-25
            • 2017-04-11
            • 2021-02-18
            • 2016-08-25
            • 1970-01-01
            • 2011-03-18
            • 1970-01-01
            相关资源
            最近更新 更多