LSTM 平稳多元时间序列预测不稳定模型

时间:2021-04-09 06:53:21

标签: keras lstm prediction

我是 Tensorflow 2 的初学者,我正在尝试进行多时间序列预测,以使用 10 个时间步长(接下来 10 天,最后一个密集层 = 10)来预测铜 (LME) 的价格。 我的预测结果不是很好,所以我读到通过使数据静止,模型效率更好。我修改了我的程序如下:

我使用了以下 13 个数据系列: LME 以差价收盘平稳 LME 收盘原始值 COPPER US 接近原始值 COPX TRCCRBTR 平均 COPX 5 天因差异而静止 平均 TRCCRBTR 5 天静止的差异 以下6个统计数据计算相加:

  • 平均 12 天的 LME 收盘原始值
  • 平均 26 天的 LME 收盘价总额
  • 平均 50 天的 LME 收盘原始值
  • 平均 200 天的 LME 收盘总价值
  • E12:LME 收盘原始值的 12 天指数加权移动平均线
  • E26:LME 收盘原始值的 26 天指数加权移动平均线
<块引用>
scaler = MaxAbsScaler()
scaler.fit(data_stationary)   
data_all_scaled = scaler.transform(data_stationary)

nb_neurones1=30
nb_neurones2=30
nb_neurones_sortie=10
Activation="tanh" 
Activation_interne="selu" 
Batch_Normalization=True
initializer = tf.keras.initializers.LecunNormal(seed=seed_flag)

cible_future=10
dropout=0.01
Batch_size=8
Epochs=10
Validation_split=0.05
Shuffle=False
Learning_rate=0.02
seed=4000


model = Sequential()
model.add(LSTM(units = nb_neurones1, activation = Activation, 
  return_sequences = True, 
  kernel_initializer=initializer,
  input_shape = (30, 13)))
if Batch_Normalization==True:   model.add(BatchNormalization())
if dropout>0 :   model.add(Dropout(dropout))
   
model.add(LSTM(units = nb_neurones2, activation = Activation_interne,
    kernel_initializer=initializer, return_sequences = True))
if Batch_Normalization==True:  model.add(BatchNormalization())
if dropout>0 : model.add(Dropout(dropout))   # depart 0.2
   
model.add(LSTM(units = nb_neurones_sortie, 
     kernel_initializer=initializer,
     activation = Activation_interne))
if Batch_Normalization==True: model.add(BatchNormalization())
if dropout>0 : model.add(Dropout(dropout))

model.add(Dense(cible_future))
   
radam = tfa.optimizers.RectifiedAdam(lr=Learning_rate, total_steps=10000, \
                       warmup_proportion=0.1, min_lr=1e-6)
    
ranger = tfa.optimizers.Lookahead(radam, sync_period=6, slow_step_size=0.5)
model.compile(optimizer=ranger, loss = Loss, metrics=metrics_list)


print('Apprentissage +++++++++++++++++++++++++++++++++++++++++++++++')    
history = model.fit(X_train, y_train, epochs=Epochs,
        batch_size = Batch_size, callbacks=callbacks_list,
        validation_split = Validation_split, verbose=Verbose, shuffle = Shuffle)

结果

Curves Stationary

Training: 3524 lig    Validation: 186 lig    Test: 10 lig    Nb colonnes: 13

Epoch 1/10
436/436  - 19s 44ms/step - loss: 0.3195 - acc: 0.0927 - val_loss: 0.2226 - val_acc: 0.1087
Epoch 2/10
436/436  - 7s 15ms/step - loss: 0.0474 - acc: 0.1036 - val_loss: 0.0428 - val_acc: 0.1033
Epoch 3/10
436/436  - 7s 15ms/step - loss: 0.0411 - acc: 0.1036 - val_loss: 0.0385 - val_acc: 0.0924
Epoch 4/10
436/436  - 7s 16ms/step - loss: 0.0392 - acc: 0.1084 - val_loss: 0.0399 - val_acc: 0.1033
Epoch 5/10
436/436  - 25s 56ms/step - loss: 0.0388 - acc: 0.1113 - val_loss: 0.0413 - val_acc: 0.1196
Epoch 6/10
436/436  - 7s 15ms/step - loss: 0.0386 - acc: 0.1119 - val_loss: 0.0462 - val_acc: 0.1141
Epoch 7/10
436/436  - 7s 15ms/step - loss: 0.0384 - acc: 0.1208 - val_loss: 0.0453 - val_acc: 0.1033
Epoch 8/10
436/436  - 7s 16ms/step - loss: 0.0384 - acc: 0.1156 - val_loss: 0.0508 - val_acc: 0.1141
Epoch 9/10
436/436  - 23s 52ms/step - loss: 0.0385 - acc: 0.1211 - val_loss: 0.0437 - val_acc: 0.1250
Epoch 10/10
436/436  - 7s 16ms/step - loss: 0.0383 - acc: 0.1179 - val_loss: 0.0503 - val_acc: 0.1087

Training Prediction

随着序列的平稳性,结果更好,但模型不稳定。我想我在超参数的选择上犯了一个初学者的错误。确实:

  • 最小损失与预测质量之间没有相关性
  • 随着种子值的修改,结果完全可变
  • 随着训练次数的增加,预测曲线变平
  • 最小的 val_loss 不会产生最佳预测
  • Val_Acc 不超过 0.125
  • 在训练期间,损失缓慢减少,但 val_acc 没有增加。
  • 通常最好的结果是少于 5 个学习时期
  • Loss 和 val_loss 减少,但 val_accurate 没有增加。我对 10 天预测向量的 val_accurate 计算有疑问
  • 模型预测对参数非常敏感
  • 如果我添加数据日期,则模型效果不佳

您有改进我的模型的想法吗? 谢谢

0 个答案:

没有答案