python - 加载模型时,如何使用 min max scaler 拟合测试数据?
问题描述
我正在做自动编码器模型。我已经保存了模型,在此之前我使用 min max scaler 缩放了数据。
X_train = df.values
scaler = 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)
将根据 in和notX_test
的特征的最小值和最大值进行缩放。X_test
X_train
您的原始代码不起作用的原因是因为您可能scaler
在将其适配X_train
或以某种方式覆盖它之后没有保存(例如,通过重新初始化它)。这就是错误被抛出的原因,因为scaler
它不适合任何数据。
然后,当您调用 时X_test_scaled = scaler.fit_transform(X_test)
,您正在适应scaler
并X_test
同时转换X_test
,这就是代码能够运行的原因,但是正如您已经推测的那样,这一步是不正确的。
你想要的是
X_train = df.values
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
# Save scaler
import pickle as pkl
with open("scaler.pkl", "wb") as outfile:
pkl.dump(scaler, outfile)
# Some other code for training your autoencoder
# ...
然后在你的测试脚本中
# During test time
# Load scaler that was fitted on training data
with open("scaler.pkl", "rb") as infile:
scaler = pkl.load(infile)
X_test_scaled = scaler.transform(X_test) # Note: not fit_transform.
scaler
请注意,从磁盘加载对象后,您不必重新调整对象。它包含从训练数据中获得的所有信息(比例因子等)。你只需调用它X_test
。
推荐阅读
- r - 在 R 中使用源、<<-、局部/全局变量和环境时出现问题
- c# - 使用 c# 将值写入已经打开的工作簿
- python - 数据帧过滤器
- docker - 在 Dockerfile 或 docker-compose 中定义环境变量?
- python - 如何将字符串类型转换为 numpy 数组?
- terraform - 如何从 Terraform 中的文件加载输入数据?
- multithreading - 为什么这种多线程冒泡排序需要这么长时间?
- pine-script - 我如何使用经过回测的策略进行实际交易?提供了示例代码
- swift - 如何在 UIStackView Swift 4 中查找所选按钮的索引
- c# - 将嵌入在 Excel 中的 PDF 保存为单独的文件