Как можно разделить данные для перекрестной проверки Keras для RNN и CNN после определенного временного шага? - PullRequest
0 голосов
/ 12 мая 2019

Допустим, у меня есть данные временных рядов по 3 физическим параметрам, которые находятся в 3 матрицах формы R, G, B, и все они имеют одинаковый размер, как N × K, и я объединил их и преобразовал их в большую матрицу PxM путем изменения формы у каждой строки есть соответствующие метки времени, и я собираюсь предсказать только заинтересованные столбцы как особенности после обучения от временного шага: t = n до t = k. 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

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

...