如何指定要在 RNN 中预测的列/特征?

Posted

技术标签:

【中文标题】如何指定要在 RNN 中预测的列/特征?【英文标题】:How do I specify what column/feature I want to predict in a RNN? 【发布时间】:2020-11-06 17:27:28 【问题描述】:

我正在尝试使用具有 30 个不同特征的时间序列数据集,并且我想预测其中 3 个特征的未来值。有什么方法可以指定要用于输出的功能以及使用 TensorFlow 和 Sckit-learn 的输出数量?还是在我创建 x_train、y_train 等集时刚刚完成?我想根据各种气象因素(气压、HDD、CDD、污染等)预测热量指数、温度和湿度。我希望预测的 3 个因素是 30 个总特征的一部分。

我正在使用 TensorFlows RNN 教程:https://www.tensorflow.org/tutorials/structured_data/time_series

univariate_past_history = 30
univariate_future_target = 0

x_train_uni, y_train_uni = univariate_data(uni_data, 0, 1930,
                                           univariate_past_history,
                                           univariate_future_target)
x_val_uni, y_val_uni = univariate_data(uni_data, 1930, None,
                                       univariate_past_history,
                                       univariate_future_target)

我的数据是每天提供的,所以我想在这里使用过去 30 天来预测第二天。

这是我对模型训练的实现:

    BATCH_SIZE = 256
    BUFFER_SIZE = 10000
    
    train_univariate = tf.data.Dataset.from_tensor_slices((x_train_uni, y_train_uni))
    train_univariate = 
    
    train_univariate.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
    
    val_univariate = tf.data.Dataset.from_tensor_slices((x_val_uni, y_val_uni))
    val_univariate = val_univariate.batch(BATCH_SIZE).repeat()
    
    simple_lstm_model = tf.keras.models.Sequential([
        tf.keras.layers.LSTM(8, input_shape=x_train_uni.shape[-2:]),
        tf.keras.layers.Dense(1)
    ])
    
    simple_lstm_model.compile(optimizer='adam', loss='mae')
    
    for x, y in val_univariate.take(1):
        print(simple_lstm_model.predict(x).shape)
        
    EVALUATION_INTERVAL = 200
    EPOCHS = 30
    
    simple_lstm_model.fit(train_univariate, epochs=EPOCHS,
                          steps_per_epoch=EVALUATION_INTERVAL,
                          validation_data=val_univariate, validation_steps=50)

编辑:我知道要增加输出数量,我必须增加 Dense(1) 值,想了解如何指定要输出/预测的特征

【问题讨论】:

不,我没有 6 月底之后的数据。本质上,鉴于下个月的“预期”条件,我想预测下个月的这三个特征 所以你有过去 n 天的 (n*30) 个特征,你想预测第 (n+1) 天的 3 个特征? 是的,当你说过去 n 天的 (n*30) 个特征时,你的意思是过去 n 天的每一天都有 30 个值,对吧? 【参考方案1】:

您需要以与 LSTM 层兼容的形状为 model.fit 调用提供要从中学习的变量

例如,如果没有任何代码,像您这样的模型可能会将其作为输入:

[batchsize, n_timestamps, n_features]

和输出:

[batchsize, n_timestamps, m_features]

n 是输入,m 是输出。

那么你需要给模型提供与模型输出形状相同的真值数据,以便模型计算损失。

所以 model.fit 调用应该是:

model.fit(x_train, y_train, ....) 其中 y_train 是与模型输出形状相同的真值向量。

您必须设计一个模型架构来满足您的需求并匹配您期望的输出。我做了一个玩具示例,但我从来没有真正使用过这种类型的神经网络,所以不知道它是否对这个问题有意义。

import tensorflow as tf
from tensorflow.keras.layers import LSTM, Dense, InputLayer, Reshape

ni_feats = 10
no_feats = 3
ndays = 30

model = tf.keras.Sequential([
    InputLayer((ndays, ni_feats)),
    LSTM(10),
    Dense(int(no_feats * ndays)),
    Reshape((ndays, no_feats))
    ])

【讨论】:

以上是关于如何指定要在 RNN 中预测的列/特征?的主要内容,如果未能解决你的问题,请参考以下文章

如何基于基于字符的 RNN 模型预测字符?

了解 R 中 rnn 模型的 Keras 预测输出

如何使用 LSTM 单元训练 RNN 以进行时间序列预测

我如何减少要在MATLAB的机器学习中使用的一组矩阵和向量的提取特征

使用 RNN,我们如何预测货币价格以在给定时间段内达到特定价格?

如何使用 Keras RNN 模型来预测未来的日期或事件?