深度学习处理处罚时间序列(2)

打印 上一主题 下一主题

主题 1006|帖子 1006|积分 3018

在数据中寻找周期性

在多个时间尺度上的周期性,是时间序列数据非常紧张且常见的属性。无论是天气、商场停车位使用率、网站流量、杂货店贩卖额,还是健身追踪器记载的步数,你都会看到每日周期性和年度周期性(人类生成的数据通常另有每周的周期性)​。探索数据时,一定要注意寻找这些模式。(让人想到波,想到傅里叶变换)
对于这个数据集,如果你想根据前几个月的数据来预测下个月的均匀温度,那么问题很简朴,因为数据具有可靠的年度周期性。但如果查察几天的数据,那么你会发现温度看起来要杂乱得多。以天作为观察尺度,这个时间序列是可预测的吗?我们来寻找这个问题的答案。这个现象不禁让人联想到股票市场。短线的波动极度杂乱。但是放到更大的尺度是否有周期性呢?我觉得有,但是如果有是不是就能做到稳定红利呢?(可以考虑用一部分资金做个实现,必要克服情绪的波动,制止买卖操作)
在后续所有实行中,我们将前50%的数据用于练习,随后的25%用于验证,末了的25%用于测试,如代码清单10-5所示。处理处罚时间序列数据时,有一点很紧张:验证数据和测试数据应该比练习数据更靠后,因为你是要根据已往预测未来,而不是反过来,以是验证/测试分别应该反映这一点。如果将时间轴反转,有些问题就会变得简朴得多。(后面我们会看到双向循环网络)
代码清单10-5 计算用于练习、验证和测试的样本数
  1. >>> num_train_samples = int(0.5 * len(raw_data))
  2. >>> num_val_samples = int(0.25 * len(raw_data))
  3. >>> num_test_samples = len(raw_data) - num_train_samples - num_val_samples
  4. >>> print("num_train_samples:", num_train_samples)
  5. >>> print("num_val_samples:", num_val_samples)
  6. >>> print("num_test_samples:", num_test_samples)
  7. num_train_samples: 210225
  8. num_val_samples: 105112
  9. num_test_samples: 105114
复制代码
准备数据

这个问题的确切表述如下:每小时采样一次数据,给定前5天的数据,我们可否预测24小时之后的温度?首先,我们对数据举行预处理处罚,将其转换为神经网络可以处理处罚的格式。这很简朴。因为数据已经是数值型的,以是不必要做向量化。但数据中的每个时间序列位于不同的范围,比如气压约莫在1000毫巴(mbar)1,而水汽浓度(H2OC)约莫为3毫摩尔/摩尔(mmol/mol)​。我们将对每个时间序列分别做规范化,使其处于相近的范围,而且都取较小的值,如代码清单10-6所示。我们使用前210 225个时间步作为练习数据,以是只计算这部分数据的均值和标准差。(记住我们前面提到的不能对验证数据和测试数据举行这些处理处罚)
清单10-6 数据规范化
  1. mean = raw_data[:num_train_samples].mean(axis=0)
  2. raw_data -= mean
  3. std = raw_data[:num_train_samples].std(axis=0)
  4. raw_data /= std
复制代码
接下来我们创建一个Dataset对象,它可以生成已往5天的数据批量,以及24小时之后的目标温度。由于数据会集的样本是高度冗余的(对于样本N和样本N+1,二者的大部分时间步是相同的)​,因此显式地保存每个样本将浪费资源。相反,我们将实时生成样本,仅保存最初的数组raw_data和temperature。
我们可以轻松地编写一个Python生成器来完成这项工作,但也可以直接使用Keras内置的数据集函数(timeseries_dataset_from_array())​,从而淘汰工作量。一样寻常来说,你可以将这个函数用于恣意类型的时间序列预测使命。
理解timeseries_dataset_from_array()

