从缩放参数初始化StandardScaler

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

我之前已经安装了数据,我保存了scaler.mean_scaler.var_阵列。我知道我可以腌制整个StandardScaler()对象并在以后使用它来转换新数据。

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

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

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

NotFittedError:此StandardScaler实例尚未安装。在使用此方法之前,使用适当的参数调用'fit'。

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

有什么建议可以这么做吗?

python scikit-learn
2个回答
2
投票

详细说明我的评论 - 你确实可以适应然后覆盖,形状没问题。此外,缩放参数是.scale_.mean_,而不是'.var_and '.mean_。 正如你所看到的,它确实是hacky而不是很漂亮,但它有效:

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

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_

© www.soinside.com 2019 - 2024. All rights reserved.