Multivariate Anomaly Detector API の使用に関するベスト プラクティス

重要

2023 年 9 月 20 日以降は、新しい Anomaly Detector リソースを作成できなくなります。 Anomaly Detector サービスは、2026 年 10 月 1 日に廃止されます。

この記事では、多変量異常検出 (MVAD) API を使用する際の推奨プラクティスに関するガイダンスを提供します。 このチュートリアルでは、次のことについて説明します。

  • API の使用方法: エラーを発生させずに MVAD を使用する方法について説明します。
  • データ エンジニアリング: 高品質のデータを用意して MVAD がより高い精度で実行されるようにする方法について説明します。
  • 一般的な落とし穴: 顧客が遭遇する一般的な落とし穴を回避する方法について説明します。
  • FAQ: よく寄せられる質問の回答について説明します。

API の使用

MVAD の使用中にエラーが発生しないようにするには、このセクションの手順に従います。 まだエラーが発生する場合は、エラー コードの完全な一覧を参照して、説明と対処法を確認してください。

入力パラメーター

必須のパラメーター

API 要求のトレーニングと推論には、次の 3 つのパラメーターが必要です。

  • source - Shared Access Signature (SAS) を使用した Azure Blob Storage にある zip ファイルへのリンク。
  • startTime - トレーニングまたは推論に使用されるデータの開始時刻。 データに実際にある最も早いタイムスタンプより前である場合は、その実際にある最も早いタイムスタンプが開始ポイントとして使用されます。
  • endTime - トレーニングまたは推論に使用されるデータの終了時刻。この値は、startTime 以降である必要があります。 endTime がデータに実際にある最も遅いタイムスタンプよりも後である場合は、その実際にある最も遅いタイムスタンプが終了ポイントとして使用されます。 endTimestartTime に等しい場合は、ストリーミングのシナリオでよく使用される、1 つのデータ ポイントの推論を意味します。

トレーニング API の省略可能なパラメーター

トレーニング API のその他のパラメーターは省略可能です。

  • slidingWindow - 異常を特定するために使用されるデータポイントの数。 28 から 2,880 の整数値です。 既定値は、300 です。 slidingWindow がモデル トレーニングの k である場合、有効な結果を得るには、推論時にソース ファイルから少なくとも k ポイントにアクセスできる必要があります。

    MVAD は、次のデータ ポイントが異常であるかどうかを決定するためにデータ ポイントのセグメントを取ります。 セグメントの長さは slidingWindow です。 slidingWindow 値を選択する場合は、次の 2 つの点にご注意ください。

    1. データのプロパティ: 周期的であり、サンプリング レートであるかどうか。 データが周期的な場合は、1 から 3 サイクルの長さを slidingWindow として設定できます。 分レベルまたは秒レベルのように、データの頻度が高すぎる (細分性が小さい) 場合は、slidingWindow に比較的高い値を設定できます。
    2. トレーニング/推論時間と潜在的なパフォーマンスへの影響のトレードオフ。 slidingWindow が大きいほど、トレーニング/推論時間が長くなる場合があります。 slidingWindow が大きいほど、精度が向上するという保証はありませんslidingWindow が小さいと、モデルが最適なソリューションに収束できなくなる可能性があります。 たとえば、slidingWindow に 2 つのポイントしかない場合、異常を検出するのは困難です。
  • alignMode - タイムスタンプに複数の変数 (時系列) を配置する方法。 このパラメーターには、InnerOuter という 2 つのオプションがあり、既定値は Outer です。

    このパラメーターは、変数のタイムスタンプ シーケンス間に不整合がある場合に重要です。 このモデルでは、さらに処理する前に、変数を同じタイムスタンプ シーケンスに配置する必要があります。

    Inner の場合、モデルでは、すべての変数に値 (つまり、すべての変数の交点) を持つタイムスタンプに対してのみ、検出結果がレポートされます。 Outerの場合、モデルでは、すべての変数に値 (つまり、すべての変数の和集合) を持つタイムスタンプに対してのみ、検出結果がレポートされます。

    ここでは、さまざまな alignModel 値を説明するために例を示します。

    "変数-1"

    timestamp value
    2020-11-01 1
    2020-11-02 2
    2020-11-04 4
    2020-11-05 5

    "変数-2"

    timestamp value
    2020-11-01 1
    2020-11-02 2
    2020-11-03 3
    2020-11-04 4

    "2 つの変数の Inner 結合"

    timestamp Variable-1 変数-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-04 4 4

    "2 つの変数の Outer 結合"

    timestamp Variable-1 変数-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-03 nan 3
    2020-11-04 4 4
    2020-11-05 5 nan
  • fillNAMethod - マージされたテーブルで nan を埋める方法。 マージされたテーブルに不足値がある場合は、適切に処理する必要があります。 これらを埋めるには、いくつかの方法があります。 オプションは LinearPreviousSubsequentZeroFixed で、既定値は Linear です。

    オプション Method
    Linear nan 値を線状補間で埋める
    Previous 最後に有効だった値を伝達してギャップを埋める。 例: [1, 2, nan, 3, nan, 4] ->[1, 2, 2, 3, 3, 4]
    Subsequent 次に有効な値を使用して、ギャップを埋める。 例: [1, 2, nan, 3, nan, 4] ->[1, 2, 3, 3, 4, 4]
    Zero 0 で nan 値を埋める。
    Fixed paddingValue で指定した有効な指定値で nan 値を埋める。
  • paddingValue - パディング値は fillNAMethodFixed であり、その場合に指定する必要があるときに nan を埋めるために使用されます。 その他の場合は、省略可能です。

  • displayName - これは、モデルを識別するために使用される省略可能なパラメーターです。 たとえば、パラメーター、データ ソース、およびモデルとその入力データに関するその他のメタデータをマークするために使用できます。 既定値は空の文字列です。

