Прогнозирование многоступенчатых временных рядов с помощью нейронной сети Python дает неверные результаты - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть почасовые данные на срок до 1 года.Я хочу сделать прогноз на следующий час на основе данных предыдущих часов.Для этого я использую многослойный персептрон, но он продолжает давать неверный результат прогноза

Для простоты, скажем, я хочу прогнозировать следующий 1 час, используя данные за предыдущие 3 часа.Это пример моих данных (T-2, T-1, T в качестве входа и T + 1 в качестве цели):

T-2  T-1  T0  T+1
10   20   30   40
20   30   40   50
30   40   50   60
40   50   60   70

, если я введу (20, 30, 40) в свою модель,это дает мне 40 вместо 50, это также то же самое для другого набора данных (30, 40, 50 производит 50 вместо 60 и скоро).Я пробовал разные временные рамки, разное количество скрытых слоев, нейронов, эпох, размеров партий, а также разные функции активации, но результат всегда одинаков.Полученный результат всегда ближе к T0, чем (T + 1)

n_input = Xtrain.shape[1] * Xtrain.shape[2] 
Xtrain = Xtrain.reshape((Xtrain.shape[0], n_input))
Xtest = Xtest.reshape((Xtest.shape[0], n_input))

# define model
model72 = Sequential()
model72.add(Dense(20, activation='relu', input_dim=n_input))
model72.add(Dense(1))
# Compile model
model72.compile(loss = 'mean_squared_error', metrics = ['mse', 'acc'], optimizer='adam')

# fit model
history72 = model72.fit(Xtrain, ytrain, validation_split=0.33, epochs=200, batch_size=1000, verbose=0)

Я что-то пропустил?

Это мои данные на самом деле выглядит так:

[0.75400747 7.2062848  2.0027392 ] 4.194725333
[0.65565867 8.0780128  1.9312128 ] 4.4242058669999995
[2.01317013 7.2152256  3.22911893] 3.029441067
[1.989328   7.554976   4.43314667] 3.106928
[2.40656533 6.98574507 5.20652587] 3.2097472000000002
[2.65690773 7.41490347 6.05143147] 2.023601067
[1.5825216 7.6935584 6.9648832] 1.56464
[2.2754336  8.404352   6.56552747] 2.1621834669999997
[5.44792747 9.24180693 8.28961173] 3.8981888
[7.70547947 9.71566933 9.72908053] 5.889006932999999
[9.61285013 9.01977707 9.57857707] 5.702740267
[10.7423712  10.2550976   9.25968853] 7.347847467
[10.82581867  9.29545173  9.28651093] 7.9811541329999995
[10.89287467  9.2492576   8.9720928 ] 7.194363732999999
[10.6127296   9.34462613  9.46085653] 8.0154272
[11.17749013  9.05852053  9.4191328 ] 7.262909867
[10.74088107 10.72896     9.19859307] 7.2644
[10.08373227 10.9435392   8.9542112 ] 6.7070901329999995

1 Ответ

0 голосов
/ 04 апреля 2019

Во-первых, я не понимаю, как вы определяете ввод,

n_input = Xtrain.shape[1] * Xtrain.shape[2] 
Xtrain = Xtrain.reshape((Xtrain.shape[0], n_input))
Xtest = Xtest.reshape((Xtest.shape[0], n_input))

Из того, что я вижу, у вас есть 3 значения.

Если у вас есть матрица m by n, скажем, m строк (сэмплов) и n объектов (в этом случае, я думаю, n=3) you can input the matrix as such in the network as input. It will select rows as samples. Do not reshape it. X_train must have dimensions [сэмплов, функций] `.

В других случаях изображения могут иметь больше измерений, но в этом случае у вас должны быть табличные данные с такой размерностью.

Следовательно, в вашем input_dim вы должны обозначить: input_dim = 3

Надеюсь, это поможет

...