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

问题描述 投票:0回答:2

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 实例尚未安装。称呼 在使用此方法之前“适合”适当的参数。

python-3.x machine-learning scikit-learn data-science
2个回答
10
投票

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


0
投票

您需要记住平均值_和比例_,如下所示:

您可以在拟合模型后打印平均值_和比例_。

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)
© www.soinside.com 2019 - 2024. All rights reserved.