加载模型时如何使用 min max scaler 拟合测试数据?
How can I fit the test data using min max scaler when I am loading the model?
我正在做自动编码器 model.I 已经保存了模型,之前我使用 min max scaler 缩放了数据。
X_train = df.values
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
完成此操作后,我安装了模型并将其保存为 'h5' file.Now 当我提供测试数据时,在加载保存的模型后自然应该缩放它。
因此,当我加载模型并使用
对其进行缩放时
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_train
中特征的最小值和最大值缩放 X_test
。
您的原始代码不起作用的原因是
您可能在将 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
.
上调用它
我正在做自动编码器 model.I 已经保存了模型,之前我使用 min max scaler 缩放了数据。
X_train = df.values
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
完成此操作后,我安装了模型并将其保存为 'h5' file.Now 当我提供测试数据时,在加载保存的模型后自然应该缩放它。
因此,当我加载模型并使用
对其进行缩放时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_train
中特征的最小值和最大值缩放 X_test
。
您的原始代码不起作用的原因是
您可能在将 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
.