「タイムシリーズの拡張」

「拡張するタイムシリーズ」

シンプルで効果的な方法でタイムシリーズデータの量を増やす方法

このブログ記事はGitHub上のjupyter notebookとして利用できます。

データ拡張は、コンピュータビジョンパイプラインの中で不可欠な要素となっています。ただし、それらの人気は、時間系列などの他のドメインではまだ同じ高みに達していません。このチュートリアルでは、時間系列データの拡張の世界に深く入り込み、その重要性に光を当て、強力な生成時間系列モデリングライブラリであるTSGM [5]を使用した具体的な適用例を提供します。

出発点はデータセット(𝐗, 𝐲)です。ここで、𝐱ᵢ ∈ 𝐗は多変量(各時間点が多次元の特徴ベクトルである)の時間系列であり、𝐲はラベルです。ラベル 𝐲 の予測を下流タスクと呼びます。目標は、(𝐗, 𝐲) を使用して追加のサンプル (𝐗*, 𝐲*) を生成し、下流タスクをより効果的に解決するのに役立つことです(予測性能や堅牢性の観点で)。シンプルさのために、このチュートリアルではラベルを扱いませんが、ここで説明する方法はラベルのある場合に簡単に一般化できます。また、使用するソフトウェア実装は、.generateメソッドに追加のパラメータを追加することで、教師ありの場合に容易に拡張することができます(下記の例を参照)。

さあ、早速時間系列の拡張を見ていきましょう。TSGMでは、すべての拡張はtsgm.models.augmentationsに整理されています。詳細なドキュメントは、TSGMドキュメンテーションでご覧いただけます。それでは、tsgmをインストールして実際のコーディング例を開始しましょう。

pip install tsgm

次に、tsgmをインポートし、素晴らしいデータセットをロードします。テンソル Xには、長さ64、2つの特徴を持つ100の正弦波の時間系列が含まれています。ランダムなシフト、周波数、振幅(最大振幅は20)が付いています。

# ライブラリをインポート
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import random
from tensorflow import keras
import tsgm

# データセットを生成
X = tsgm.utils.gen_sine_dataset(100, 64, 2, max_value=20)

ジッタリング/ガウシアンノイズ

最初に、最初の拡張としてジッタリングを考えます。

