加载模型时如何使用 min max scaler 拟合测试数据?

Fas*_*sty 3 python scaling test-data machine-learning normalization

我正在做自动编码器模型。我已经保存了模型,在此之前我使用 min max scaler 缩放了数据。

X_train = df.values
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我安装了模型并将其保存为“h5”文件。现在当我提供测试数据时,在自然加载保存的模型后,它也应该进行缩放。

所以当我加载模型并使用

X_test_scaled  = scaler.transform(X_test)
Run Code Online (Sandbox Code Playgroud)

它给出了错误

NotFittedError: This MinMaxScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.
Run Code Online (Sandbox Code Playgroud)

所以我给出了X_test_scaled = scaler.fit_transform(X_test) (我有一种预感,它是愚蠢的)确实给出了一个结果(在加载保存的模型和测试之后),当我训练它并一起测试时它是不同的。为了我的目的,我现在已经保存了大约 4000 个模型(所以我无法训练并再次保存它,因为它花费了很多时间,所以我想要一条出路)。

有没有一种方法可以通过按照我训练的方式对其进行转换来缩放测试数据(可能是保存缩放值,我不知道)。或者可以对模型进行去缩放,以便我可以在非缩放数据上测试模型.

如果我没有强调或过分强调任何一点,请在评论中告诉我!

lig*_*ist 5

X_test_scaled  = scaler.fit_transform(X_test)
Run Code Online (Sandbox Code Playgroud)

将在X_test给定X_testnot 中特征的最小值和最大值的情况下进行缩放X_train

您的原始代码不起作用的原因是因为您可能scaler在将其拟合X_train或以某种方式覆盖后没有保存(例如,通过重新初始化它)。这就是错误被抛出的原因,因为scaler它不适合任何数据。

当你再调用X_test_scaled = scaler.fit_transform(X_test),你是装修scaler,以X_test同时tranforming 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
# ...
Run Code Online (Sandbox Code Playgroud)

然后在你的测试脚本中

# 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.
Run Code Online (Sandbox Code Playgroud)

请注意scaler,从磁盘加载回对象后,您不必重新调整对象。它包含从训练数据中获得的所有信息(缩放因子等)。你只需调用它X_test