小渣渣爱学习 2022-02-16 21:34 采纳率: 50%
浏览 97
已结题

cnn预测时间序列正确率低,预测曲线不波动

问题遇到的现象和发生背景

cnn预测时间序列正确率低(0.1-0.3之间),预测曲线不波动(几乎为直线)
输入特征为 t-1 t-2 ...t-64 个时刻的 y, a, b,c, d. (y 与a,b, c, d, 相关,t时刻 y 与a,b, c, d, 相关性都在0.7-0.8)
输出特征为 t t+1 ...t+15 个时刻的y
Train on 10625 samples, validate on 800 samples

下图为训练集与验证集的损失函数与正确率

img

下图为测试集的实际输出与预测输出曲线

img

问题相关代码,请勿粘贴截图

网络代码
X21 = layers.Conv2D(filters=2,kernel_size=(5,2),padding="valid")(input1)  
X21 = layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)(X21)
X21 = layers.Activation('relu')(X21)
X21 = layers.MaxPooling2D(pool_size=(2,1),padding="valid")(X21) 
X21 = layers.Dropout(0.5)(X21)
X21 = layers.Conv2D(filters=2,kernel_size=(3,1),padding="valid")(X21)  
X21 = layers.Activation('relu')(X21)
X21 = layers.MaxPooling2D(pool_size=(2,1),padding="valid")(X21)  
X21 = layers.Dropout(0.5)(X21)
X21 = layers.Conv2D(filters=32,kernel_size=(3,2),padding="valid")(X21)
X21 = layers.Flatten()(X21)
X21 = layers.Dense(32, activation='relu')(X21)
X21 = layers.Dropout(0.5)(X21)
X2 = layers.Dense(2*n1)(X21)
训练代码
model.compile(loss='mae',  optimizer=Adam(0.0001), metrics=['accuracy'])
  #ModelCheckpoint回调函数,在每个epoch后保存模型
  checkpoint = ModelCheckpoint(s,    monitor='val_loss',    verbose=0,    mode='auto',   period=1,   save_best_only=True)
  #ReduceLROnPlateau当检测指标未得到改善,进行n倍的学习率调整常常能获得较好的效果。
  plateau = ReduceLROnPlateau(monitor="val_loss",    verbose=0,  mode='auto',  factor=0.2,   patience=10,  epsilon=0.0001,    cooldown=0) 
  #Train_y_2d[xxa],Train_y_3d[xxa]是一样的
  history = model.fit([Train_x_2d_[xxa],Train_x_3d_[xxa]],Train_y_2d[xxa], epochs=Epochs, batch_size=256, shuffle=True,verbose=1,validat    ion_data=([Train_x_2d_[xxb],Train_x_3d_[xxb]],Train_y_2d[xxb]),callbacks=[checkpoint,plateau])

我的解答思路和尝试过的方法

都是无技巧的来回改动参数,如果有好的参数调整方向,请指教

改变优化器 损失函数 batch_size 学习率 epochs
改变卷积核大小 池化大小 加dropout层
改变验证集个数

请问 怎么能提高精度,减少误差。



  • 写回答

4条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2022-02-17 09:21
    关注

    (1)首先要考虑模型是否合理,也就是说能否以 t-1 t-2 ...t-64 个时刻的 y, a, b,c, d 预测 t t+1 ...t+15 个时刻的y
    即使 t 时刻 y 与a,b, c, d, 相关性较高,也是不一定的。
    例如,模型 y(t)= a x1(t)+b x2(t)+c x3(t)+d x4(t),y(t) 与 x1~x4 的相关性理论上可以达到 100%,但 y(t) 与 y(t-1),..., xi(t-1),... 可以是完全无关的。

    (2)如果你分析问题,认为 y(t) 与 y(t-1), ...y(t-k) 相关,且相关度较高,建议你先做一个模型,输入特征为 t-1 t-2 ...t-64 个时刻的 y, a, b,c, d,输出为 y(t)
    也就是说先只做 一步预测,看看效果。如果这个模型都不好,说明问题不一定能用时序模型描述。
    顺便说一句,如果 t 时刻 y 与a,b, c, d, 相关性都在0.7-0.8),其实输入有没有 a,b,c,d 可能都差不多了,因为 y 与 abcd 高度相关。

    (3)如果 yP(t) = F[ y(t-1), ...y(t-k) ] 的模型不错,你还是想预测更长的 yP(t+k),首先预测性能下降是必然的。例如由历史和现有数据预测下一天的天气精度较高,预测时间越长则精度越低,甚至低的无法接受。
    一个改进方法是,基于模型 yP(t) = F[ y(t-1), ...y(t-k) ], 首先以 [ y(t-1), ...y(t-k) ] 预测得到 yP(t),再以 [ yP(t), y(t-1)...y(t-k+1) ] 预测得到 yP(t+1),依次类推.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月4日
  • 已采纳回答 2月24日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler