我有一个时间序列数据,但是一天有很多值,如下所示:
[[day1, x1],
[day1, x2],
[day1, x3],
[day2, x4],
[day2, x5],
[day3, x6],
[day4, x7],
[day4, x8],
[day4, x9],
......]
诸若此类。我想将这个时间序列转换为使用python的监督学习数据集。我的expect数据集如下:
[[[all values in day1], [all values in day2]],
[[all values in day2], [all values in day3]],
[[all values in day3], [all values in day4]],
.....]
有人有处理这个问题的经验吗?你能给我个主意吗?
发布于 2018-08-15 15:29:56
我将制作一些样本数据来处理,这样我们就可以看到算法是如何工作的。
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
中的每个列表都是相同的长度。这种问题更适合于现有的机器学习算法。
也就是说,如果您的数据中有一个discontinuity,比如从下午5:00结束的day1到第二天早上7:00开始的day2,这种方法隐藏了特征向量中不连续性的位置。不过,这可能不是一个问题。根据您正在做的事情和您拥有的数据类型,希望这足够开始。玩得开心,欢迎来到机器学习。
https://stackoverflow.com/questions/51860895
复制相似问题