我正在做一个自编码器模型。我之前保存了模型,并在保存前使用Min-Max缩放器对数据进行了缩放。
X_train = df.valuesscaler = MinMaxScaler()X_train_scaled = scaler.fit_transform(X_train)
完成这些步骤后,我对模型进行了拟合并将其保存为’h5’文件。现在,当我输入测试数据时,加载保存的模型后,数据自然也应该进行缩放。
因此,当我加载模型并使用以下代码进行缩放时
X_test_scaled = scaler.transform(X_test)
它会报错
NotFittedError: This MinMaxScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.
所以我尝试使用X_test_scaled = scaler.fit_transform(X_test)
(我隐约觉得这很愚蠢),确实得到了结果(在加载保存的模型和测试数据后),但结果与我训练和测试时一起运行的结果不同。我已经为此目的保存了大约4000个模型(所以我不能重新训练并保存所有模型,因为这需要很多时间,我希望找到一个解决方案)。
有没有一种方法可以像我训练时那样,通过转换来缩放测试数据(可能是保存缩放后的值,我不知道)。或者可能是反缩放模型,以便我可以在未缩放的数据上测试模型。
如果我对任何一点强调不足或过度,请在评论中告诉我!
回答:
X_test_scaled = scaler.fit_transform(X_test)
将根据X_test
中特征的最小值和最大值来缩放X_test
,而不是X_train
。
你的原始代码无法工作的原因可能是你没有在X_train
上拟合后保存scaler
,或者以某种方式覆盖了它(例如,通过重新初始化它)。这就是为什么会抛出错误,因为scaler
没有拟合到任何数据上。
当你随后调用X_test_scaled = scaler.fit_transform(X_test)
时,你是在X_test
上拟合scaler
并同时转换X_test
,这就是为什么代码能够运行,但正如你所猜测的,这个步骤是错误的。
你想要的应该是
X_train = df.valuesscaler = MinMaxScaler()X_train_scaled = scaler.fit_transform(X_train)# 保存缩放器import pickle as pklwith open("scaler.pkl", "wb") as outfile: pkl.dump(scaler, outfile)# 训练你的自编码器的其他代码# ...
然后在你的测试脚本中
# 在测试时# 加载在训练数据上拟合的缩放器with open("scaler.pkl", "rb") as infile: scaler = pkl.load(infile) X_test_scaled = scaler.transform(X_test) # 注意:不是fit_transform。
请注意,你在从磁盘加载scaler
对象后不需要重新拟合。它包含了从训练数据中获得的所有信息(缩放因子等)。你只需在X_test
上调用它即可。