使用LSTM与多变量进行时间序列预测

时间:2019-07-24 03:55:25

标签: python time-series lstm prediction

我正在处理一组数据,这些数据的Y值是X1和X2两个参数的函数。我可以基于单个变量(X1或X2)创建LSTM模型。

我对您的问题是:

  1. 如何以LSTM可以同时考虑X1和X2进行培训,测试和预测的方式扩展代码?
  2. 我有0到1000个小时的真实数据。
  3. 如何从训练后的模型中生成超过1000小时的预测数据?

下面是1个变量的代码...

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('pressure.csv')
df['Date'] = pd.to_datetime(df["Date"])
df_idx = df.set_index(["Date"], drop=True)
df_idx.head(5)

df_idx = df_idx.sort_index(axis=1, ascending=True)
df_idx = df_idx.iloc[::-1]

data = df_idx[['BHP']]
data.plot(y='BBHP')

diff = data.index.values[-1] - data.index.values[0]
days = diff.astype('timedelta64[D]')
days = days / np.timedelta64(1, 'D')
years = int(days/365)
print("Total data: %d years"%years)
print("80 percent data = 1980 to %d"%(1980 + int(0.8*years)))

split_date = pd.Timestamp('01-01-2009')

train = data.loc[:split_date]
test = data.loc[split_date:]

ax = train.plot(figsize=(10,12))
test.plot(ax=ax)
plt.legend(['train', 'test'])
plt.show()

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
train_sc = sc.fit_transform(train)
test_sc = sc.transform(test)

train_sc_df = pd.DataFrame(train_sc, columns=['Y'], index=train.index)
test_sc_df = pd.DataFrame(test_sc, columns=['Y'], index=test.index)

for s in range(1,2):
    train_sc_df['X_{}'.format(s)] = train_sc_df['Y'].shift(s)
    test_sc_df['X_{}'.format(s)] = test_sc_df['Y'].shift(s)

X_train = train_sc_df.dropna().drop('Y', axis=1)
y_train = train_sc_df.dropna().drop('X_1', axis=1)

X_test = test_sc_df.dropna().drop('Y', axis=1)
y_test = test_sc_df.dropna().drop('X_1', axis=1)

X_train = X_train.as_matrix()
y_train = y_train.as_matrix()

X_test = X_test.as_matrix()
y_test = y_test.as_matrix()

print('Train size: (%d x %d)'%(X_train.shape[0], X_train.shape[1]))
print('Test size: (%d x %d)'%(X_test.shape[0], X_test.shape[1]))

from sklearn.svm import SVR
regressor = SVR(kernel='rbf')

regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)


from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import keras.backend as K

K.clear_session()
model = Sequential()
model.add(Dense(50, input_shape=(X_test.shape[1],), activation='relu', kernel_initializer='lecun_uniform'))
model.add(Dense(50, input_shape=(X_test.shape[1],), activation='relu'))
model.add(Dense(1))
model.compile(optimizer=Adam(lr=0.001), loss='mean_squared_error')
model.fit(X_train, y_train, batch_size=16, epochs=20, verbose=1)


y_pred = model.predict(X_test)
plt.plot(y_test)
plt.plot(y_pred)
plt.show()
print('R-Squared: %f'%(r2_score(y_test, y_pred)))

0 个答案:

没有答案