繁体   English   中英

当我们使用transform得到相同的output时为什么要使用fit_transform方法

[英]Why should we use the fit_transform method when we get the same output using transform

我不明白为什么必须使用fit_transform方法,当transform方法可以给出与仅使用拟合变换方法相同的 output 时, fit方法的整体点是什么?

我已经打印了x_trainx_test ,它们都给出了类似的 output。

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

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

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

function fit_transform() 做了 fit() 后跟 transform() 会做的事情。

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

因此,在 sickit 学习预处理器中,您通常总是有一个fit 、一个transform和一个 'fit_transform' 方法。

区别如下:

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

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

在这里,您正在准备标准缩放器 object

sc = StandardScaler()

这个 object 必须有一些参数保存数据的平均值等信息但是由于它还没有看到任何数据,所以这个平均值还不存在,所以下面的代码将显示错误

print(sc.mean_)

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

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

sc.fit(X_train)

让我们看看这个操作之后发生了什么

print(sc.mean_)

[3. 4.]

现在我们可以看到我们的标准缩放器 object 已经计算了他所看到的数据的平均值并将其存储在它的属性之一中,这里是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]])

如您所见,我们已经连续fitted然后transformed了我们的训练数据,而我们只transformed了我们的测试数据而不需要拟合它。 连续拟合和转换是fit_transform方法的用武之地。因此对于训练数据,我们可以直接执行以下操作:

X_train = sc.fit_transform(X_train)

array([[-1.224745, -1.224745],
       [ 0.      ,  0.      ],
       [ 1.224745,  1.224745]])

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

希望这已经足够清楚了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM