Tensorflow/Kerasで連続しない複数の時系列データを結合して窓関数を適用する

当サイトではアフィリエイト広告を利用しています

Kerasにて時系列データを学習に利用する際、期間の異なる連続しない時系列データを用いたいことがあるかと思います。

ただ、単純に結合したのではつなぎ目の部分が連続しないデータとなってしまうので望ましくないです。

この切れ目を解決してモデルの学習に利用する方法について調べたのでまとめておきます。

利用環境

  • Python 3.9.16
  • numpy version: 1.22.4
  • tensorflow version: 2.12.0
  • keras version: 2.12.0

元となる時系列データの作成

まずは期間の異なる2つの時系列データをnumpyのndarrayで作成します。

import numpy as np
import tensorflow as tf
from tensorflow import keras

a = np.arange(1,10)
b = np.arange(100,110)

print(a)
print(b)
[1 2 3 4 5 6 7 8 9]
[100 101 102 103 104 105 106 107 108 109]

tf.data.Datasetへの変換

tf.data.Dataset.from_tensor_slices()でnumpy配列をTensorflowのDatasetに変換し、ウィンドウ幅5, シフト幅1の窓関数を適用してデータを抽出しています。

このデータはRNNなど時系列対応のモデルへ与えるものと想定しています。

tf_a = tf.data.Dataset.from_tensor_slices(a)
tf_a = tf_a.window(5, shift=1, drop_remainder=True)
for w in tf_a:
  print(list(w.as_numpy_iterator()))

tf_b = tf.data.Dataset.from_tensor_slices(b)
tf_b = tf_b.window(5, shift=1, drop_remainder=True)
for w in tf_b:
  print(list(w.as_numpy_iterator()))
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
[3, 4, 5, 6, 7]
[4, 5, 6, 7, 8]
[5, 6, 7, 8, 9]
[100, 101, 102, 103, 104]
[101, 102, 103, 104, 105]
[102, 103, 104, 105, 106]
[103, 104, 105, 106, 107]
[104, 105, 106, 107, 108]
[105, 106, 107, 108, 109]

窓関数適用後の2つのデータセットをconcatenate関数で接続します。

tf_c = tf_a.concatenate(tf_b)
for w in tf_c:
  print(list(w.as_numpy_iterator()))
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
[3, 4, 5, 6, 7]
[4, 5, 6, 7, 8]
[5, 6, 7, 8, 9]
[100, 101, 102, 103, 104]
[101, 102, 103, 104, 105]
[102, 103, 104, 105, 106]
[103, 104, 105, 106, 107]
[104, 105, 106, 107, 108]
[105, 106, 107, 108, 109]

結合後の後処理

データセット接続後にshuffle,batchなどを行います。

length = a.shape[0] + b.shape[0]
tf_c = tf_c.shuffle(length)
for w in tf_c:
  print(list(w.as_numpy_iterator()))

tf_c = tf_c.batch(5)
for bt in tf_c:
  print(bt)
[105, 106, 107, 108, 109]
[102, 103, 104, 105, 106]
[4, 5, 6, 7, 8]
[101, 102, 103, 104, 105]
[3, 4, 5, 6, 7]
[104, 105, 106, 107, 108]
[2, 3, 4, 5, 6]
[100, 101, 102, 103, 104]
[1, 2, 3, 4, 5]
[5, 6, 7, 8, 9]
[103, 104, 105, 106, 107]

<tensorflow.python.data.ops.dataset_ops._NestedVariant object at 0x7f221cd52be0>
<tensorflow.python.data.ops.dataset_ops._NestedVariant object at 0x7f221cd3ebe0>
<tensorflow.python.data.ops.dataset_ops._NestedVariant object at 0x7f221cd52c10>

まとめ

  • 連続しない複数時系列データを学習データセットに利用したい
  • Datasetクラスのconcatenate関数を使うとよい
  • 結合後にshuffleやbatchなどを適用する