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
がデータに実際にある最も遅いタイムスタンプよりも後である場合は、その実際にある最も遅いタイムスタンプが終了ポイントとして使用されます。endTime
がstartTime
に等しい場合は、ストリーミングのシナリオでよく使用される、1 つのデータ ポイントの推論を意味します。
トレーニング API の省略可能なパラメーター
トレーニング API のその他のパラメーターは省略可能です。
slidingWindow
- 異常を特定するために使用されるデータポイントの数。 28 から 2,880 の整数値です。 既定値は、300 です。slidingWindow
がモデル トレーニングのk
である場合、有効な結果を得るには、推論時にソース ファイルから少なくともk
ポイントにアクセスできる必要があります。MVAD は、次のデータ ポイントが異常であるかどうかを決定するためにデータ ポイントのセグメントを取ります。 セグメントの長さは
slidingWindow
です。slidingWindow
値を選択する場合は、次の 2 つの点にご注意ください。- データのプロパティ: 周期的であり、サンプリング レートであるかどうか。 データが周期的な場合は、1 から 3 サイクルの長さを
slidingWindow
として設定できます。 分レベルまたは秒レベルのように、データの頻度が高すぎる (細分性が小さい) 場合は、slidingWindow
に比較的高い値を設定できます。 - トレーニング/推論時間と潜在的なパフォーマンスへの影響のトレードオフ。
slidingWindow
が大きいほど、トレーニング/推論時間が長くなる場合があります。slidingWindow
が大きいほど、精度が向上するという保証はありません。slidingWindow
が小さいと、モデルが最適なソリューションに収束できなくなる可能性があります。 たとえば、slidingWindow
に 2 つのポイントしかない場合、異常を検出するのは困難です。
- データのプロパティ: 周期的であり、サンプリング レートであるかどうか。 データが周期的な場合は、1 から 3 サイクルの長さを
alignMode
- タイムスタンプに複数の変数 (時系列) を配置する方法。 このパラメーターには、Inner
とOuter
という 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
を埋める方法。 マージされたテーブルに不足値がある場合は、適切に処理する必要があります。 これらを埋めるには、いくつかの方法があります。 オプションはLinear
、Previous
、Subsequent
、Zero
、Fixed
で、既定値は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
- パディング値はfillNAMethod
がFixed
であり、その場合に指定する必要があるときにnan
を埋めるために使用されます。 その他の場合は、省略可能です。displayName
- これは、モデルを識別するために使用される省略可能なパラメーターです。 たとえば、パラメーター、データ ソース、およびモデルとその入力データに関するその他のメタデータをマークするために使用できます。 既定値は空の文字列です。
入力データ スキーマ
MVAD は、メトリックのグループからの異常を検出します。各メトリックを変数または時系列と呼びます。
Microsoft (https://aka.ms/AnomalyDetector/MVADSampleData) からサンプル データ ファイルをダウンロードして、承認されたスキーマを確認することができます。
各変数には、
timestamp
とvalue
の 2 つのフィールドだけが必要で、コンマ区切り値 (CSV) ファイルに格納する必要があります。CSV ファイルの列名は、大文字と小文字が区別されるため、正確に
timestamp
とvalue
にする必要があります。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_1
、series_2
、series_3
、series_4
、series_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 つの新しいタイムスタンプで推論を行う場合、データ ファイルには先導slidingWindow
と 1 つのデータ ポイントのみを含めることができます。先に進んで、同じ数のデータ ポイント (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 のタイムスタンプを頻度に合うように適切に "丸め" る必要があります。
事前処理が行われなかった場合、何が起こるかを見てみましょう。 alignMode
を Outer
(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 モデルでそれらの相関関係に関する情報を抽出することはできません。 alignMode
を Inner
に設定した場合、変数 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 であるすべてのデータ ポイントを異常として取得する。 |
誤検出が多すぎる。 | isAnomaly と severity (または score ) の両方を使用して、重大ではない異常を除外し、(必要に応じて) グループ化を使用して異常の持続時間を確認して、ランダム ノイズを抑制する必要があります。 severity と score の違いについては、下の「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" が異常であるかどうかを予測します。
startTime
とendTime
は同じ値 ("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
) であることが理想です。
severity
と score
の違い
通常は、ビジネスにとってあまり重要ではない "異常" を除外するフィルターとして severity
を使用することをお勧めします。 シナリオとデータ パターンによって異なりますが、重要度が低いこれらの異常では、severity
値が比較的低いか、ランダムなスパイクのような独立した (不連続の) 高い severity
値であることがほとんどです。
severity
のしきい値や高い severity
値の継続時間よりも高度なルールが必要な場合は、score
を使用してさらに強力なフィルターを設定できます。 MVAD による score
を使用した異常の判断方法を理解しておくと、役に立つ可能性があります。
データ ポイントの異常は、グローバルとローカルの両方の観点から検討されます。 タイムスタンプの score
が特定のしきい値を上回っている場合、そのタイムスタンプは異常とマークされます。 score
はしきい値未満であるが、セグメント内で相対的に高い場合も、異常とマークされます。