【问题标题】:Time Series Forecasting with LSTMs in keras - convergence problem在 keras 中使用 LSTM 进行时间序列预测 - 收敛问题
【发布时间】:2021-11-09 17:37:50
【问题描述】:

我正在尝试预测具有多变量输入和多输出的时间序列(多步预测)。 由于我的一些输入特征对于未来的时间步长是已知的,而其他的则不是,自然包括目标变量本身,我面临的问题是输入不适合 LSTM 所需的 3-D 形状。我尝试了不同的方法来处理这个问题。
似乎工作得很好的是在所有特征都已知的情况下在最后一天拆分数据并构建两个不同的 3-d 输入。
input_past 是一个形状为 (x, y1, z1) 的矩阵,其中
x:记录数
y1:上下文窗口(在 lstm 层中使用的时间步长)
z1:特征计数

input_future 是一个形状为 (x, y2, z2) 的矩阵
x:记录数
y1:预测的时间步长
z1:未来时间步长已知的特征计数

input_past 被传递到 LSTM 层,输入 future 到 Dense 层。之后这些层会被连接和致密化。

结果相当不错,并且在某些情况下优于其他不同的模型,包括 naive 模型、lightgbm 模型和 arima 模型。这引出了我的两个问题:

  1. 所描述的模型是否合理,或者是否有更好的方法来处理使用 LSTM 进行时间序列预测中部分已知的未来特征?
  2. NN 的结果是不确定的。如上所述,该模型能够胜过其他不同的方法,但并非每次都评估模型。使用完全相同的配置在相同输入上评估模型可能会导致预测性能大不相同。结果可能从最佳分数(MAPE ~10%,RMSE ~60k)到(MAPE ~30%,RMSE ~200k)不等。我无法让我的模型在每次运行时都收敛到几乎最好的分数。我尝试了几乎所有的方法,从改变 ADAM 优化器的学习率(甚至是指数衰减计划)到使网络更深和/或更宽,或者尝试使用 batch_size 或不同的层初始权重模式。唯一使分数更可靠的是增加优化器的 epsilon 参数,但这会导致预测性能非常差。由于同一模型多次运行的得分不同,我怎么知道我的模型的哪个版本最适合在生产中使用?

任何帮助将不胜感激,因为我是一个使用 keras 的新手。

【问题讨论】:

    标签: machine-learning keras time-series forecasting


    【解决方案1】:

    您的结果不可重现的原因是模型每次运行时的随机种子。您可以尝试修复种子,然后检查模型结果是否可重现:

    import tensorflow as tf
    import random as rn
    import os
    os.environ['PYTHONHASHSEED'] = '0'
    np.random.seed(1)
    rn.seed(1)
    session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
    from keras import backend as K
    tf.set_random_seed(1)
    sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
    K.set_session(sess)
    

    【讨论】:

    • 这不是再现性,我要求。我希望模型在每次运行中都收敛到最优(至少近似)。
    • 这不是同一个意思吗?如果在模型的每次运行中你得到不同的训练/验证损失,这意味着模型没有收敛到一个点,或者换句话说,模型结果是不可重现的。
    • 我不这么认为。如果一个模型的表现因种子而异,我怎么知道哪个种子是最好的?人们可以评估该博览,但不能在富有成效的事前案例中进行评估。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2021-09-15
    • 2018-09-04
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多