Как можно добиться прогнозирования на основе истории LSTM / RNN с помощью бэкэнда Keras? - PullRequest
0 голосов
/ 20 мая 2019

Для моего эксперимента у меня есть отформатированный файл csv с 1440 столбцами, подобный следующему:

timestamps[row_index] | feature1  | feature2 | ... | feature1439 | feature1440 |
-----------------------------------------------------------------
       1              |  1.00     |   0.32   |   0.30   |   0.30  |   0.30   | 
       2              |  0.35     |   0.33   |   0.30   |   0.30  |   0.30   | 
       3              |  1.00     |   0.33   |   0.30   |   0.30  |   0.30   | 
      ...             |   ....    |   ....   |   ....   |   ....  |   ....   | 
                      | -1.00     |   0.26   |   0.30   |   0.30  |   0.30   | 
                      |   0.67    |   0.03   |   0.30   |   0.30  |   0.30   | 
                      |   0.75    |   0.42   |   0.30   |   0.30  |   0.30   | 
      30              |  -0.36    |   0.42   |   0.30   |   0.30  |   0.30   | 
      ...             |   ....    |   ....   |   ....   |   ....  |   ....   | 
      40              |   1.00    |   0.34   |   0.30   |   0.30  |  -1.00   |

img

Я хотел предсказать значения 960 из 1440 столбцов путем индексации заинтересованных столбцов после определенной временной отметки t = 30 и прогнозирования будущих временных отметок на основе истории до конца набора данных [t + 1 = 31 до т + 10 = 40]. img

До сих пор я нашел 2 разных сценария A и B, но я не уверен, какой из них идеально подходит для правильной истории, чтобы достичь хороших результатов. Я просто знаю, что сценарий A просматривает последние 10 предыдущих столбцов time_stamps и прогнозирует t + 1, пока я не уверен, как работает сценарий B?

в чем разница между ними? какой из них лучше?

Как можно выбрать правильный размер окна для выполнения вышеупомянутой задачи по прогнозированию после определенной отметки времени (альтернативно индекс строки)?

train size: (30, 10, 1440)     # time_stamps or row index [0-30]
train Label size: (30, 960)
test size: (10, 10, 1440)      # time_stamps or row index[31-40]
test Label size: (10, 960)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras.layers import Dense , Activation , BatchNormalization
from keras.layers import Dropout
from keras.layers import LSTM,SimpleRNN
from keras.models import Sequential
from keras.optimizers import Adam, RMSprop

data_train = pd.read_csv("D:\train.csv", header=None)
#select interested columns to predict 980 out of 1440
j=0
index=[]
for i in range(1439):
    if j==2:
        j=0
        continue
    else:
        index.append(i)
        j+=1

Y_train= data_train[index]
data_train = data_train.values
print("data_train size: {}".format(Y_train.shape))

Сценарий создания истории

def create_dataset(dataset,data_train,look_back=1):
    dataX,dataY = [],[]
    print("Len:",len(dataset)-look_back-1)

    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), :]
        dataX.append(a)
        dataY.append(data_train[i + look_back,  :])
    return np.array(dataX), np.array(dataY)

look_back = 10
trainX,trainY = create_dataset(data_train,Y_train, look_back=look_back)
#testX,testY = create_dataset(data_test,Y_test, look_back=look_back)
trainX, testX, trainY, testY = train_test_split(trainX,trainY, test_size=0.2)
print("train size: {}".format(trainX.shape))
print("train Label size: {}".format(trainY.shape))
print("test size: {}".format(testX.shape))
print("test Label size: {}".format(testY.shape))

Len: 29
train size: (23, 10, 1440)
train Label size: (23, 960)
test size: (6, 10, 1440)
test Label size: (6, 960)

Сценарий B для создания истории

def create_sequences(data, window=15, step=1, prediction_distance=15):
    dataX = []
    dataY = []

    for i in range(0, len(data) - window - prediction_distance, step):
        dataX.append(data[i:i + window])
        dataY.append(data[i + window + prediction_distance][1])

    dataX, dataY = np.asarray(dataX), np.asarray(dataY)

    return np.array(dataX), np.array(dataY)

# Build sequences
x_sequence, y_sequence = create_sequences(data_train)

test_len = int(len(x_sequence) * 0.90)
valid_len = int(len(x_sequence) * 0.90)
train_end = len(x_sequence) - (test_len + valid_len)
trainX, trainY = x_sequence[:train_end], y_sequence[:train_end]
validX, validY = x_sequence[train_end:train_end + valid_len], y_sequence[train_end:train_end + valid_len]
testX, testY = x_sequence[train_end + valid_len:], y_sequence[train_end + valid_len:]

print("train size: {}".format(trainX.shape))
print("train Label size: {}".format(trainY.shape))
print("test size: {}".format(testX.shape))
print("test Label size: {}".format(testY.shape))

train size: (2, 15, 1440)
train Label size: (2,)
test size: (9, 15, 1440)
test Label size: (9,)

RNN, LSTM, GRU реализация аналогично

# create and fit the SimpleRNN model
model_RNN = Sequential()
model_RNN.add(SimpleRNN(units=1440, input_shape=(trainX.shape[1], trainX.shape[2])))
model_RNN.add(Dense(960))
model_RNN.add(BatchNormalization())
model_RNN.add(Activation('tanh'))
model_RNN.compile(loss='mean_squared_error', optimizer='adam')
callbacks = [
    EarlyStopping(patience=10, verbose=1),
    ReduceLROnPlateau(factor=0.1, patience=3, min_lr=0.00001, verbose=1)]
hist_RNN=model_RNN.fit(trainX, trainY, epochs =50, batch_size =20,validation_data=(testX,testY),verbose=1, callbacks=callbacks)

В итоге я бы ожидал следующий вывод сюжета: img

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...