【发布时间】:2021-03-31 08:37:01
【问题描述】:
分散在我网站上的传感器(相同类型)正在不定期地手动向我的后端报告。在报告之间,传感器聚合事件并将它们作为一个批次报告。
以下数据集是序列事件数据的集合,批量收集。例如传感器 1 报告了 2 次。在第一批 2 事件和第二批 3 事件,而传感器 2 报告 1 次 3 事件。
我想将此数据用作我的火车数据X
| sensor_id | batch_id | timestamp | feature_1 | feature_n |
|---|---|---|---|---|
| 1 | 1 | 2020-12-21T00:00:00+00:00 | 0.54 | 0.33 |
| 1 | 1 | 2020-12-21T01:00:00+00:00 | 0.23 | 0.14 |
| 1 | 2 | 2020-12-21T03:00:00+00:00 | 0.51 | 0.13 |
| 1 | 2 | 2020-12-21T04:00:00+00:00 | 0.23 | 0.24 |
| 1 | 2 | 2020-12-21T05:00:00+00:00 | 0.33 | 0.44 |
| 2 | 1 | 2020-12-21T00:00:00+00:00 | 0.54 | 0.33 |
| 2 | 1 | 2020-12-21T01:00:00+00:00 | 0.23 | 0.14 |
| 2 | 1 | 2020-12-21T03:00:00+00:00 | 0.51 | 0.13 |
我的目标y,是根据传感器收集的所有事件计算得出的分数:
即socre_sensor_1 = f([[batch1...],[batch2...]])
| sensor_id | final_score |
|---|---|
| 1 | 0.8 |
| 2 | 0.6 |
我想在每次收集一个批次时预测 y,即对带有 2 个报告的传感器的 I.E 2 预测。
LSTM 模型:
我从 LSTM 模型开始,因为我试图预测事件的时间序列。
我的第一个想法是选择一个固定大小的输入,并在收集的事件数小于输入大小时对输入进行零填充。然后屏蔽填充值:
model.add(Masking(mask_value=0., input_shape=(num_samples, num_features)))
例如:
| sensor_id | batch_id | timestamp | feature_1 | feature_n |
|---|---|---|---|---|
| 1 | 1 | 2020-12-21T00:00:00+00:00 | 0.54 | 0.33 |
| 1 | 1 | 2020-12-21T01:00:00+00:00 | 0.23 | 0.14 |
如果选择的长度为 5,将产生以下输入:
[
[0.54, 0.33],
[0.23, 0.14],
[0,0],
[0,0],
[0,0]
]
但是,我的火车数据中每个传感器报告的事件数量差异很大,一份报告可以收集 1000 个事件,而另一份可以收集 10 个事件。因此,如果我选择平均大小(假设为 200),一些输入会有很多填充,而另一些会被截断并且数据会丢失。
我听说过ragged tensors,但我不确定它是否适合我的用例。如何解决这样的问题?
【问题讨论】:
-
您可以重新构建您的问题以具有固定的序列长度。您可以尝试
(batch, 1, features),而不是尝试将您的网络工作适应(batch, seq (between 10 and 1000), features)。您的可变数量的事件将在批处理维度中传递,并且在训练期间将不再影响您的模型。 -
@YoanB.M.Sc 感谢您的回复,能否请您详细说明或添加代码?
-
见下面的答案。不要忘记重塑你的标签,以确保每个时间步都有一个匹配的标签。
-
可变大小的输入序列非常常见,可以通过将 LSTM 的输入形状指定为
none来解决。您只需要确保在给定批次中传递相同长度的序列即可;这就是诀窍。因此,如果您在这样的网络中传递批量大小为 1 的每个事件集,则可以处理可变大小的序列,而无需填充/截断。查看我的答案了解更多详情。 -
另外,只是一个简单的问题,你的输出也是可变长度的吗?还是它的固定长度,无论输入序列的长度如何?我也可以针对这种情况修改我的代码示例,但是 IIUC 你有固定的形状输出和可变长度的输入。
标签: python tensorflow keras lstm