一个时间步是 10 分钟,每 steps 个时间步采样一次数据,给过去 lookback 个时间步之内的数据,能否预测 delay 个时间步之后的数据?
开始之前,你需要完成以下两件事:
1、将数据预处理为神经网络可以处理的格式。将不是数值型的数据做向量化,数值型的数据则不用处理。但数据中的每个时间序列位于不同的范围(比如温度通道位于 -20到 +30之间,但气压大约在 1000 毫巴上下)。需要对每个时间序列分别做标准化,让它们在相似的范围内都取较小的值。
2、口编写一个 Python 生成器,以当前的浮点数数组作为输人,并从最近的数据中生成数据批量,同时生成未来的目标温度。因为数据集中的样本是高度冗余的(对于第 N个样本和第 N+1个样本,大部分时间步都是相同的 ),所以显式地保存每个样本是一种浪费。相反我们将使用原始数据即时生成样本。
预处理数据的方法是:将每个时间序列减去其平均值,然后除以其标准差。将使用前200000个时间步作为训练数据,所以只处理这部分。
#数据标准化
mean = float_data[:200000].mean(axis=0)
float_data -= mean
std = float_data[:200000].std(axis=0)
float_data /= std
我们要用到的生成器如下:它生成了一个元组(samples,targets),其中 samples是输入数据的一个批量,targets是对应的目标温度数组。生成器参数如下:
data:浮点数数组组成的原始数组
lookback:输入数据应该包括过去多少个时间步
delay:目标应该在未来多少个时间步之后
min_index和max_index:data数组中的索引,用于界定需要抽取哪些时间步。有助于保存一部分数据用于验证,另一部分用于测试。
shuffle:是打乱样本还是按顺序抽取样本。
batch_size:每个批量的样本数
step:数据采样的周期(单位:时间步)暂时将其设为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.ramdint(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
下面使用这个抽象的generator函数来实例化三个生成器:一个用于训练,一个用于验证,一个用于测试。每个生成器分别读取原始数据的不同时间段:训练生成器读取前200000个时间步,验证生成器读取随后的100000个时间步,测试生成器读取剩下的时间步。
#准备训练生成器、验证生成器和测试生成器
lookback = 1440
step = 6
delay = 144
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)
test_gen = generator(float_data,
lookback = lookback,
delay = delay,
min_index = 300001,
max_index = None,
step = step,
batch_size = batch_size)
#为了查看整个验证集,需要从val_gen中抽取多少次
val_steps = (300000 - 200001 -lookback) // batch_size
#为了查看整个测试集,需要从test_gen中抽取多少次
test_steps = (len(float_data) - 300001 - lookback) // batch_size