我以前已经拟合了数据,并且保存了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)
进行初始化,但是结果相同。
任何建议如何解决?
答案 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_
。