如何从 python 中的时间序列数据创建监督学习数据集

How to create supervised learning dataset from time series data in python

我有一个时间序列数据,但一天有很多值,如下所示:

[[day1, x1],
 [day1, x2],
 [day1, x3],
 [day2, x4],
 [day2, x5],
 [day3, x6],
 [day4, x7],
 [day4, x8],
 [day4, x9],
  ......]

等等。 我想使用 python 将这个时间序列转换为监督学习数据集。 我期望的数据集如下:

[[[all values in day1], [all values in day2]],
 [[all values in day2], [all values in day3]],
 [[all values in day3], [all values in day4]],
 .....]

有没有人在 python 中遇到过这个问题?你能给我一个主意吗?

我将制作一些示例数据以供使用,以便我们了解算法的行为方式。

time_series_data = [[1, 0.5],
                    [1, 0.6],
                    [2, 0.3],
                    [3, 0.7],
                    [3, 0.4],
                    [4, 0.1]]

除此之外,我们可以继续按日期转换拆分此列表。

import itertools as it
res = [[time_series_data[0][1]]]

for i, (day, val) in enumerate(it.islice(time_series_data, 1, len(time_series_data))):
    if time_series_data[i][0] != day:
        res.append([val])
    else:
        res[-1].append(val)

检查输出,我们发现它所做的只是按天分组。

>>> res
[[0.5, 0.6], [0.3], [0.7, 0.4], [0.1]]

然后要将其实际转化为监督学习问题,我们需要 input/output 对。

data = [res[i:i+2] for i in range(0, len(res)-1)]

这具有所需的输出:

>>>> data
[[[0.5, 0.6], [0.3]],
 [[0.3],      [0.7, 0.4]],
 [[0.7, 0.4], [0.1]]]

关于按天分组的一件有趣的事情是我们不再需要获得相同长度的列表。许多监督学习算法依赖于 特征向量 的想法,其中长度保留在整个数据集中。要将它们应用于更奇特的对象,您必须首先弄清楚如何从这些对象中提取固定长度的特征向量(这里的对象指的是,例如 [0.5, 0.6])。

如果您每天有相同数量的数据点,这不会有问题,但如果数据点数量不同并且 运行 天在一起(即您的 day1 数据对应于你的 day2 数据的开头,或者至少是时间接近的东西,所以没有很大的连续性差距),那么你可能对更接近滑动的东西更感兴趣 window 跨所有值,而不是按天分组的值。考虑以下因素:

vals = [val for day, val in time_series_data]

像往常一样,我们检查输出以弄清楚这里发生了什么。

>>> vals
[0.5, 0.6, 0.3, 0.7, 0.4, 0.1]

您会注意到我们完全删除了日期信息。完成后,我们可以轻松构建 input/output 对的形式。

input_length = 2
output_length = 1

X = [vals[i:i+input_length] for i in xrange(0, len(vals)-input_length-output_length+1)]
y = [vals[i:i+output_length] for i in xrange(input_length, len(vals)-output_length+1)]

现在检查输入(我称之为 X)和输出(我称之为 y)。

>>> X
[[0.5, 0.6],
 [0.6, 0.3],
 [0.3, 0.7],
 [0.7, 0.4]]

>>> y
[[0.3],
 [0.7],
 [0.4],
 [0.1]]

您会看到 X 中的列表与 y 中的列表一样多(因为它们是 input/output 对),同样重要的是X等长。同样,y 中的每个列表都是相同的长度。这种问题更适合现有的大部分机器学习算法。

就是说,如果您的数据中有 不连续性 ,比如从第 1 天结束于 5:00PM 和第 2 天从第二天 7:00AM 开始,这种方法隐藏了特征向量中不连续性的位置。不过这可能不是问题。根据您正在做的事情和您拥有的数据类型,希望这足以开始。玩得开心,欢迎来到机器学习。