如何使用多个输入LSTM进行`model.predict`的`scaler.transform`结果?

时间:2019-08-24 19:16:26

标签: python tensorflow machine-learning deep-learning preprocessor

这是我的代码:

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)形状。

如果我在transform之前model.predict,则无法transform,因为尺寸为3,

如果我在transform之后model.predict,形状是(n,1),那么我就不能transform

因此,我无法在scaler.transform上应用model.predict()

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的问题有点不清楚,但是根据您提供的信息,我正在提出自己的看法。

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

signal_data = scaler.fit_transform(signal_data)

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

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