Keras的输入组合:时间序列和功能

时间:2018-03-08 14:16:53

标签: input keras time-series

我有几个时间序列功能(ECG,HRV和呼吸)以及由这些时间序列制作的单独功能(例如SDNN,RMSSD,......)。

我遵循Francois Chollet的命名。对于3D时间序列输入张量,他们使用[样本,时间步长,特征]

时间序列每时间步长[15000x1],[15000x1],...]有15000个值(样本),而单独的特征每时间步长有1个值(样本)。长度为[1]的额外特征是不同的对于每个时间步。 [0.3],[0.35],[0.34],...]。

                     ECG,      HRV,   F1,   F2,  ...
-------------------------------------------------------------
Sequence 1 |
    Step 1 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 2 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 3 |     [[15000x1],[1000x1],[1x1],[1x1],...] 

Sequence 2 |
    Step 1 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 2 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 3 |     [[15000x1],[1000x1],[1x1],[1x1],...] 

您如何以最佳方式学习使用Keras的所有输入?

  1. 只需将零个功能从1填充到15000并将它们添加到时间序列
  2. 自己填充单独的功能(重复使用一个值)
  3. 当数据在0和1之间归一化时,使用超出该额外功能范围的值来填充。例如。 1000
  4. 只有时间序列作为3D张量输入,单独的特征作为附加输入(作为额外的图层)并将它们合并到学习者(多输入)
  5. 额外的问题。由于“虚假”的附加信息,零填充如何影响学习者?特别是对于1到15000部分的上述独立功能。另一个例子:由于不同的采样频率,HRV和呼吸信号比ECG短。在这里,我将使用插值而不是零填充。你是否同意,或者零填充不会影响学习者?

    由于

1 个答案:

答案 0 :(得分:2)

假设1

由于含糊不清,我假设这个(如果不是,请发表评论,我会改变它)

  • 我打电话给ECG,HRV等功能,每步不同
  • 频率最高的功能有15000步,而其他功能步数较少
  • 您有一个单独的功能,它不是顺序的,也没有步骤。 (我在本回答中将其称为单独功能

额外问题:

是的!插入不太频繁的特征并使输入张量如下:

  • (numberOfSequences_maybePatient, 15000 steps, features_ECG_HRV_etc)

您需要在发生时的功能之间保持相关性,这是通过同步步骤来实现的。

零填充是否会影响结果?

是的,除非你使用" masking" (掩蔽层)。但这只适用于处理不同长度的样本(不同序列或患者),而不是长度/采样率不同的特征

示例,以下情况适用于零填充和屏蔽:

  • 序列1:长度100(包括所有特征,ECG,HRV等)
  • 序列2:长度200(包括所有特征,ECG,HRV等)

如何处理separate feature

有许多可能的方法。最简单的一个,也许是非常有效的,是使它成为所有15000步的恒定序列。这种方法不需要考虑该特征如何与其余数据相关,并将任务留给模型

假设第一个序列的单独特征值为2,第二个序列的单独特征值为4,则生成此数据数组:

                          ECG, HRV, separate
--------------------------------------------------------
             |   [
sequence 1:  |      [
step 1       |            [ecg1, hrv1, 2],
step 2       |            [ecg2, hrv2, 2],
step 3       |            [ecg3, hrv3, 2]
             |      ]
             |
sequence 2:  |      [
step 1       |            [ecg4, hrv4, 4],
step 2       |            [ecg5, hrv5, 4],
step 3       |            [ecg6, hrv6, 4]
             |      ]
             |   ]

您还可以输入作为模型中的附加输入:

regularSequences = Input((15000,features))
separateFeature = Input((1,)) #assuming 1 value per sequence    

然后你决定是否要把它加在某个地方,在某个地方加倍,等等。如果你知道这个特征的含义以及它与其他数据的关系,这种方法可能比另一个方法更有效。选择最佳操作和位置。

假设2

从更新后的答案中获取此说明:

                     ECG,      HRV,   F1,   F2,  ...
-------------------------------------------------------------
Sequence 1 |
    Step 1 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 2 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 3 |     [[15000x1],[1000x1],[1x1],[1x1],...] 

Sequence 2 |
    Step 1 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 2 |     [[15000x1],[1000x1],[1x1],[1x1],...] 
    Step 3 |     [[15000x1],[1000x1],[1x1],[1x1],...] 

然后:

  • ECG中的单个时间步长有15000个功能。 (你确定这不是一个15000步的序列吗?)
  • HRV中的单个时间步有1000个功能。 (你确定这不是一个1000步的序列吗?)
  • 每个时间步都有其他几个单独的功能。

好吧,组织这些数据非常简单(但请注意我上面提到的问题),只需在每个时间步骤中将所有功能打包在一起:

输入数据的形状为:(sequences, steps, 16002)

                     ECG,      HRV,   F1,   F2,  ...
-------------------------------------------------------------
              [
Sequence 1 |    [
    Step 1 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
    Step 2 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
    Step 3 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
                ]
Sequence 2 |    [
    Step 1 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
    Step 2 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
    Step 3 |     [ecg1,ecg2,...,ecg15000,hrv1,hrv2,...hrv1000,F1,F2,...]
                ]