sklearn StandardScaler,不允许直接转换,我们需要fit_transform

时间:2018-08-23 14:20:50

标签: python-3.x machine-learning scikit-learn data-science

fit_transform和transform有什么区别? 为什么不能直接进行转换?

from sklearn.preprocessing import StandardScaler

 X_scaler = StandardScaler()
 X_train = X_scaler.fit_transform(X_train)
 X_test = X_scaler.transform(X_test)

如果直接进行转换,则会出现以下错误

  

NotFittedError:此StandardScaler实例尚未安装。呼叫   使用此方法之前,请先“匹配”适当的参数。

1 个答案:

答案 0 :(得分:3)

StandardScaler,如per documentation

  

通过去除均值并缩放到单位方差来标准化特征

因此,它需要以某种方式首先了解数据的均值和方差。 因此,需要fit()fit_transform(),以便StandardScaler遍历您的所有数据以找到均值和方差。那些可以访问 按属性:

  

平均值_ :训练集中每个要素(列)的平均值。

     

var _ :训练集中每个功能的方差。

请注意,这些将针对数据中的每一列分别计算。

transform()中,它将仅使用那些meanvariance值来缩放数据。

现在您可能会说为什么在transform()期间它不计算那些属性。这样做是为了以与训练数据缩放相同的方式缩放测试数据(来自fit_transform())。如果您在每次调用transform()时计算数据的均值和方差,那么所有传递的数据将具有不同的标度,这不是您想要的。

对于所有scikit变压器都是如此。

1)fit()-仅遍历数据并保存所有需要的数据属性

2)transform()-使用fit()中保存的属性来更改数据

3)fit_transform()-实用程序功能,先fit(),然后transform()相同的数据。

通常,您会在训练数据上致电fit_transform(),而在测试数据上只会致电transform()