所以在 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]])
如您所见,我们有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 或仅使用fit 拟合了您的训练数据,现在您可以使用与训练数据相同的拟合信息来转换您的测试数据。
希望这已经足够清楚了。