В настоящее время я делаю аналогичное прогнозирование временного ряда для номеров вызовов с моделью seq2seq.Теперь я сталкиваюсь с проблемой, которая заключается в том, что, когда я хочу прогнозировать, как 30-дневные целевые значения в будущем, результаты не будут выполнять какой-либо тренд ряда.
<pre>
# train model
latent_dim = 128 # LSTM hidden units
dropout = .20
encoder_inputs = Input(shape=(None, n_inputs),
name='encoder_inputs')
encoder_lstm = LSTM(latent_dim, dropout=dropout,
return_sequences=False, return_state=True,
name='encoder_lstm')
_, state_h, state_c = encoder_lstm(encoder_inputs)
encoder_states = [state_h, state_c]
decoder_inputs = Input(shape=(None, n_features),
name='decoder_inputs')
decoder_lstm = LSTM(latent_dim, dropout=dropout,
return_sequences=True, return_state=True,
name='decoder_lstm')
decoder_outputs, _, _ = decoder_lstm(decoder_inputs,
initial_state=encoder_states)
decoder_dense = (Dense(n_outputs, name='decoder_dense',
activation='linear'))
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(COCOB(), loss=ks.losses.mean_squared_error)
history = model.fit([encoder_input_data, decoder_input_data],
decoder_target_data,
batch_size=16, epochs=100,
validation_split=0.2, shuffle=False)
# define inference encoder
encoder_model = Model(encoder_inputs, encoder_states)
decoder_state_input_h = Input(shape=(latent_dim,))
decoder_state_input_c = Input(shape=(latent_dim,))
decoder_states_inputs = [decoder_state_input_h,
decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(decoder_inputs,
initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model([decoder_inputs] + decoder_states_inputs,
[decoder_outputs] + decoder_states)
# decoded sequence
n_test_samples = encoder_input_data_test.shape[0]
print('Total number of test smaples:', n_test_samples)
n_seq_out = 1 #length of days for predicting, objective is to
# predict 3 months in the future
all_out = []
for i in range(n_test_samples):
enc_outs =
encoder_model.predict(encoder_input_data_test[i:i+1,:,:])
target_seq = np.zeros((1,1,n_features))
target_seq[0,:,:] = encoder_input_data_test[i,-1:,:]
decoded_seq = np.zeros((1,n_seq_out,n_outputs))
for j in range(n_seq_out):
output, h, c = decoder_model.predict([target_seq]+enc_outs)
print('out', output)
print('tar', target_seq)
decoded_seq[0,j,0] = output[0,0,0]
target_seq = np.zeros((1,1,n_features))
target_seq[0,0,0] = output[0,0,0]
target_seq[0,0,1:] = decoder_input_data_test[j+1,0,1:]
enc_outs = [h, c]
all_out.append(decoded_seq)
Мой ввод данныхкодера имеет размер (n_samples, steps = 84 days, n_features), а данные входного сигнала декодера имеют размер (n_samples, steps = 1 days, n_features), а размер целевых данных декодера равен (n_sample, steps = 11).Каждая выборка входных данных кодера имеет однодневную задержку, а входные данные декодера предназначены для реализации принудительного воздействия учителя.
Как если бы я только что предсказал один день спустя, предсказанное значение является приемлемым, но не очень точным.Тем не менее, когда я прогнозирую, как через 30 дней, значения прогнозируемого ряда будут только увеличиваться или уменьшаться неудержимо.
- Так есть ли проблемы с предсказанием будущих значений?
- И мои функции, которые включают в себя один столбец цели: количество вызовов и другие являются внешними функциями (день, месяц, день недели), праздник ..), это хорошая идея, чтобы бросить все эти функции вместе в модель?
- В коде третьей части (в декодированной последовательности) мне нужно добавить также эти внешние функции к принуждению учителя, это правильно?
Огромное спасибо !!!