Python:为ConvNet创建具有多个通道的时间序列

时间:2018-08-22 14:03:31

标签: python neural-network time-series conv-neural-network

我正在使用卷积网络来预测时间序列。为此,我使用滚动窗口获取最后的t点,将其用作时间序列。每个功能都将成为一个频道,因此我设置了多个时间序列。数据必须为3维[n_samples,window_size,features]。我拥有的原始数据集是[n_samples,features]。数据已经按时间升序排列。我的问题是,考虑到我有近50万行,我创建3D张量的方式会使计算机崩溃。这是我正在使用的代码。

prueba = x_data # This data set has shape [500k,20]
window_size = 100 # I taking the last 100 days
n_units,n_features = prueba.shape
n_samples = n_units - window_size +1 # Represent the number of samples you are getting from the rolling windows.
data_list = []

for init_index in range(n_samples):

    fin_index = window_size + init_index
    window_set = prueba[init_index:fin_index,:]
    window_flat = np.reshape(window_set,(1,window_size*n_features))
    data_list.append(window_flat)

features_tensor = np.concatenate(data_list,axis = 0)
features_tensor = np.reshape(features_tensor,(n_samples,window_size,n_features)) ## This break my computer

问题是当我使用np.concatenate将我创建的所有单个数据集放在一起时,计算机崩溃了。有谁知道更快的方法。我正在尝试以一种避免使用np.concatenate的方式进行思考,但是到目前为止,我还无法弄清楚。

1 个答案:

答案 0 :(得分:1)

使用此处使用的方法(结果是np.concatenate)效率很低,因为您要复制每个数据点(大约)window_size次。几乎可以肯定这是浪费内存,因为理想情况下,对此数据集执行的任何操作都应该能够滚动地进行:遍历时间序列,而无需查看张量中完全扩展/大量重复的数据集格式。

因此,我建议更好的方法是找到一种方法来避免首先构建此冗余张量。

由于我们不知道您正在使用此张量做什么,因此无法给出答案。但是,请注意以下几点:

  1. 一种实现此目的的“正确”方法是使用pandas,它具有滚动窗口功能df.rolling() docs here。正是您想要的(在滚动窗口上执行计算,而没有大的冗余张量),但是当然只有在下游代码可以使用的情况下。

  2. 如果您使用的是tensorflow,则最好在调用窗口时为该窗口创建一个yield生成器,以便将其放置在tf.Dataset中(请参见.from_generator()方法和示例here)。

  3. 在Keras中,尝试使用具有此功能的TimeseriesGeneratordocs here