多元LSTM模型预测值如何执行inverse_transform逆变换还原?
问题原因及解决方案
错误根因说明
- 第一次反归一化报错:你初始化
MinMaxScaler时用的是包含5个特征的训练集拟合的,scaler默认要求输入反归一化的数据特征数必须和拟合时的特征数一致,你直接输入形状为(1000,1)的预测值,特征数不匹配,所以触发维度错误。 - 第二次reshape报错:你的
x_test形状为(1000, 50, 5),总元素数为1000505=250000,你尝试直接reshape为(1000,5)总元素数仅为5000,维度完全不匹配,自然报错。你参考的示例代码逻辑是需要取每个样本最后一个时间步的特征,而非直接对整个三维数组reshape。
正确实现代码
import numpy as np from sklearn.metrics import mean_squared_error from math import sqrt # 1. 得到预测结果,形状为(1000, 1) yhat = model.predict(x_test) # 2. 提取x_test每个样本最后一个时间步的所有5个特征,形状变为(1000,5) test_X_last = x_test[:, -1, :] # 3. 拼接预测值和除目标特征外的其余4个特征,得到符合scaler要求的5维输入 inv_yhat = np.concatenate((yhat, test_X_last[:, 1:]), axis=1) # 4. 反归一化后提取第一列即目标特征的真实预测值 inv_yhat = scaler.inverse_transform(inv_yhat) inv_yhat = inv_yhat[:,0] # 5. 对真实值做同样的反归一化处理 test_y = y_test.reshape((len(y_test), 1)) inv_y = np.concatenate((test_y, test_X_last[:, 1:]), axis=1) inv_y = scaler.inverse_transform(inv_y) inv_y = inv_y[:,0] # 6. 计算RMSE rmse = sqrt(mean_squared_error(inv_y, inv_yhat)) print('Test RMSE: %.3f' % rmse)
注意事项
如果你的目标特征不是第0列,只需要调整拼接时的列索引、以及反归一化后提取的列索引即可,保证拼接后的数据特征顺序和拟合scaler时的特征顺序完全一致。
内容的提问来源于stack exchange,提问作者Zebra125
相关产品推荐
相关产品推荐

