如何使用多输入 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,
如果我 transform
在 model.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
函数。
这是我的代码:
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,
如果我 transform
在 model.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
函数。