Для моего эксперимента у меня есть отформатированный файл 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 |
Я хотел предсказать значения 960 из 1440 столбцов путем индексации заинтересованных столбцов после определенной временной отметки t = 30 и прогнозирования будущих временных отметок на основе истории до конца набора данных [t + 1 = 31 до т + 10 = 40].
До сих пор я нашел 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)
В итоге я бы ожидал следующий вывод сюжета: