我之前已经安装了数据,我保存了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)
进行初始化,但我得到了相同的结果。
有什么建议可以这么做吗?
详细说明我的评论 - 你确实可以适应然后覆盖,形状没问题。此外,缩放参数是.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
我想我找到了解决方案。我没有设置所有三个属性: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_
。