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 实例尚未安装。称呼 在使用此方法之前“适合”适当的参数。
StandardScaler
,如 每个文档:
通过去除均值并缩放至单位方差来标准化特征
因此它需要首先以某种方式了解数据的均值和方差。 因此需要
fit()
或 fit_transform()
以便 StandardScaler
可以遍历所有数据来找到均值和方差。那些可以访问
按属性:
mean_:训练集中每个特征(列)的平均值。
var_:训练集中每个特征的方差。
请注意,这些将针对数据中的每一列单独计算。
在
transform()
中,它将仅使用那些 mean
和 variance
值来缩放数据。
现在您可能会说为什么它不在
transform()
期间计算这些属性。这样做是为了使测试数据的缩放方式与训练数据的缩放方式相同(来自 fit_transform()
)。如果您在每次调用 transform()
时计算数据的均值和方差,那么所有传递的数据将具有不同的比例,这不是您想要的。
对于所有 scikit 变压器来说都是如此。
1)
fit()
- 只会遍历数据并保存数据的所有需要的属性
2)
transform()
- 使用fit()
中保存的属性来更改数据
3)
fit_transform()
- 效用函数fit()
,然后transform()
相同的数据。
通常您会在训练数据上调用
fit_transform()
,而在测试数据上仅调用 transform()
。
您需要记住平均值_和比例_,如下所示:
您可以在拟合模型后打印平均值_和比例_。
scalerModel = StandardScaler()
X = scalerModel.fit_transform(X)
print("scalerModel mean: ", **scaler**.mean_)
print("**Scaler** scale: ", **scaler**.scale_)
示例值如下:
scalerModel mean: [ 9.978054e+05, 1.904232e+01,5.000918e+01]
scalerModel scale: [ 5.75234545e+05,1.15379326e+01,2.83283511e+01]
当您再次需要 Scaler 时,即进行预测时(scaler1 是新的缩放器,以确保不要使用旧的缩放器): 当您在加载模型后或通过任何其他方式需要缩放器时,创建一个新的缩放器并设置从上面恢复的mean_和scale_值。
scaler1 = StandardScaler()
scaler1.mean_ = np.array([ 9.978054e+05, 1.904232e+01,5.000918e+01])
scaler1.scale_ = np.array([ 5.75234545e+05,1.15379326e+01,2.83283511e+01])
# then use it to transform your data
X = scaler1.transform(X)