通过缩放参数初始化StandardScaler

时间:2019-04-17 16:11:09

标签: python scikit-learn

我以前已经拟合了数据,并且保存了scaler.mean_scaler.var_数组。我知道我可以腌制整个StandardScaler()对象,以后再用它来转换新数据。

但是,我需要知道是否可以从保存的均值和方差数组中再次生成StandardScaler()对象,例如:

scaler = StandardScaler()
scaler.mean_ = mean_array
scaler.var_ = var_array
new_data = scaler.transform(new_data)

很显然,新数据具有相同的格式(要素数量)。我可以手动完成此操作,但我希望可以将缩放参数再次加载到对象并使用它。当我运行上面的代码时,错误是:

  

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

我也尝试使用scaler = StandardScaler(copy=False)进行初始化,但是结果相同。

任何建议如何解决?

2 个答案:

答案 0 :(得分:2)

要详细说明我的意见-您确实可以先安装然后覆盖,形状没有问题。同样,缩放参数是.scale_.mean_,而不是'.var _ and '.mean_
如您所见,它确实很笨拙而且不漂亮,但是它可以工作:

df = pd.DataFrame.from_dict({'a': [13,14,15],'b':[-1,1,2]}).astype(float)
scaler = StandardScaler()
scaler.fit(df)
print(scaler.scale_, scaler.mean_, scaler.var_)

df2 = df.copy(deep=True)
df2[df.columns] = scaler.transform(df)
print(df2)

scaler.scale_ = [1,1]
df3 = df.copy(deep=True)
df3[df.columns] = scaler.transform(df)

print(df3)

[0.81649658 1.24721913] [14.          0.66666667] [0.66666667 1.55555556]

      a         b
0 -1.224745 -1.336306
1  0.000000  0.267261
2  1.224745  1.069045

    a         b
0 -1.0 -1.666667
1  0.0  0.333333
2  1.0  1.333333

答案 1 :(得分:2)

我想我找到了解决方案。我没有设置所有三个属性:scale_mean_var_(我仅设置了最后两个)。

因此,作为Itamar示例的延续,此代码有效:

df = pd.DataFrame.from_dict({'a': [13,14,15],'b':[-1,1,2]}).astype(float)
scaler = StandardScaler()
scaler.fit(df)
print(scaler.scale_, scaler.mean_, scaler.var_)

df2 = df.copy(deep=True)
df2[df.columns] = scaler.transform(df)
print(df2)

# Initialise completely the scaler object
scaler = StandardScaler()

# Using the standard deviation, mean and variance results from above.
scaler.scale_ = np.array([0.81649658, 1.24721913])
scaler.mean_ = np.array([14.0, 0.66666667])
scaler.var_ = np.array([0.66666667, 1.55555556])

df3 = df.copy(deep=True)
df3[df.columns] = scaler.transform(df)
print(df3)

打印:

[ 0.81649658  1.24721913] [ 14.           0.66666667] [ 0.66666667  1.55555556]

          a         b
0 -1.224745 -1.336306
1  0.000000  0.267261
2  1.224745  1.069045

          a         b
0 -1.224745 -1.336306
1  0.000000  0.267261
2  1.224745  1.069045

哪个是预期的相同结果。 NotFittedError的问题在增加,因为我只设置了mean_var_,而不是scale_,因为我只保存了这两个。就我而言,我可以通过以下方式重现后者:

scaler.scale_ = np.sqrt(scaler.var_),当然要先设置scaler.var_