我有一个时间序列数据,但一天中有很多值,如下所示:
[[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上有这个问题的经验吗?你能给我个主意吗?
答案 0 :(得分:3)
我将制作一些示例数据,以便我们可以了解算法的行为。
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
中的列表一样多(因为它们是输入/输出对),并且同样重要的是{{1}中的每个列表}是相同的长度。同样,X
中的每个列表的长度都相同。这种问题更适合于大多数现有的机器学习算法。
也就是说,如果您的数据中存在不连续,例如从第1天结束于5:00 PM,第2天开始于第二天的7:00 AM,则此方法会将不连续之处隐藏在特征向量。不过,这可能不是问题。根据您正在做的事情以及拥有的数据类型,希望这足以开始。玩得开心,欢迎来到机器学习。