Как настроить сеть LSTM для прогнозирования нескольких последовательностей? - PullRequest
0 голосов
/ 19 сентября 2019

Я изучаю, как настроить сеть RNN-LSTM для прогнозирования.Я создал набор данных с одной входной переменной.

x  y
1  2.5
2  6
3  8.6
4  11.2
5  13.8
6  16.4
...

Следующим кодом Python я создал данные окна, такие как [x (t-2), x (t-1), x (t)] для прогнозирования [y (t)]:

df= pd.read_excel('dataset.xlsx')

# split a univariate dataset into train/test sets
def split_dataset(data):
    train, test = data[:-328], data[-328:-6]
    return train, test

train, test  = split_dataset(df.values)

# scale train and test data
def scale(train, test):
    # fit scaler
    scaler = MinMaxScaler(feature_range=(0,1))
    scaler = scaler.fit(train)
    # transform train
    #train = train.reshape(train.shape[0], train.shape[1])
    train_scaled = scaler.transform(train)
    # transform test
    #test = test.reshape(test.shape[0], test.shape[1])
    test_scaled = scaler.transform(test)
    return scaler, train_scaled, test_scaled

scaler, train_scaled, test_scaled = scale(train, test)

def to_supervised(train, n_input, n_out=7):
    # flatten data
    data = train
    X, y = list(), list()
    in_start = 0
    # step over the entire history one time step at a time
    for _ in range(len(data)):
        # define the end of the input sequence
        in_end = in_start + n_input
        out_end = in_end + n_out
        # ensure we have enough data for this instance
        if out_end <= len(data):
            x_input = data[in_start:in_end, 0]
            x_input = x_input.reshape((len(x_input), 1))
            X.append(x_input)
            y.append(data[in_end:out_end, 0])
        # move along one time step
        in_start += 1
    return np.array(X), np.array(y)
train_x, train_y = to_supervised(train_scaled, n_input = 3, n_out = 1)
test_x, test_y =  to_supervised(test_scaled, n_input = 3, n_out = 1)

verbose, epochs, batch_size = 0, 20, 16
n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]


model = Sequential()
model.add(LSTM(200, return_sequences= False, input_shape = (train_x.shape[1],train_x.shape[2])))
model.add(Dense(1))
model.compile(loss = 'mse', optimizer = 'adam')
history = model.fit(train_x, train_y, epochs=epochs, verbose=verbose, validation_data = (test_x, test_y))

Однако у меня есть другие вопросы по этому поводу:

Q1: Что означает значение единиц в LSTM?[model.add (LSTM (единицы, ...))]

(я пробовал разные единицы для модели, это было бы более точно при увеличении единиц.)

Q2: Каксколько слоев я должен установить?

Q3: Как я могу предсказать многошаговые?Например, основываясь на (x (t), x (t-1)), чтобы предсказать y (t), y (t + 1), я попытался установить n_out = 2 в функции to_supervised, но когда я применил тот же метод, он вернул ошибку

train_x, train_y = to_supervised(train_scaled, n_input = 3, n_out = 2)
test_x, test_y =  to_supervised(test_scaled, n_input = 3, n_out = 2)

verbose, epochs, batch_size = 0, 20, 16
n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]

model = Sequential()
model.add(LSTM(200, return_sequences= False, input_shape = (train_x.shape[1],train_x.shape[2])))
model.add(Dense(1))
model.compile(loss = 'mse', optimizer = 'adam')
history = model.fit(train_x, train_y, epochs=epochs, verbose=verbose, validation_data = (test_x, test_y))
ValueError: Error when checking target: expected dense_27 to have shape (1,) but got array with shape (2,)

Q3 (продолжение): Что я должен добавить или изменить в настройках модели?

Q3 (продолжение): Что такое return_sequence?Когда мне следует установить True?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Re Q1: это количество ячеек LSTM (= единиц LSTM), которые состоят из нескольких самих нейронов, но имеют (в указанном стандартном случае) только один выход каждый.Таким образом, количество единиц прямо соответствует размерности вашего вывода.

0 голосов
/ 19 сентября 2019

Q1.Единицы в LSTM - это количество нейронов в вашем слое LSTM.

Q2.Это зависит от вашей модели / данных.Попробуйте изменить их, чтобы увидеть эффект.

Q3.Это зависит от того, какое приложение вы берете.

Q4.В идеале вам нужно каждый раз прогнозировать один временной шаг.Можно прогнозировать несколько одновременно, но по моему опыту вы получите лучшие результаты, как я описал ниже

например

используйте y (t-1), y (t)для прогнозирования y_hat (t + 1)

THEN

используйте y (t), y_hat (t + 1) для прогнозирования y_hat (t + 2)

Вы уверены?вы на самом деле используете X, чтобы предсказать Y в этом случае?как выглядит поезд х / у и тест х / у?

...