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

Keras LSTM平稳多元时间序列预测不稳定模型,keras,lstm,prediction,Keras,Lstm,Prediction,我是Tensorflow 2的初学者,我正在尝试进行多时间序列预测,以预测铜(LME)的价格,向量为10个时间步(未来10天,最后一个致密层=10)。 我的预测结果不是很好,所以我读到,通过使数据平稳,模型效率更好。我修改了我的程序如下: 我使用以下13个数据系列: 伦敦金属交易所(LME)通过差分关闭 LME收盘原始值 美国铜接近原始价格 COPX TRCCRBTR 通过差异使平均COPX 5天保持平稳 平均TRCCRBTR 5天固定差 通过计算以下6个统计数据进行添加: LME收盘平均12

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

我使用以下13个数据系列: 伦敦金属交易所(LME)通过差分关闭 LME收盘原始值 美国铜接近原始价格 COPX TRCCRBTR 通过差异使平均COPX 5天保持平稳 平均TRCCRBTR 5天固定差 通过计算以下6个统计数据进行添加:

  • LME收盘平均12天原始值
  • 伦敦金属交易所平均26天收盘总价值
  • LME收盘原始值的平均50天
  • 伦敦金属交易所平均200天收盘总值
  • E12:LME收盘12天原始值的指数加权移动平均值
  • E26:LME 26天收盘原始值的指数加权移动平均值
结果

由于序列的平稳性,结果较好,但模型不稳定。我认为我在选择超参数上犯了一个初学者的错误。事实上:

  • 最小损失与预测质量之间没有相关性
  • 随着种子值的修改,结果是完全可变的
  • 随着训练次数的增加,预测曲线变得平坦
  • 最小的val_损失不会产生最佳预测
  • Val_Acc不超过0.125
  • 在训练期间,损失缓慢减少,但val_acc没有增加
  • 通常最好的结果是不到5个学习阶段
  • 损耗和val_损耗减少,但val_精度不增加。我怀疑val_的计算是否精确到10天的预测向量
  • 模型预测对参数非常敏感
  • 如果我添加数据日期,模型的效果就不那么好了
你有改进我的模型的想法吗? 谢谢

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)
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