为了理解timeseries_dataset_from_array()的作用,我们来看一个简朴的例子。这个例子的大致思想是:给定一个由时间序列数据构成的数组(data参数)​,timeseries_dataset_from_array()可以给出从原始时间序列中提取的窗口(我们称之为“序列”​)​。有没有点滑动窗口的意思?
举个例子,对于data = [0, 1, 2, 3, 4, 5, 6]和sequence_length = 3,timeseries_dataset_from_array()将生成以下样本:[0, 1, 2], [1, 2, 3], [2, 3, 4],[3, 4, 5], [4, 5, 6]。你还可以向timeseries_dataset_from_array()传入targets参数(一个数组)​。targets数组的第一个元素应该对应data数组生成的第一个序列的预期目标。因此,做时间序列预测时,targets应该是与data大致相同的数组,并偏移一段时间。
例如,对于data = [0, 1, 2, 3, 4, 5, 6, …]和sequence_length = 3,你可以传入targets = [3, 4, 5, 6, …],创建一个数据集并预测时间序列的下一份数据。我们来试一下。
  1. import numpy as np
  2. from tensorflow import keras
  3. #生成一个从0到9的有序整数数组
  4. int_sequence = np.arange(10)
  5. dummy_dataset = keras.utils.timeseries_dataset_from_array(
  6. #序列将从[0, 1, 2, 3, 4, 5, 6]中抽样
  7.     data=int_sequence[:-3],  
  8. #对于以data[N]开头的序列,其目标是data[N+3]
  9.     targets=int_sequence[3:],  
  10. #序列长度是3个时间步
  11.     sequence_length=3,  
  12. #序列批量大小为2
  13.     batch_size=2,  
  14. )
  15. for inputs, targets in dummy_dataset:
  16.     for i in range(inputs.shape[0]):
  17.         print([int(x) for x in inputs[i]], int(targets[i]))
复制代码
这段代码的运行效果如下。

我们将使用timeseries_dataset_from_array()来创建3个数据集,分别用于练习、验证和测试,如代码清单10-7所示。我们将使用以下参数值。
sampling_rate = 6:观测数据的采样频率是每小时一个数据点,也就是说,每6个数据点保留一个。
sequence_length = 120:给定已往5天(120小时)的观测数据。
delay = sampling_rate * (sequence_length + 24 - 1):序列的目标是序列结束24小时之后的温度。
创建练习数据集时,我们传入start_index = 0和end_index = num_train_samples,只使用前50%的数据。对于验证数据集,我们传入start_index = num_train_samples和end_index = num_train_samples + num_val_samples,使用接下来25%的数据。末了对于测试数据集,我们传入start_index = num_train_samples +num_val_samples,使用剩余数据。
代码清单10-7 创建3个数据集,分别用于练习、验证和测试
  1. sampling_rate = 6
  2. sequence_length = 120
  3. delay = sampling_rate * (sequence_length + 24 - 1)
  4. batch_size = 256
  5. train_dataset = keras.utils.timeseries_dataset_from_array(
  6.     raw_data[:-delay],
  7.     targets=temperature[delay:],
  8.     sampling_rate=sampling_rate,
  9.     sequence_length=sequence_length,
  10.     shuffle=True,
  11.     batch_size=batch_size,
  12.     start_index=0,
  13.     end_index=num_train_samples)
  14. val_dataset = keras.utils.timeseries_dataset_from_array(
  15.     raw_data[:-delay],
  16.     targets=temperature[delay:],
  17.     sampling_rate=sampling_rate,
  18.     sequence_length=sequence_length,
  19.     shuffle=True,
  20.     batch_size=batch_size,
  21.     start_index=num_train_samples,
  22.     end_index=num_train_samples + num_val_samples)
  23. test_dataset = keras.utils.timeseries_dataset_from_array(
  24.     raw_data[:-delay],
  25.     targets=temperature[delay:],
  26.     sampling_rate=sampling_rate,
  27.     sequence_length=sequence_length,
  28.     shuffle=True,
  29.     batch_size=batch_size,
  30.     start_index=num_train_samples + num_val_samples)
复制代码
每个数据集都会生成一个元组(samples, targets),此中samples是包罗256个样本的批量,每个样本包罗一连120小时的输入数据;targets是包罗相应的256个目标温度的数组。请注意,因为样本已被随机打乱,以是一批数据中的两个一连序列(如samples[0]和samples[1])不一定在时间上接近。我们来查察数据集的输出,如代码清单10-8所示。
代码清单10-8 查察一个数据集的输出
  1. >>> for samples, targets in train_dataset:
  2. >>>     print("samples shape:", samples.shape)
  3. >>>     print("targets shape:", targets.shape)
  4. >>>     break
  5. samples shape: (256, 120, 14)
  6. targets shape: (256,)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表