Temporal Fusion Transformer: 深層学習による時系列予測 — 完全なチュートリアル

正確で解釈可能な予測を作成する

DALLE で作成 [1]

[2] によると、 時間融合トランスフォーマー 時系列予測に関しては、すべての著名な深層学習モデルよりも優れたパフォーマンスを発揮します。

目玉商品も含めて 勾配ブースティング ツリー 表形式の時系列データのモデル。

しかし何ですか 時間融合トランスフォーマー (TFT)[3] そしてなぜそんなに面白いのでしょうか?

この記事では、その新規性について簡単に説明します。 時間融合トランスフォーマー エンドツーエンドのプロジェクトを構築します エネルギー需要予測。具体的には、以下について説明します。

  • TFT フォーマット用にデータを準備する方法。
  • TFT モデルを構築、トレーニング、評価する方法。
  • 検証データとサンプル外の予測に関する予測を取得する方法。
  • 計算する方法 機能の重要性, 季節性パターン、 & 極端なイベントに対する堅牢性 組み込みモデルの使用 解釈可能な注意 機構。

中に潜んでみましょう!

Temporal Fusion Transformer アーキテクチャの詳細な分析については、以前の記事を参照してください。 記事.

T時間的な F使用 Tトランスフォーマー(TFT) は、自己注意を利用して複数のタイム シーケンスの複雑な時間的ダイナミクスをキャプチャする Transformer ベースのモデルです。

TFT は以下をサポートします。

  • 複数の時系列: 何千もの単変量または多変量時系列で TFT モデルをトレーニングできます。
  • マルチホライズン予測: モデルは、予測間隔を含む 1 つ以上のターゲット変数のマルチステップ予測を出力します。
  • 異種混合機能: TFT は、時変変数や静的な外生変数など、さまざまなタイプの機能をサポートしています。
  • 解釈可能な予測: 予測は、変数の重要性と季節性の観点から解釈できます。

それらの特性の 1 つは、 時間融合トランスフォーマー。これについては次のセクションで説明します。

注目すべき DL 時系列モデル (例: DeepAR[4])、TFT はさまざまなタイプの機能をサポートしているという点で際立っています。これらは:

  • 時間とともに変化する 既知の
  • 時間とともに変化する 未知の
  • 時間不変 リアル
  • 時間不変 カテゴリー

たとえば、 売上予測の事例:

3 つの製品の売上を予測する必要があるとします。の num sales はターゲット変数です。の CPI index または number of visitors   時間とともに変化する未知の 特徴は予測時までしか知られていないためです。しかし、 holidays& special days   時間とともに変化する既知の イベント。

  product id is 時間不変 (静的) カテゴリカル 特徴。数値的で時間に依存しないその他の特徴: yearly_revenue 次のように分類できます 時不変実数.

プロジェクトに進む前に、まずデータを 拡張時系列フォーマット.

注: この記事内のすべての画像と図は著者が作成したものです。

このチュートリアルでは、 TemporalFusionTransformer からのモデル PyTorch 予測 ライブラリと PyTorch Lightning:

pip インストールトーチ pytorch-lightning pytorch_forecasting

プロセス全体には次の 3 つのことが含まれます。

  1. 時系列データを使用して pandas データフレームを作成します。
  2. データフレームをラップして、 時系列データセット インスタンス。
  3. 私たちの 時系列データセット インスタンスを TemporalFusionTransformer.

  時系列データセット これは、特徴が時変なのか静的なのかを指定するのに役立つため、非常に便利です。さらに、それが唯一のフォーマットです。 TemporalFusionTransformer 受け入れます。

最小限のトレーニング データセットを作成して、その方法を示しましょう。 時系列データセット 作品:

次の方法でデータをフォーマットする必要があります。 色付きの各ボックスは、異なる時系列を表します。 group の値です。

図1: Sample_data pandas データ フレーム

データフレームの最も重要な列は、 time_idx — サンプルの順序を決定します。欠落した観測値がない場合、値は次のように増加するはずです。 +1 時系列ごとに。

次に、データフレームをラップして、 時系列データセット インスタンス:

すべての引数は一目瞭然です。 max_encoder_length ルックバック期間を定義し、 max_prediction_length 予測されるデータポイントの数を指定します。この例では、過去 3 つのタイムステップを遡って 2 つの予測を出力します。

  時系列データセット インスタンスはデータローダーとして機能するようになりました。バッチを印刷して、データがどのように TFT に渡されるかを確認してみましょう。

