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

Posted

技术标签:

【中文标题】如何在 python 中从时间序列数据创建监督学习数据集【英文标题】:How to create supervised learning dataset from time series data in python 【发布时间】:2019-01-22 11:02:52 【问题描述】:

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

[[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 中遇到过这个问题?你能给我一个想法吗?

【问题讨论】:

【参考方案1】:

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

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]]

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

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 数据的开头,或者至少在时间上很接近,因此没有很大的连续性差距),那么您可能对更接近所有值的滑动窗口而不是按天分组的值更感兴趣。考虑以下几点:

vals = [val for day, val in time_series_data]

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

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

您会注意到我们完全删除了日期信息。尽管如此,我们可以很容易地构造一种输入/输出对的形式。

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 中的列表完全相同(因为它们是输入/输出对),同样重要的是X 中的每个列表都是长度相同。同样,y 中的每个列表长度相同。这类问题更适合现有的大部分机器学习算法。

也就是说,如果您的数据中有一个不连续性,例如从第 1 天下午 5:00 结束到第 2 天从第二天早上 7:00 开始,这种方法会隐藏该不连续性的位置特征向量。不过,这可能不是问题。根据您正在做什么以及您拥有什么样的数据,希望这足以开始。玩得开心,欢迎使用机器学习。

【讨论】:

非常感谢您的回答。但是,在运行您的代码时我遇到了问题。我得到的结果是:Out[33]: [[0.5, 0.5, 0.6, 0.3, 0.7, 0.4]]。它不会一天天分开。你能给我建议吗? 对不起;我还没有运行代码,只是假设它是正确的。现在已经修好了。我使用itertools.islice() 的原因是为了有效地跳过time_series_data 中的第一个列表,因为我们已经使用过它。我跳过了最后一个值而不是第一个值的原始代码,因为我没有注意我把 1 放在哪里。 哇,效果很好。非常感谢您的出色回答:)

以上是关于如何在 python 中从时间序列数据创建监督学习数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何将集群标签列添加回原始数据框-python,用于监督学习

如何把时间序列问题转化为监督学习问题?通俗易懂的 Python 教程

如何在 Python 中从 Numpy 矩阵创建列表

在 Python 中从 JSON 数据创建列表和字典 [重复]

在机器学习中创建监督模型

Python深度学习之路-4 监督学习