時間系列データはランダムなガウスノイズで拡張されます(Wikipedia

tsgmでは、ガウシアンノイズの拡張は次のように適用されます:

aug_model = tsgm.models.augmentations.GaussianNoise()
samples = aug_model.generate(X=X, n_samples=10, variance=0.2)

ガウスノイズの拡張のアイデアは、時間系列にわずかなジッタリングを追加しても、それを大きく変化させることはないが、データセット内のそのようなノイズ付きのサンプルの量を増やすことです。これにより、下流モデルはノイズの多いサンプルに対してより堅牢になったり、予測性能が向上したりすることがよくあります。ガウスノイズのハイパーパラメータやノイズの追加方法(例えば、ガウスノイズが時間系列の終わりに向かって増加することがある)は難しい問題であり、特定のデータセットや下流の問題に依存します。これらのパラメータがターゲットモデルのパフォーマンスにどのように影響するかを検証し、実験するのはしばしば価値があります。ここでは、元の正弦波データセットと拡張されたサンプルの視覚化を提供します。

Original time series and synthetic data generated via Jittering.

特徴のシャッフル

時間系列の拡張のもう一つのアプローチは、単純に特徴をシャッフルすることです。このアプローチは、特定の多変量時間系列に適しており、それらが特定の特徴の順列に対して不変である場合に使用されます。たとえば、各特徴がさまざまなセンサーからの同じ独立した測定値を示す時間系列に適用できます。

このアプローチを説明するために、S_1、S_2、S_3、S_4、およびS_5とラベル付けされた5つの同じセンサーの例を取り上げましょう。説明のために、センサー1から4はおそらく回転に関して交換可能であると仮定しましょう。それでは、S_1、…、S_5センサーの回転に関してデータを特徴回転で拡張することは意味があります。

この例では、5つのセンサーが存在し、それらのセンサーからの測定値は5次元の時系列データを生成します。センサー1から4までを任意に回転させ、新しい合成サンプル(たとえば1→2、2→3、3→4、4→1)を生成することができます。したがって、元のデータにこのような変換を適用することで、新しい合成サンプルを生成することができます。

前の例と同様に、拡張は以下のように機能することがあります:

aug_model = tsgm.models.augmentations.Shuffle()samples = aug_model.generate(X=X, n_samples=3)

ここでは、5つの特徴を持つ時系列データからサンプルを1つ表示し、上の画像に類似した拡張サンプルを示しています。

元の時系列データとシャッフルされた特徴によって生成された合成データ。

スライスとシャッフル

スライスとシャッフル増強[3]は、時間系列データをスライスし、それらのピースをシャッフルするものです。この増強は、時間に対して不変性を示す時間系列に対して行うことができます。たとえば、数日間のウェアラブルデバイスから測定された時間系列を想像してみてください。この場合、時間系列を日単位でスライスし、それらの日をシャッフルすることで追加のサンプルを取得するのが良い戦略です。スライスとシャッフルの増強は以下のイメージで視覚化されています:

スライスとシャッフルの図解。
aug_model = tsgm.models.augmentations.SliceAndShuffle()samples = aug_model.generate(X=X, n_samples=10, n_segments=3)

増強されたサンプルと元のサンプルを表示してみましょう:

元の時系列データとスライスとシャッフルによって生成された合成データ。

マグニチュードワーピング

マグニチュードワーピング[3]は、時間系列データセットの各サンプルのマグニチュードを元の時間系列に対して3次スプライン曲線の乗算によって変更します。このプロセスにより、時間系列のマグニチュードがスケールされ、多くの場合有益です。たとえば、sinesを含む合成例では、ランダムな大きさのn_knots個のノットがN(1, σ^2)として分布され、パラメータsigmaで設定されます。

aug_model = tsgm.models.augmentations.MagnitudeWarping()samples = aug_model.generate(X=X, n_samples=10, sigma=1)

以下は、元のデータとで生成された増強サンプルの例です。

マグニチュードワーピングによって生成されたオリジナルの時系列データと合成データ。

ウィンドウワーピング

この技術[4]では、時系列データの選択されたウィンドウが速度を上げたり下げたりします。その後、結果の時系列全体を元のサイズにスケーリングして、タイムステップを元の長さに保ちます。以下はそのような拡張の例です。

このような拡張は、例えば装置のモデリングにおいて有益です。このような応用では、センサーの測定値は装置の使用方法に応じて変化する速度変化を示すことがあります。

tsgmでは、生成は以下のように行うことができます。

aug_model = tsgm.models.augmentations.WindowWarping()samples = aug_model.generate(X=X, n_samples=10, scales=(0.5,), window_ratio=0.5)

以下は生成された時系列の例です。

ウィンドウワーピングによって生成されたオリジナルの時系列データと合成データ。

ダイナミックタイムワーピングバリセントリック平均法(DTWBA)

ダイナミックタイムワーピングバリセントリック平均法(DTWBA)[2]は、ダイナミックタイムワーピング(DTW)に基づいた拡張手法です。DTWは時系列間の類似性を測定する方法です。アイデアは、次の図で示されているように、これらの時系列を「同期」することです。

DTWは、2つの時系列信号$\sin(x)$と$\sin(2x)$に対して計測されます。DTW計測は白線で示されています。また、相互類似度行列が視覚化されています。

DTWの計算の詳細については、https://rtavenar.github.io/blog/dtw.htmlを参照してください。

DTWBAは以下のようになります:1. アルゴリズムはDTWBA結果を初期化するために1つの時系列を選択します。この時系列は明示的に指定することも、データセットからランダムに選択することもできます。2. 各Nの時系列に対して、アルゴリズムはDTW距離とパス(距離を最小化するマッピング)を計算します。3. 全てのNのDTW距離を計算した後、アルゴリズムは上記で見つかった全てのパスに対して平均を行い、DTWBA結果を更新します。4. アルゴリズムはステップ(2)と(3)をDTWBA結果が収束するまで繰り返します。

参考実装はtslearnにあり、[2]に説明があります。

tsgmでは、サンプルは以下のように生成されます。

aug_model = tsgm.models.augmentations.DTWBarycentricAveraging()initial_timeseries = random.sample(range(X.shape[0]), 10)initial_timeseries = X[initial_timeseries]samples = aug_model.generate(X=X, n_samples=10, initial_timeseries=initial_timeseries )
DTWBAを用いたオリジナルのタイムシリーズと生成された合成データ。

ジェネレーティブ機械学習モデルによる拡張

拡張の別のアプローチは、過去のデータで機械学習モデルを訓練し、新たな合成サンプルを生成するように訓練することです。新たなサンプルがどのように生成されたかを解釈するのは困難なため、これはブラックボックスの方法です。タイムシリーズの場合、VAE、GAN、ガウス過程などの手法が適用できます。VAEを用いた合成タイムシリーズの生成の例は次の通りです。

n, n_ts, n_features = 1000, 24, 5
data = tsgm.utils.gen_sine_dataset(n, n_ts, n_features)
scaler = tsgm.utils.TSFeatureWiseScaler()
scaled_data = scaler.fit_transform(data)

architecture = tsgm.models.zoo[“vae_conv5”](n_ts, n_features, 10)
encoder, decoder = architecture.encoder, architecture.decoder
vae = tsgm.models.cvae.BetaVAE(encoder, decoder)
vae.compile(optimizer=keras.optimizers.Adam())
vae.fit(scaled_data, epochs=1, batch_size=64)
samples = vae.generate(10)

結論

合成タイムシリーズの生成にはいくつかの手法を試しました。これらの多くはモデルに帰納バイアスを導入し、実践的な設定で役立ちます。

どの手法を選ぶべきか?まず、問題に不変性が含まれているかを分析してください。ランダムノイズに対して不変ですか?特徴のシャッフルに対して不変ですか?

次に、幅広い手法を選択し、選択された手法のいずれかが下流の問題のパフォーマンスを向上させるかどうかを検証してください(tsgmには下流のパフォーマンス指標があります)。その後、性能向上が最も大きい拡張手法を選択してください。

最後に、この記事の執筆においてLetizia IannucciとGeorgy Gritsenkoに助力と有益な議論をいただきましたことに感謝します。特に明記されていない限り、すべての画像は著者によるものです。

このブログ記事はTSGMプロジェクトの一部です。このプロジェクトでは、拡張と合成データ生成を通じてタイムシリーズパイプラインを強化するためのツールを作成しています。役に立った場合は、リポジトリをご覧いただき、TSGMに関する論文の引用を検討してください。

@article{  nikitin2023tsgm,  title={TSGM: A Flexible Framework for Generative Modeling of Synthetic Time Series},  author={Nikitin, Alexander and Iannucci, Letizia and Kaski, Samuel},  journal={arXiv preprint arXiv:2305.11567},  year={2023}}

参考文献

[1] H. Sakoe and S. Chiba, “Dynamic programming algorithm optimization for spoken word recognition”. IEEE Transactions on Acoustics, Speech, and Signal Processing, 26(1), 43–49 (1978).

[2] F. Petitjean, A. Ketterlin & P. Gancarski. A global averaging method for dynamic time warping, with applications to clustering. Pattern Recognition, Elsevier, 2011, Vol. 44, Num. 3, pp. 678–693

[3] Um TT, Pfister FM, Pichler D, Endo S, Lang M, Hirche S,Fietzek U, Kulic´ D (2017) Data augmentation of wearable sensor data for parkinson’s disease monitoring using convolutional neural networks. In: Proceedings of the 19th ACM international conference on multimodal interaction, pp. 216–220

[4] Rashid, K.M. and Louis, J., 2019. Window-warping: a time series data augmentation of IMU data for construction equipment activity identification. In ISARC. Proceedings of the international symposium on automation and robotics in construction (Vol. 36, pp. 651–657). IAARC Publications.

[5] Nikitin, A., Iannucci, L. and Kaski, S., 2023年. TSGM:合成時間シリーズの生成モデリングの柔軟なフレームワーク. arXiv preprint arXiv:2305.11567. Arxivリンク

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more