このバッチにはトレーニング値が含まれています [0,1] 最初の時系列から (group 0) とテスト値[2,3,4]。このコードを再実行すると、データはデフォルトでシャッフルされるため、異なる値が得られます。

私たちのプロジェクトでは、 電気負荷図20112014 【5] UCI からのデータセット。この例のノートブックは次からダウンロードできます。 こちら:

このデータセットには、370 分の頻度での 15​​4 のクライアント/消費者の電力使用量 (KW 単位) が含まれています。データは 2011 年間 (2014 年から XNUMX 年) にわたっています。

一部のコンシューマは 2011 年以降に作成されたため、最初の電力使用量はゼロです。

に従ってデータの前処理を行います 【3]:

  • ターゲット変数を集計する power_usage 時間ごとに。
  • 検出力がゼロ以外のすべての時系列の最も古い日付を見つけます。
  • 新しい機能を作成します。 month, day, hour & day_of_week.
  • 間のすべての日を選択してください 2014–01–01 & 2014–09–07.

はじめましょう:

データをダウンロードする

wgetの https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!解凍
LD2011_2014.txt.zip

データの前処理

各列は消費者を表します。最も初期の power_usage 値は 0 です。

次に、時間ごとのデータに集計します。モデルのサイズと複雑さのため、モデルは 5 つのコンシューマー (ゼロ以外の値を持つコンシューマー) のみでトレーニングされます。

ここで、次のデータセットを準備します。 時系列データセット フォーマット。各列が異なる時系列を表していることに注意してください。したがって、データフレームを「溶かして」、すべての時系列が水平ではなく垂直に積み重ねられるようにします。その過程で、新しい機能を作成します。

最終的に前処理されたデータフレームは次のように呼ばれます。 time_df。その内容を出力してみましょう。

  time_df に適切な形式になりました 時系列データセット。もうお気づきのとおり、粒度は時間単位であるため、 hours_from_start 変数は 時間インデックス。

探索的データ分析

5 人の消費者/時系列の選択はランダムではありません。の power usage 各時系列には、平均値などの異なるプロパティがあります。

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

すべての時系列の最初の月をプロットしてみましょう。

図2: 5 つの時系列/消費者すべての最初の月。

目立った傾向はありませんが、各時系列にはわずかに異なる季節性と振幅があります。定常性や信号分解などをさらに実験して確認することもできますが、ここではモデル構築の側面のみに焦点を当てます。

また、次のような他の時系列予測方法にも注意してください。 有馬 いくつかの要件を満たす必要があります (たとえば、時系列が最初に定常になる必要があります)。TFT を使用すると、データをそのままにしておくことができます。

データローダーの作成

このステップでは、 time_df 時系列データセット この形式は次の理由から非常に便利です。

  • これにより、独自のデータローダーを作成する必要がなくなります。
  • TFT がデータセットの特徴をどのように処理するかを指定できます。
  • データセットを簡単に正規化できます。私たちの場合、すべての時間シーケンスの大きさが異なるため、正規化が必須です。したがって、私たちは、 グループノーマライザー 各時系列を個別に正規化します。

私たちのモデルでは、7 週間 (24*24) のルックバック ウィンドウを使用して、次の XNUMX 時間の電力使用量を予測します。

また、 hours_from_start は時間インデックスであると同時に時間変化する特徴でもあります。の power_usage はターゲット変数です。デモのために、検証セットは最終日です。

ベースラインモデル

次に、ほとんどの人が忘れているステップです。ベースライン モデルです。特に時系列予測では、単純な予測子がより高度なモデルよりも優れたパフォーマンスを発揮することが頻繁にあることに驚かれるでしょう。

単純なベースラインとして、前日の電力使用量曲線を予測します。

時間融合トランスフォーマー モデルのトレーニング

使い慣れたメソッドを使用して TFT モデルをトレーニングできます。 トレイナー PyTorch Lightning のインターフェイス。

次の点に注意してください。

  • 私たちは、使用 早期打ち切り 検証損失を監視するコールバック。
  • を使用しております テンソルボード トレーニングと検証のメトリクスを記録します。
  • 私たちのモデルでは、 分位点の損失 — 予測区間を出力するのに役立つ特別なタイプの損失。分位点損失関数の詳細については、 この記事をチェックしてください.
  • 私たちは4を使用します 注意を払う、元の紙のように。

これで、モデルを構築してトレーニングする準備が整いました。

それでおしまい! 6 エポックの後、EarlyStopping が開始され、トレーニングが停止します。

最適なモデルをロードして保存する

モデルを保存することを忘れないでください。これをピクルすることもできますが、最も安全なオプションは、最良のエポックを直接保存することです。