入力データ スキーマ

MVAD は、メトリックのグループからの異常を検出します。各メトリックを変数または時系列と呼びます。

  • Microsoft (https://aka.ms/AnomalyDetector/MVADSampleData) からサンプル データ ファイルをダウンロードして、承認されたスキーマを確認することができます。

  • 各変数には、timestampvalue の 2 つのフィールドだけが必要で、コンマ区切り値 (CSV) ファイルに格納する必要があります。

  • CSV ファイルの列名は、大文字と小文字が区別されるため、正確に timestampvalue にする必要があります。

  • timestamp 値は、ISO 8601 に準拠している必要があります。value は、整数または小数点以下の桁数が任意の小数にすることができます。 CSV ファイルの内容の良い例を次に示します。

    timestamp value
    2019-04-01T00:00:00Z 5
    2019-04-01T00:01:00Z 3.6
    2019-04-01T00:02:00Z 4
    ... ...

    Note

    timestamp に時間、分、秒が含まれている場合は、API を呼び出す前にこれらが適切に切り上げられていることを確認します。

    たとえば、データ頻度が 30 秒ごとに 1 つのデータ ポイントと想定されていても、"12:00:01" や "12:00:28" のような timestamp が表示されている場合、それは timestamp を "12:00:00" や "12:00:30" のような新しい値に事前に処理する必要があるという強力なシグナルです。

    詳細については、ベスト プラクティスのドキュメントの「timestamp の切り上げ」セクションを参照してください。

  • CSV ファイルの名前は変数名として使用されるため、一意である必要があります。 たとえば、"temperature.csv" や "humidity.csv" などです。

  • トレーニング用の変数と推論用の変数は、一致している必要があります。 たとえば、トレーニングに series_1series_2series_3series_4series_5 を使用する場合は、推論に対してまったく同じ変数を指定する必要があります。

  • CSV ファイルは ZIP ファイルに圧縮し、Azure BLOB コンテナーにアップロードする必要があります。 ZIP ファイルには任意の名前を付けることができます。

フォルダー構造

データ準備でよくある間違いは、ZIP ファイル内の余分なフォルダーです。 たとえば、ZIP ファイルの名前が series.zip だとします。 次に、このファイルを新しいフォルダー ./series に展開すると、CSV ファイルへの正しいパスは ./series/series_1.csv で、間違ったパスは ./series/foo/bar/series_1.csv になる可能性があります。

Windows で ZIP ファイルを展開した後のディレクトリ ツリーの正しい例

.
└── series
    ├── series_1.csv
    ├── series_2.csv
    ├── series_3.csv
    ├── series_4.csv
    └── series_5.csv

Windows で ZIP ファイルを展開した後のディレクトリ ツリーの間違った例

.
└── series
    └── series
        ├── series_1.csv
        ├── series_2.csv
        ├── series_3.csv
        ├── series_4.csv
        └── series_5.csv

Data Engineering

これで、MVAD API を使用して、コードをエラーなしで実行できます。 モデルの精度を向上させるために何ができるでしょうか?

データ品質

  • モデルは履歴データから標準パターンを学習するので、トレーニング データはシステムの全体的な標準状態を表している必要があります。 モデルがこの種のパターンを学習するのは、トレーニング データに多くの異常が含まれている場合は困難です。 良好な精度を保つための経験上の異常率のしきい値は 1% 以下です。
  • 一般に、トレーニング データの欠損値比率は 20% 未満である必要があります。 欠損データが多すぎると、自動的に入力された値 (通常は線形値や定数値) が標準パターンであると学習される可能性があります。 これにより、実際の (欠損していない) データ ポイントが異常として検出される可能性があります。

データの数量

  • MVAD の基になるモデルには、何百万ものパラメーターがあります。 最適なパラメーター セットを学習するには、最小数のデータ ポイントが必要です。 経験則によると、モデルを良好な精度でトレーニングするには、変数ごとに 5,000 個以上のデータ ポイント (タイムスタンプ) を用意する必要があります。 一般に、トレーニング データが多くなるにつれて、精度も向上します。 ただし、その量のデータを得ることができない場合でも、少ないデータで実験を行って、妥協した精度を許容できるかどうかを確認することをお勧めします。

  • 毎回の推論 API の呼び出し時に、ソース データ ファイルに十分なデータ ポイントが含まれていることを確認する必要があります。 それは、通常は、slidingWindow に、推論結果が本当に必要なデータ ポイントの数を加えたものになります。 たとえば、ストリーミングの場合、毎回 1 つの新しいタイムスタンプで推論を行う場合、データ ファイルには先導 slidingWindow1 つのデータ ポイントのみを含めることができます。先に進んで、同じ数のデータ ポイント (slidingWindow + 1) を含む別の zip ファイルを作成できますが、"右" 側に 1 ステップ移動し、別の推論ジョブを実行します。

    それを超えるまたは先導スライディング ウィンドウの "前" にあるものは推論結果にまったく影響を与えず、パフォーマンスのダウングレードを引き起こす可能性があるだけです。 それより下のものは NotEnoughInput エラーを発生させる可能性があります。

タイムスタンプの切り上げ

変数のグループ (時系列) では、各変数を独立したソースから収集できます。 異なる変数のタイムスタンプは、互いに一貫性がなく、既知の頻度と一致しない可能性があります。 次に単純な例を示します。

"変数-1"

timestamp value
12:00:01 1.0
12:00:35 1.5
12:01:02 0.9
12:01:31 2.2
12:02:08 1.3

Variable-2

timestamp value
12:00:03 2.2
12:00:37 2.6
12:01:09 1.4
12:01:34 1.7
12:02:04 2.0

30 秒ごとに 1 つのデータ ポイントを送信する 2 つのセンサーから、2 つの変数を収集しています。 ただし、センサーは正確な一定の頻度でデータ ポイントを送信しているわけではなく、早くなる場合も遅くなる場合もあります。 MVAD では、さまざまな変数間の相関関係が考慮されるため、メトリックがシステムの状態を正しく反映できるように、タイムスタンプを適切に調整する必要があります。 上の例では、調整前に、変数 1 と変数 2 のタイムスタンプを頻度に合うように適切に "丸め" る必要があります。

事前処理が行われなかった場合、何が起こるかを見てみましょう。 alignModeOuter (2 つのセットの和集合を意味します) に設定した場合、マージされたテーブルは次のようになります。

timestamp Variable-1 Variable-2
12:00:01 1.0 nan
12:00:03 nan 2.2
12:00:35 1.5 nan
12:00:37 nan 2.6
12:01:02 0.9 nan
12:01:09 nan 1.4
12:01:31 2.2 nan
12:01:34 nan 1.7
12:02:04 nan 2.0
12:02:08 1.3 nan

nan は欠損値を示します。 明らかに、このマージされたテーブルは、期待していたものではありません。 変数 1 と変数 2 のインターリーブでは、MVAD モデルでそれらの相関関係に関する情報を抽出することはできません。 alignModeInner に設定した場合、変数 1 と変数 2 に共通するタイムスタンプが存在しないため、マージされたテーブルは空になります。

したがって、変数 1 と変数 2 のタイムスタンプを前処理する (最も近い 30 秒のタイムスタンプに丸める) 必要があり、新しい時系列は次のようになります。

"変数-1"

timestamp value
12:00:00 1.0
12:00:30 1.5
12:01:00 0.9
12:01:30 2.2
12:02:00 1.3

Variable-2

timestamp value
12:00:00 2.2
12:00:30 2.6
12:01:00 1.4
12:01:30 1.7
12:02:00 2.0

これで、マージされたテーブルは、妥当なものになりました。

timestamp Variable-1 Variable-2
12:00:00 1.0 2.2
12:00:30 1.5 2.6
12:01:00 0.9 1.4
12:01:30 2.2 1.7
12:02:00 1.3 2.0

近接しているタイムスタンプの異なる変数の値が適切に調整され、MVAD モデルで相関関係情報を抽出できるようになりました。

制限事項

トレーニング API および推論 API にはいくつかの制限事項があります。エラーを回避するために、これらの制限事項に注意する必要があります。

一般的な制限事項

  • スライディング ウィンドウ: 28 から 2880 個のタイムスタンプ、既定値は 300 です。 定期的なデータの場合は、スライディング ウィンドウとして 2 から 4 サイクルの長さを設定します。
  • 変数の数: トレーニングとバッチ推論の場合、変数の数は最大 301 個。

トレーニングの制限事項

  • タイムスタンプ: 最大 1,000,000。 タイムスタンプが小さすぎると、モデルの品質が低下する可能性があります。 5,000 より多くのタイムスタンプを使用することをお勧めします。
  • 細分性: 最小の時間単位は per_second です。

バッチ推論の制限事項

  • タイムスタンプ: 最大 20000、少なくともスライディング ウィンドウ 1 つ分の長さ。

ストリーミング推論の制限事項

  • タイムスタンプ: 最大 2880、少なくともスライディング ウィンドウ 1 つ分の長さ。
  • タイムスタンプの検出: 1 から 10。

モデルの品質

実際のシナリオで擬陽性と偽陰性を処理する方法

異常の重要性を示す重大度が提供されています。 擬陽性は、重大度のしきい値を設定することでフィルターできます。 推論データにパターンのずれがある場合、擬陽性が多発することがあります。 このような場合は、新しいデータでのモデルの再トレーニングが必要になる場合があります。 トレーニング データに含まれる異常が多すぎる場合は、検出結果に偽陰性が存在している可能性があります。 これは、モデルがトレーニング データからパターンを学習し、異常によってモデルに偏りが生じる可能性があるためです。 したがって、適切なデータ クリーニングを行うことで、偽陰性を減らせる場合があります。

トレーニングの損失と検証の損失によって、どのモデルを使用するのが最適かを推定する方法

一般に、ラベル付きデータセットなしで最適なモデルを決定するのは困難です。 ただし、トレーニングと検証の損失を活用して大まかな推定を行い、それらの不適切なモデルを破棄することができます。 まず、トレーニングの損失が収束するかどうかを観察する必要があります。 損失の発散は、多くの場合、モデルの品質が低いことを示しています。 次に、損失値は、アンダーフィットまたはオーバーフィットが発生するかどうかを識別するのに役立つ場合があります。 アンダーフィットまたはオーバーフィットしているモデルでは、目的のパフォーマンスが得られない可能性があります。 第 3 に、損失関数の定義は検出パフォーマンスを直接反映していませんが、損失値はモデルの品質を推定する補助ツールになる場合があります。 損失値が小さいことは適切なモデルに必要な条件であるため、損失値が大きいモデルは破棄できます。

よくある落とし穴

エラー コード テーブルは別として、Microsoft では、MVAD API を使用しているときに陥りやすい落とし穴について、お客様から学んできています。 次の表は、これらの問題を回避するために役立ちます。

落とし穴 結果 説明と解決方法
トレーニング データや推論データのタイムスタンプが、各変数のそれぞれのデータ頻度に合うように丸められなかった。 推論結果のタイムスタンプが予想どおりではない。タイムスタンプが少なすぎるか多すぎる。 タイムスタンプの切り上げ」をご覧ください。
トレーニング データ内の異常なデータ ポイントが多すぎる。 トレーニング中に異常なデータ ポイントが通常のパターンとして扱われるため、モデルの精度が悪影響を受ける。 経験上、異常率を 1% 以下に保つことで改善されます。
トレーニング データが少なすぎる。 モデルの精度が落ちる。 経験上、MVAD モデルのトレーニングで良好な精度を維持するには、変数ごとに 15,000 個以上のデータポイント (タイムスタンプ) が必要です。
isAnomaly=true であるすべてのデータ ポイントを異常として取得する。 誤検出が多すぎる。 isAnomalyseverity (または score) の両方を使用して、重大ではない異常を除外し、(必要に応じて) グループ化を使用して異常の持続時間を確認して、ランダム ノイズを抑制する必要があります。 severityscore の違いについては、下の「FAQ」セクションを参照してください。
サブフォルダーが、トレーニングまたは推論用のデータ ファイル内に圧縮されている。 トレーニングまたは推論時に、サブフォルダー内の csv データ ファイルが無視される。 zip ファイルでは、サブフォルダーは許可されません。 詳細については、「フォルダー構造」を参照してください。
推論データ ファイル内のデータが多すぎる。例: すべての履歴データを推論データ zip ファイルに圧縮している エラーは表示されない可能性はあるが、Azure Blob に zip ファイルをアップロードしようとしたときや、推論を実行しようとしたときに、パフォーマンスが低下する。 詳細については、「データの数量」を参照してください。
MVAD がまだサポートされていない Azure リージョンでの Anomaly Detector リソースの作成と MVAD API の呼び出し。 MVAD API の呼び出し中に "リソースが見つかりません" というエラーが発生する。 プレビュー段階では、MVAD は限られたリージョンでのみ利用できます。 「Anomaly Detector の新機能」をブックマークして、常に MVAD リージョンのロールアウトに関する最新情報を確認してください。 また、GitHub の問題を報告したり、AnomalyDetector@microsoft.com に連絡して特定のリージョンをリクエストすることもできます。

よく寄せられる質問

MVAD のスライディング ウィンドウのしくみ

2 つの例を使用して、MVAD のスライディング ウィンドウのしくみを学びましょう。 slidingWindow = 1,440 と設定し、入力データの細分性が 1 分であるとします。

  • ストリーミング シナリオ: 1 つのデータ ポイント "2021-01-02T00:00:00Z" が異常であるかどうかを予測します。 startTimeendTime は同じ値 ("2021-01-02T00:00:00Z") になります。 ただし、推論データ ソースには、少なくとも 1,440 + 1 個のタイムスタンプが含まれている必要があります。 理由は、MVAD では、ターゲット データ ポイント ("2021-01-02T00:00: 00Z") の前にある先導データを取得して、ターゲットが異常であるかどうかが判断されるためです。 この例では、必要な先導データの長さは slidingWindow (1,440) です。 1,440 = 60 * 24 であるため、入力データは、遅くても "2021-01-01T00:00:00Z" から始まる必要があります。

  • バッチ シナリオ: 予測するターゲット データ ポイントが複数あります。 endTime は、startTime よりも大きくなります。 このようなシナリオでの推論は、"移動ウィンドウ" という方法で実行されます。 たとえば、MVAD では、2021-01-01T00:00:00Z から 2021-01-01T23:59:00Z (この値を含む) までのデータを使用して、2021-01-02T00:00:00Z のデータが異常かどうかを判断します。 次に、前方に移動して、2021-01-01T00:01:00Z から 2021-01-02T00:00:00Z (この値を含む) までのデータを使用して、2021-01-02T00:01:00Z のデータが異常かどうかを判断します。 endTime に指定された最後のタイムスタンプ (または実際の最後のタイムスタンプ) まで、同じ方法で (比較する 1,440 個のデータ ポイントを取得しながら) 移動していきます。 そのため、推論データ ソースには、startTime - slidingWindow から始まるデータが含まれている必要があり、合計サイズが slidingWindow + (endTime - startTime) であることが理想です。

severityscore の違い

通常は、ビジネスにとってあまり重要ではない "異常" を除外するフィルターとして severity を使用することをお勧めします。 シナリオとデータ パターンによって異なりますが、重要度が低いこれらの異常では、severity 値が比較的低いか、ランダムなスパイクのような独立した (不連続の) 高い severity 値であることがほとんどです。

severity のしきい値や高い severity 値の継続時間よりも高度なルールが必要な場合は、score を使用してさらに強力なフィルターを設定できます。 MVAD による score を使用した異常の判断方法を理解しておくと、役に立つ可能性があります。

データ ポイントの異常は、グローバルとローカルの両方の観点から検討されます。 タイムスタンプの score が特定のしきい値を上回っている場合、そのタイムスタンプは異常とマークされます。 score はしきい値未満であるが、セグメント内で相対的に高い場合も、異常とマークされます。

次のステップ