我将制作一些示例数据,以便我们了解算法的行为方式。
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 开始,这种方法会隐藏该不连续性的位置特征向量。不过,这可能不是问题。根据您正在做什么以及您拥有什么样的数据,希望这足以开始。玩得开心,欢迎使用机器学习。