如何使用多输入 LSTM 得到 `model.predict` 的 `scaler.transform` 结果?

How to `scaler.transform` result of `model.predict` with multiple input LSTM?

这是我的代码:

def create_dataset(signal_data, look_back=1):
    dataX, dataY = [], []
    for i in range(len(signal_data) - look_back):
        dataX.append(signal_data[i:(i + look_back), :])
        dataY.append(signal_data[i + look_back, -1])
    return np.array(dataX), np.array(dataY)

look_back = 20


df = pd.read_csv('stock.csv')

signal_data = df[["close", "open", "high", "low", "volume"]].values.astype('float32')


scaler = MinMaxScaler()
signal_data = scaler.fit_transform(signal_data)

train_size = int(len(signal_data) * 0.80)
test_size = len(signal_data) - train_size
train = signal_data[0:train_size]
test = signal_data[train_size:]

x_train, y_train = create_dataset(train, look_back)
x_test, y_test = create_dataset(test, look_back)
...
model.add(LSTM)

当我执行predict = model.predict(x_test)scaler.transfrom(predict)时,出现错误:

on-broadcastable output operand with shape (5,1) doesn't match the broadcast shape (5,5)

数据集有 5 个特征。当我使用 model.predict() 时,输出形状是 (n, 1),但 scaler.transform 需要 (n, 5) 形状。

如果我在model.predict之前transform,我不能transform因为维度是3,

如果我 transformmodel.predict 之后,形状是 (n, 1) 所以我不能 transform.

所以,我无法在 model.predict() 上应用 scaler.transform

我该如何解决这个问题?

你的问题有点不清楚,但根据你提供的信息,我提出我的看法。

您已经使用以下代码转换了整个数据集:

signal_data = scaler.fit_transform(signal_data)

因此,您无需再次转换您的 x_test。你可以直接调用model.predict就可以了。如果您正在测试尚未按上述方式转换的新数据,则必须对其进行转换。确保这个新的测试数据集也有 5 个特征(而不是 3 个),因为你的模型已经在 5 个特征上进行了训练。

最后,在时间序列预测结束后,如果您希望将缩放后的数据转换回原始版本,您可以使用 MinMaxScaler 实例的 inverse_transform 函数。