使用Keras将时间序列数据输入NN

2024-05-20 05:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在进入代码之前,先对数据进行一点描述:

具有14个特征的时间序列,但我们只关注于预测指数为2的温度。另外,给定的数据间隔为10分钟:

["Date Time","p (mbar)","T (degC)","Tpot (K)","Tdew (degC)","rh (%)","VPmax (mbar)","VPact (mbar)","VPdef (mbar)","sh (g/kg)","H2OCmmol/mol)","rho (g/m**3)","wv (m/s)","max. wv (m/s)","wd (deg)"]

接下来,作者解析文件并将其存储为numpy数组(注意:float_data不包含时间戳:

^{pr2}$

接下来是一个规范化步骤,我在这里跳过。到目前为止还很简单。下面的步骤定义一个生成器,它生成一个元组(samples, targets),其中samples是一批输入数据,targets是相应的目标温度数组。它采用以下参数:

  1. data:浮点数据的原始数组,我们在上面的代码片段中对其进行了规范化。

  2. 回顾:我们的输入数据应该返回多少时间步。

  3. 延迟:未来我们的目标应该是多少时间步。

  4. min_index和max_index:数据数组中的索引,用于限定从哪个时间步进行绘制。这对于保留一段数据用于验证和另一段用于测试非常有用。

  5. 洗牌:是洗牌还是按时间顺序画。

  6. 批次大小:每批次的样本数。

  7. 步骤:我们采样数据的时间段。我们将设置为6,以便每小时绘制一个数据点。在

    def generator(data, lookback, delay, min_index, max_index,
          shuffle=False, batch_size=128, step=6):
    
        if max_index is None:
            max_index = len(data) - delay - 1
        i = min_index + lookback
        while 1:
            if shuffle:
                 rows = np.random.randint(
                 min_index + lookback, max_index, size=batch_size)
            else:
                if i + batch_size >= max_index:
                    i = min_index + lookback
            rows = np.arange(i, min(i + batch_size, max_index))
            i += len(rows)
    
            samples = np.zeros((len(rows),
                       lookback // step,
                       data.shape[-1]))
            targets = np.zeros((len(rows),))
            for j, row in enumerate(rows):
                indices = range(rows[j] - lookback, rows[j], step)
                samples[j] = data[indices]
                targets[j] = data[rows[j] + delay][1]
            yield samples, targets
    
    
     lookback = 1440  # Basically, going back 10 days
     step = 6         # Taking an hourly sample     
     delay = 144      # Want to forecast temperature for the next 24 hours
     batch_size = 128
    
     train_gen = generator(float_data,
                  lookback=lookback,
                  delay=delay,
                  min_index=0,
                  max_index=200000,
                  shuffle=True,
                  step=step,
                  batch_size=batch_size)
    
     val_gen = generator(float_data,
                lookback=lookback,
                delay=delay,
                min_index=200001,
                max_index=300000,
                step=step,
                batch_size=batch_size)
    

现在,我明白代码的作用了。如果我错了,请纠正我。它将以以下格式生成输入数据:

每个批次将有128个序列,其中每个序列的长度为240个。例如:

第0批:[[0-239],[1-240],[2-241],…[127-366]]

第1批:[[128-367],。。。,。。。。]在

在这之后,作者训练了一个简单的模型:

from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop

model = Sequential()
model.add(layers.Flatten(input_shape=(lookback // step,   float_data.shape[-1])))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1))

model.compile(optimizer=RMSprop(), loss='mae')
history = model.fit_generator(train_gen,
                          steps_per_epoch=500,
                          epochs=20,
                          validation_data=val_gen,
                          validation_steps=val_steps)

我的问题

首先,我不明白为什么数据以这种方式生成并输入神经网络。换句话说,为什么数据不能像下面这样?公司名称:

第0批:[[0-240],[241-479],………]

第二,在train_gen中,为什么shuffle参数设置为True?这将导致数据失去时间顺序。在


Tags: 数据datasizeindexmodelstepbatch时间
2条回答

数据的索引从0开始:因为序列长度是240:

len([0-239]) = 240

当你想训练的时候shuffle被设置为True,当你想要评估的时候你把它设置为False

我想这是Francois Chollet的《深度学习Python》中的一个例子。 Look back是从中生成样本中的观测值的数量。在

步骤将定义观察顺序:

观察指标如下:

X   [i, i+step, i+(2*Step), i+(3*step),...  .. ,(i+look_back/step)] 
y  - [(i+look_back/step)+delay]

批处理数量=此类观察的数量

例如:输入数据

^{pr2}$

对于以下参数:

lookback = 6 step = 2 delay = 2 batch_size = 3

输出为:

 array([[[996.57,  -8.41, 265.01],
     [996.51,  -8.31, 265.12],
     [996.5 ,  -8.05, 265.38]],

    [[996.53,  -8.51, 264.91],
     [996.51,  -8.27, 265.15],
     [996.5 ,  -7.62, 265.81]],

    [[996.51,  -8.31, 265.12],
     [996.5 ,  -8.05, 265.38],
     [996.5 ,  -7.62, 265.81]]]), array([-8.43, -8.76, -8.88])]

设置shuffle=True并不重要,因为观察总是从索引回溯到特定索引。在

过去10天的每小时读数用于预测24小时后的温度。因此,以这种格式生成数据[[0-240],[241-479],………]将不能提供预测(24小时+10分钟)温度的观测值

相关问题 更多 >