!zip -r model.zip lightning_logs/lightning_logs/version_1/*

モデルを再度ロードするには、解凍します。 モデル.zip そして、次のコマンドを実行します。最適なモデル パスを覚えておいてください。

テンソルボードをチェックする

Tensorboard を使用したトレーニングと検証の曲線を詳しく見てみましょう。

モデル評価

検証セットの予測を取得し、平均を計算します P50 (分位中央値) 損失:

最後の 2 つの時系列は、相対的な大きさも大きいため、損失が少し大きくなります。

検証データの予測をプロットする

合格したら mode=raw predict() このメソッドを使用すると、7 つの分位数すべての予測を含む、より多くの情報が得られます。アテンション値にもアクセスできます (これについては後で詳しく説明します)。

を詳しく見てみましょう raw_predictions 変数:

私たちは、使用 プロット予測() プロットを作成するために。もちろん、独自のカスタム プロットを作成することもできます。 プロット予測() アテンション値を追加するという追加の利点があります。

注: 私たちのモデルは次の 24 データポイントを予測します 一気に。これは、モデルが予測するローリング予測シナリオではありません。 毎回の値を評価し、すべての予測を「つなぎ合わせ」ます。

消費者ごとに 5 つのプロットを作成します (合計 XNUMX つ)。

図3: MT_002の検証データの予測
図4: MT_004の検証データの予測
図5: MT_005の検証データの予測
図6: MT_006の検証データの予測
図7: MT_008の検証データの予測

結果は非常に印象的です。

本サイトの 時間融合トランスフォーマー モデルは、季節性と規模の両方の観点から、5 つの時系列すべての動作を捉えることができました。

また、次の点にも注意してください。

  • ハイパーパラメータの調整は行っていません。
  • 派手な特徴量エンジニアリング手法は実装していません。

後続のセクションでは、ハイパーパラメーターの最適化を使用してモデルを改善する方法を示します。

特定の時系列の予測をプロットする

以前は、次を使用して検証データの予測をプロットしました。 idx 引数。データセット内のすべての時系列を反復します。より具体的に、特定の時系列に関する予測を出力できます。

図7: 前日の予測 MT_004 トレーニングセットで

In 図7、 私たちは前日の計画を立てます MT_004 時間インデックス = 26512 のコンシューマ。

時間インデックスの列を思い出してください。 hours_from_start は 26304 から始まり、26388 以降の予測を取得できます (以前に設定したため) min_encoder_length=max_encoder_length // 2 等しい 26304 + 168//2=26388

サンプル外の予測

検証データの最終データポイントを超えて、サンプル外の予測を作成しましょう。 2014–09–07 23:00:00

私たちがしなければならないのは、以下を含む新しいデータフレームを作成することだけです。

  • N=max_encoder_length 過去の日付。ルックバック ウィンドウとして機能します。 エンコーダデータ TFT用語で言うと。
  • サイズの将来の日付 max_prediction_length 予測を計算したいのは、 デコーダデータ。

時系列の 5 つすべて、または XNUMX つだけの予測を作成できます。 図7 消費者向けのサンプル外の予測を示します MT_002:

図7: MT_002の前日予測

正確な予測は重要ですが、今日では説明可能性も非常に重要です。

そして、ブラックボックスとみなされている深層学習モデルの場合はさらに悪化します。などの方法 ライム & 形状 (ある程度は)説明可能性を提供できますが、時系列ではうまく機能しません。さらに、これらは外部の事後メソッドであり、特定のモデルに関連付けられていません。

時間融合トランスフォーマー 3 種類の解釈可能性を提供します。

  • 季節性の観点から: TFT はその斬新性を活用 解釈可能な多頭注意 過去のタイムステップの重要性を計算するメカニズム。
  • 機能面: TFT はその特性を活用します。 変数選択ネットワーク すべての特徴の重要性を計算するモジュール。
  • 極端なイベントに対する堅牢性: まれなイベント中に時系列がどのように動作するかを調査できます

内部の仕組みを詳しく知りたい場合は、 解釈可能な多頭注意 & 変数選択ネットワーク、 前回の記事をチェックしてください.

季節ごとの解釈可能性

TFT は、過去の時間ステップにわたる時間的パターンを理解するために、注意の重みを調査します。

前のすべてのプロットの灰色の線は、注意スコアを表します。これらのプロットをもう一度見てください。何か気づきましたか? 図8 の調査結果を示します 図7 また、注意スコアも考慮されます。

図8: 季節性を表示した MT_001 の前日予測

アテンション スコアは、モデルが予測を出力するときにそれらのタイム ステップがどの程度影響を与えるかを明らかにします。小さなピークは毎日の季節性を反映していますが、終わりに向かう高いピークは週ごとの季節性を示唆していると考えられます。

すべてのタイムステップと時系列 (このチュートリアルで使用した 5 つのタイムステップだけでなく) にわたるアテンション カーブを平均すると、対称的に見える形状が得られます。 図9 TFT紙から:

図9: 電力データセットの時間パターン (ソース)

質問: これは何が良いのでしょうか? ACF プロットや時間信号分解などの方法を使用して季節性パターンを単純に推定することはできないでしょうか?

回答: 真実。ただし、TFT のアテンション ウェイトを研究すると、さらに次のような利点があります。

  1. 私たちのモデルがシーケンスの明らかな季節的ダイナミクスを捉えていることを確認できます。
  2. 現在の入力ウィンドウの注意の重みは過去のすべての入力を考慮するため、私たちのモデルは隠れたパターンを明らかにする可能性もあります。
  3. 注意の重みプロットは自己相関プロットと同じではありません。自己相関プロットは特定のシーケンスを参照しますが、ここでの注意の重みはすべての共変量と時系列を調べることによって各タイムステップの影響に焦点を当てています。

機能ごとの解釈可能性

  変数選択ネットワーク TFT のコンポーネントは簡単に推定できます。 機能の重要性:

図10: 検証データを重視する特徴

In 図10、次のことに気づきます。

  •   hour & day_of_week 過去の観測値と将来の共変量の両方として、強力なスコアを持っています。元の論文のベンチマークでも同じ結論が得られます。
  •   power_usage は明らかに観察された共変量の中で最も影響力があります。
  •   consumer_id 5 つのコンシューマのみを使用するため、ここではそれほど重要ではありません。著者らが 370 人の消費者全員を使用している TFT 論文では、この変数はより重要です。

注: グループ化静的変数が重要でない場合、データセットは単一の分布モデル (ARIMA など) によっても同様に適切にモデル化できる可能性が非常に高くなります。

極端なイベントの検出

時系列は、まれなイベント (「 ショック).

さらに悪いことに、それらの出来事は非常にとらえどころのないものです。共変量が静かに動作を変更するために、ターゲット変数が短期間不安定になった場合を想像してください。

これはランダムなノイズでしょうか、それともモデルから漏れ出る隠れた永続的なパターンでしょうか?

TFT を使用すると、値の範囲全体にわたって個々の機能の堅牢性を分析できます。残念ながら、現在のデータセットにはボラティリティやまれなイベントは見られません。これらは財務データや販売データなどで見つかる可能性が高くなります。それでも、それらを計算する方法を示します。

一部の特徴には、検証データセットにすべての値が含まれていないため、 hour & consumer_id:

図11: 時間ごとの予測と実績 (正規化された平均)
図12: Consumer_id の予測と実績 (正規化された平均)

どちらの図でも、期待できる結果が得られています。で 図12、私たちは消費者が MT_004 他の消費者と比較してわずかにパフォーマンスが劣ります。以前に計算した平均電力使用量で各消費者の P50 損失を正規化すれば、これを検証できます。

灰色のバーは各変数の分布を示します。私がいつも行うことの 1 つは、どの値の周波数が低いかを見つけることです。次に、それらの領域でモデルがどのように動作するかを確認します。したがって、モデルがまれなイベントの動作を捉えているかどうかを簡単に検出できます。

一般に、この TFT 機能を使用してモデルの弱点を調査し、さらなる調査に進むことができます。

シームレスに利用できる 時間融合トランスフォーマー   オプトゥナ ハイパーパラメータ調整を実行するには:

問題は、TFT は Transformer ベースのモデルであるため、大量のハードウェア リソースが必要になることです。

時間融合トランスフォーマー これは間違いなく、Time-Series コミュニティにとってマイルストーンです。

このモデルは SOTA の結果を達成するだけでなく、予測の解釈可能性のためのフレームワークも提供します。このモデルは、 ダーツ Python ライブラリ。これは PyTorch Forecasting ライブラリに基づいています。

最後に、のアーキテクチャについて知りたい場合は、 時間融合トランスフォーマー 詳しくは、を確認してください 関連記事 オリジナルの紙に。

Temporal Fusion Transformer: 深層学習による時系列予測 — 完全なチュートリアルをソースから再公開 https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= RSS—-7f60cf5620c9—4 https://towardsdatascience.com/feed 経由

<!–

–>

タイムスタンプ:

より多くの ブロックチェーンコンサルタント