使用Sklearn的MinMaxScaler对TensorFlow预测值反转换报错如何解决
问题原因
- Sklearn的
MinMaxScaler仅支持输入维度≤2的数组执行变换/反变换,你的trainPredict/testPredict是时序模型输出的3维数组,格式为(样本数, 时间步长, 输出特征数),不符合输入要求 - 你训练scaler时用的原始数据集是3个特征,反变换时输入的数组特征数也必须和训练时一致,否则也会触发维度错误
解决代码
import numpy as np # 1. 把3维预测结果转为2维:(样本数*时间步, 1) trainPredict_2d = trainPredict.reshape(-1, 1) testPredict_2d = testPredict.reshape(-1, 1) # 2. 补全特征列:因为scaler是在3特征数据集上训练的,需要构造和训练时特征数一致的数组 # 假设你的预测值对应原始数据集的第0列,就把另外两列补0即可(反变换时只有目标列的数值有效) trainPredict_full = np.zeros(shape=(len(trainPredict_2d), 3)) trainPredict_full[:,0] = trainPredict_2d[:,0] # 0对应你目标特征的原始列索引,按需修改 testPredict_full = np.zeros(shape=(len(testPredict_2d), 3)) testPredict_full[:,0] = testPredict_2d[:,0] # 3. 执行反变换,再提取目标列的结果 trainPredict_ = scaler.inverse_transform(trainPredict_full)[:,0] testPredict_ = scaler.inverse_transform(testPredict_full)[:,0] # 同样处理trainY和testY,先确认维度,如果是3维也先reshape成2维,再补全特征后反变换 trainY_2d = trainY.reshape(-1,1) trainY_full = np.zeros(shape=(len(trainY_2d), 3)) trainY_full[:,0] = trainY_2d[:,0] trainY_ = scaler.inverse_transform(trainY_full)[:,0] testY_2d = testY.reshape(-1,1) testY_full = np.zeros(shape=(len(testY_2d), 3)) testY_full[:,0] = testY_2d[:,0] testY_ = scaler.inverse_transform(testY_full)[:,0]
补充说明
- 上述代码中目标特征的列索引请根据你自己的数据集实际情况修改,如果你预测的是原始数据的第2列,就把
[:,0]改成[:,2] - 如果你需要反变换后保留原来的(样本数, 时间步)维度,可在提取目标列后再reshape回对应形状,例如:
trainPredict_ = trainPredict_.reshape(406,7) - 如果你的训练和预测只用到了单个特征,建议在最初训练scaler的时候就只传入目标特征列,这样后续反变换不需要补其他特征列,代码更简洁。
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

