【问题标题】:Why should we use the fit_transform method when we get the same output using transform当我们使用 transform 得到相同的输出时,为什么要使用 fit_transform 方法
【发布时间】:2020-10-28 18:49:48
【问题描述】:

我不明白为什么必须使用fit_transform 方法,而transform 方法可以提供与仅使用拟合变换方法相同的输出,fit 方法的重点是什么?

我打印了x_trainx_test,它们都给出了相似的输出。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train[:, 3:] = sc.fit_transform(x_train[:, 3:])
x_test[:, 3:] = sc.transform(x_test[:, 3:])

【问题讨论】:

  • 如果它澄清了您的问题,请记住接受答案。

标签: python machine-learning scikit-learn data-science


【解决方案1】:

如果你没有在 sc.transform() 之前调用 sc.fit_transform() 会发生什么? 后者将失败并显示消息:

NotFittedError: This StandardScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.

函数 fit_transform() 做了 fit() 之后的 transform() 会做的事情。

如果您对训练集的转换值不感兴趣,可以单独使用 fit()。

【讨论】:

    【解决方案2】:

    所以在 sickit learn 预处理器中,您通常总是有一个 fit、一个 transform 和一个 'fit_transform` 方法。

    区别如下:

    fit 一种learns 的数据结构,以找出其中存在的类别和其他预处理信息。安装好预处理器后,您可以使用该安装的预处理器使用 transform 使用该 fitting 信息来处理您的数据。举个简单的例子:

    import numpy as np 
    from sklearn.preprocessing import StandardScaler
    
    X_train = np.array([[1, 2], [3, 4], [5, 6]])
    X_test = np.array([[7, 8], [9, 10]])
    
    X_train:
    array([[1, 2],
           [3, 4],
           [5, 6]])
    
    X_test:
    array([[ 7,  8],
           [ 9, 10]])
    

    这里你正在准备一个标准的缩放器对象

    sc = StandardScaler()
    

    这个对象必须有一些参数来保存数据的平均值等信息 但是由于还没有看到任何数据,所以这个平均值还不存在,所以下面的代码会报错

    print(sc.mean_)
    
    AttributeError: 'StandardScaler' object has no attribute 'mean_'
    

    现在让我们用它来拟合 ​​X_train 数据

    sc.fit(X_train)
    

    让我们看看这次手术后发生了什么

    print(sc.mean_)
    
    [3. 4.]
    

    现在我们可以看到我们的标准缩放器对象已经计算了他所看到的数据的平均值并将其存储在它的属性之一中,这里是mean_

    所以这基本上是fit方法的作用:它是找到一些数据的参数,在我们的例子中是训练数据。 为什么我们要首先找到这些参数是因为我们可能希望完全重用它们来转换其他数据。 这就是 transform 方法的用武之地。

    transform 方法使用一些先前数据的'learned' 参数来转换一些新数据。 所以在我们的例子中,我们现在可以转换我们的测试数据。这是因为训练和测试数据应该以相同的方式进行转换(使用相同的参数,如均值等)

    sc.transform(X_test)
    
    array([[2.44949 , 2.44949 ],
           [3.674235, 3.674235]])
    

    当然我们也应该先转换训练数据本身!

    sc.transform(X_train)
    
    array([[-1.224745, -1.224745],
           [ 0.      ,  0.      ],
           [ 1.224745,  1.224745]])
    

    如您所见,我们有fittedtransformed 连续训练数据,而我们只有transformed 测试数据,无需对其进行拟合。 连续拟合和转换是 fit_transform 方法的用武之地。 这样对于训练数据我们可以直接做:

    X_train = sc.fit_transform(X_train)
    
    array([[-1.224745, -1.224745],
           [ 0.      ,  0.      ],
           [ 1.224745,  1.224745]])
    

    此方法拟合数据然后对其进行转换。但是你不能只转换数据而不适合它。 现在您已经使用fit_transform 或仅使用fit 拟合了您的训练数据,现在您可以使用与训练数据相同的拟合信息来转换您的测试数据。

    希望这已经足够清楚了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2019-09-25
      • 2022-08-20
      • 2019-05-10
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多