【发布时间】:2020-12-17 17:56:57
【问题描述】:
我的数据框是按小时计算的(我的 df 的索引),我想预测 y。
> df.head()
Date y
2019-10-03 00:00:00 343
2019-10-03 01:00:00 101
2019-10-03 02:00:00 70
2019-10-03 03:00:00 67
2019-10-03 04:00:00 122
我现在将导入库并训练模型:
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
prediction_hours = 24
df_train= df[:len(df)-prediction_hours]
df_test= df[len(df)-prediction_hours:]
print(df_train.head())
print('/////////////////////////////////////////')
print (df_test.head())
training_set = df_train.values
training_set = min_max_scaler.fit_transform(training_set)
x_train = training_set[0:len(training_set)-1]
y_train = training_set[1:len(training_set)]
x_train = np.reshape(x_train, (len(x_train), 1, 1))
num_units = 2
activation_function = 'sigmoid'
optimizer = 'adam'
loss_function = 'mean_squared_error'
batch_size = 10
num_epochs = 100
regressor = Sequential()
regressor.add(LSTM(units = num_units, activation = activation_function, input_shape=(None, 1)))
regressor.add(Dense(units = 1))
regressor.compile(optimizer = optimizer, loss = loss_function)
regressor.fit(x_train, y_train, batch_size = batch_size, epochs = num_epochs)
在训练之后,我实际上可以在我的测试数据上使用它:
test_set = df_test.values
inputs = np.reshape(test_set, (len(test_set), 1))
inputs = min_max_scaler.transform(inputs)
inputs = np.reshape(inputs, (len(inputs), 1, 1))
predicted_y = regressor.predict(inputs)
predicted_y = min_max_scaler.inverse_transform(predicted_y)
这是我得到的预测:
预测实际上相当不错:是不是好得令人难以置信?我做错什么了吗?我从一个 GitHub 实现一步一步地跟着实现。
我想添加一些外生变量,即v1、v2、v3。如果我的数据集现在看起来像这样带有新变量,
df.head()
Date y v1 v2 v3
2019-10-03 00:00:00 343 4 6 10
2019-10-03 01:00:00 101 3 2 24
2019-10-03 02:00:00 70 0 0 50
2019-10-03 03:00:00 67 0 4 54
2019-10-03 04:00:00 122 3 3 23
如何在我的 LSTM 模型中包含这些变量 v1、v2 和 v3?多元 LSTM 的实现让我很困惑。
编辑以回答 Yoan 的建议:
对于以日期为索引并具有 y、v1、v2 和 v3 列的数据框,我按照建议执行了以下操作:
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
prediction_hours = 24
df_train= df[:len(df)-prediction_hours]
df_test= df[len(df)-prediction_hours:]
print(df_train.head())
print('/////////////////////////////////////////')
print (df_test.head())
training_set = df_train.values
training_set = min_max_scaler.fit_transform(training_set)
x_train = np.reshape(x_train, (len(x_train), 1, 4))
y_train = training_set[0:len(training_set),1] #I've tried with 0:len.. and
#for 1:len..
num_units = 2
activation_function = 'sigmoid'
optimizer = 'adam'
loss_function = 'mean_squared_error'
batch_size = 10
num_epochs = 100
regressor = Sequential()
regressor.add(LSTM(units = num_units, activation = activation_function,
input_shape=(None, 1,4)))
regressor.add(Dense(units = 1))
regressor.compile(optimizer = optimizer, loss = loss_function)
regressor.fit(x_train, y_train, batch_size = batch_size, epochs =
num_epochs)
但我收到以下错误:
only integer scalar arrays can be converted to a scalar index
【问题讨论】:
-
考虑到您的模型建立在对如何为 RNN 准备数据的许多误解之上,我不知道从哪里开始。使用 LSTM 的主要目的是从数据的序列中学习。因此,您需要在给定输入数据的情况下以某种方式构建这些序列。我的建议是通读 tensorflow.org/tutorials/structured_data/… 或查看 Kaggle.com 上与 LSTM 相关的笔记本
-
为了具体提示您的问题,您是否提供单个或多个变量作为输入应该没有区别,因为您可以像在代码中一样使用整个 DataFrame
-
您的输出不太好,令人难以置信:它显示了所有点 除了 2 的错误率。似乎您的测试数据很少(只有 24 个样本),而您'将 LSTM 与 2 个单元一起用于只有一个点的序列 - 而不是序列(这是一种浪费,因为您根本没有使用 LSTM 内存并忘记了门)
-
对
x_train进行两次整形正常吗?这可能就是您获得额外维度的原因 -
@YoanB.M.Sc 我只改造过一次。我在这里写错了。
标签: python keras lstm recurrent-neural-network forecasting