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实例尚未安装。呼叫 使用此方法之前,请先“匹配”适当的参数。
答案 0 :(得分:3)
StandardScaler
,如per documentation:
通过去除均值并缩放到单位方差来标准化特征
因此,它需要以某种方式首先了解数据的均值和方差。
因此,需要fit()
或fit_transform()
,以便StandardScaler
遍历您的所有数据以找到均值和方差。那些可以访问
按属性:
平均值_ :训练集中每个要素(列)的平均值。
var _ :训练集中每个功能的方差。
请注意,这些将针对数据中的每一列分别计算。
在transform()
中,它将仅使用那些mean
和variance
值来缩放数据。
现在您可能会说为什么在transform()
期间它不计算那些属性。这样做是为了以与训练数据缩放相同的方式缩放测试数据(来自fit_transform()
)。如果您在每次调用transform()
时计算数据的均值和方差,那么所有传递的数据将具有不同的标度,这不是您想要的。
对于所有scikit变压器都是如此。
1)fit()
-仅遍历数据并保存所有需要的数据属性
2)transform()
-使用fit()
中保存的属性来更改数据
3)fit_transform()
-实用程序功能,先fit()
,然后transform()
相同的数据。
通常,您会在训练数据上致电fit_transform()
,而在测试数据上只会致电transform()
。