Как правильно изменить данные, чтобы предсказать данные после определенной временной отметки на основе изучения данных предыдущих временных отметок в Керасе? - PullRequest
0 голосов
/ 14 мая 2019

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

Для отслеживания поведения каждой будущей метки времени имеется 1440 объектов или столбцов, которые собирают 40 точек измерения.Таким образом, для каждой временной метки у меня есть 1x1440 = 1440 точек данных.Мой набор данных выглядит следующим образом

timestamps     | 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

У меня есть общий набор данных здесь .Каждый раз 1 строка, содержащая 1440 столбцов, извлекается в RNN и проходит обучение, а в конце 40 раз (1, 1440) подает и изучает в RNN.

X_train size: (40, 1, 1440)
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

RNN, LSTM, GRUаналогично


Y_train = data_train[index]
data_train = data_train.values
X_train = data_train .reshape((data_train.shape[0], 1,data_train.shape[1]))
#--------------------------------
X_train, X_Validation, Y_train, Y_Validation = train_test_split(X_train1,Y_train1, test_size=0.2)

# create and fit the SimpleRNN model
model_RNN = Sequential()
model_RNN.add(SimpleRNN(units=1440, input_shape=(X_train.shape[1], X_train.shape[2])))
model_RNN.add(Dense(960))
model_RNN.add(BatchNormalization())
model_RNN.add(Activation('tanh'))
#sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#model_RNN.compile(loss='mean_squared_error', optimizer=sgd)
#model_RNN.compile(loss='mean_squared_error', optimizer='rmsprop')
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(X_train, Y_train, epochs =50, batch_size =20, callbacks=callbacks,validation_data=(X_Validation,Y_Validation),verbose=1)
hist_RNN=model_RNN.fit(X_train[:30, :], Y_train[:30, :], epochs =50, batch_size =20,validation_data=(X_train[30:, :], Y_train[30:, :]),verbose=1)

CNN

X_train = data_train .reshape((data_train.shape[0], 1,data_train.shape[1]))
X_test = data_test .reshape((data_test.shape[0], 1,data_test.shape[1]))
X_train.shape

from keras.layers.convolutional import ZeroPadding1D 
from keras.layers.convolutional import Conv1D,MaxPooling1D
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers.pooling import AveragePooling1D 
# create and fit the CNN model

model_CNN = Sequential()
#model_CNN.add(Reshape((6, 1), input_shape=((1,6),)))
model_CNN.add(Conv1D(200, 3, input_shape=(X_train.shape[1:]),padding='same'))
model_CNN.add(Conv1D(100, 1,))
#model_CNN.add(MaxPooling1D(2))
model_CNN.add(Flatten())
model_CNN.add(Dropout(0.5))
model_CNN.add(Dense(960))
#model_CNN.add(BatchNormalization())
#model_CNN.add(Activation('tanh'))
model_CNN.compile(loss='mean_squared_error', optimizer='adam')
hist_CNN=model_CNN.fit(X_train, Y_train, epochs =50, batch_size =20,validation_data=(X_test,Y_test),verbose=1)

ожидаемый результат следующий: img

Буду очень признателен, если кто-томог бы объяснить больше.Заранее спасибо.

...