如何指定要在 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 中预测的列/特征?的主要内容,如果未能解决你的问题,请参考以下文章
我如何减少要在MATLAB的机器学习中使用的一组矩阵和向量的提取特征