我正在对时间序列数据集进行预处理,将其形状从二维(数据点,特征)改变为三维(数据点,时间窗口,特征)。
在这样的视角下,时间窗口(有时也称为回溯)表示涉及作为输入变量以预测下一个时间段的前几个时间步骤/数据点的数量。换句话说,时间窗口是机器学习算法考虑单个未来预测所需的过去数据量。
这种方法(或者至少是我的实现方式)的问题在于它在内存使用方面相当低效,因为它会导致窗口之间的数据冗余,使输入数据变得非常沉重。
以下是我一直在使用的函数,将输入数据重新塑造为三维结构。
我被建议使用numpy的步幅技巧来克服这个问题并减小重塑数据的大小。不幸的是,到目前为止我找到的任何资源都集中在实现该技巧在二维数组上,就像这个优秀教程一样。我的用例涉及三维输出,我一直在努力。这是我最好的结果;然而,它既没有成功地减小framed_data的大小,也没有正确地框定数据,因为它没有通过质量测试。
我相当确定我的错误在于我没有完全理解步幅参数。 new_strides是我成功地向as_strided提供的唯一值。
任何帮助都将不胜感激!
在这样的视角下,时间窗口(有时也称为回溯)表示涉及作为输入变量以预测下一个时间段的前几个时间步骤/数据点的数量。换句话说,时间窗口是机器学习算法考虑单个未来预测所需的过去数据量。
这种方法(或者至少是我的实现方式)的问题在于它在内存使用方面相当低效,因为它会导致窗口之间的数据冗余,使输入数据变得非常沉重。
以下是我一直在使用的函数,将输入数据重新塑造为三维结构。
from sys import getsizeof
def time_framer(data_to_frame, window_size=1):
"""It transforms a 2d dataset into 3d based on a specific size;
original function can be found at:
https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/
"""
n_datapoints = data_to_frame.shape[0] - window_size
framed_data = np.empty(
shape=(n_datapoints, window_size, data_to_frame.shape[1],)).astype(np.float32)
for index in range(n_datapoints):
framed_data[index] = data_to_frame[index:(index + window_size)]
print(framed_data.shape)
# it prints the size of the output in MB
print(framed_data.nbytes / 10 ** 6)
print(getsizeof(framed_data) / 10 ** 6)
# quick and dirty quality test to check if the data has been correctly reshaped
test1=list(set(framed_data[0][1]==framed_data[1][0]))
if test1[0] and len(test1)==1:
print('Data is correctly framed')
return framed_data
我被建议使用numpy的步幅技巧来克服这个问题并减小重塑数据的大小。不幸的是,到目前为止我找到的任何资源都集中在实现该技巧在二维数组上,就像这个优秀教程一样。我的用例涉及三维输出,我一直在努力。这是我最好的结果;然而,它既没有成功地减小framed_data的大小,也没有正确地框定数据,因为它没有通过质量测试。
我相当确定我的错误在于我没有完全理解步幅参数。 new_strides是我成功地向as_strided提供的唯一值。
from numpy.lib.stride_tricks import as_strided
def strides_trick_time_framer(data_to_frame, window_size=1):
new_strides = (data_to_frame.strides[0],
data_to_frame.strides[0]*data_to_frame.shape[1] ,
data_to_frame.strides[0]*window_size)
n_datapoints = data_to_frame.shape[0] - window_size
print('striding.....')
framed_data = as_strided(data_to_frame,
shape=(n_datapoints, # .flatten() here did not change the outcome
window_size,
data_to_frame.shape[1]),
strides=new_strides).astype(np.float32)
# it prints the size of the output in MB
print(framed_data.nbytes / 10 ** 6)
print(getsizeof(framed_data) / 10 ** 6)
# quick and dirty test to check if the data has been correctly reshaped
test1=list(set(framed_data[0][1]==framed_data[1][0]))
if test1[0] and len(test1)==1:
print('Data is correctly framed')
return framed_data
任何帮助都将不胜感激!