如何在加载模型时使用Min-Max缩放器对测试数据进行拟合?

我正在做一个自编码器模型。我之前保存了模型,并在保存前使用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上调用它即可。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注