チュートリアル: 多変量異常検出について 1 時間で学習する

多変量異常検出 (MVAD) を備えた Anomaly Detector は、教師なし の方法でメトリックのグループから異常を検出するための高度な AI ツールです。

一般に、MVAD を使用するには、次の手順を実行します。

  1. Azure 上で MVAD をサポートする Anomaly Detector リソースを作成します。
  2. データを準備します。
  3. MVAD モデルをトレーニングします。
  4. モデルの状態のクエリを実行します。
  5. トレーニング済みの MVAD モデルを使用して異常を検出します。
  6. 推論結果を取得して解釈します。

このチュートリアルでは、次のことについて説明します。

  • 正しい形式でデータを準備する方法について説明します。
  • MVAD を使用してトレーニングと推論を行う方法について説明します。
  • 入力パラメーターと、推論結果の出力を解釈する方法について説明します。

1. MVAD をサポートする Anomaly Detector リソースを作成する

注意

プレビュー段階では、MVAD は限られたリージョンでのみ使用できます。 「Anomaly Detector の新機能」をブックマークして、常に MVAD リージョンのロールアウトに関する最新情報を確認してください。 また、GitHub で問題を報告したり、AnomalyDetector@microsoft.com に連絡して特定のリージョンを要求することもできます。

2. データの準備

次に、トレーニング データ (および推論データ) を準備する必要があります。

入力データ スキーマ

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
    ... ...

    注意

    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

データを圧縮およびアップロードするためのツール

このセクションでは、MVAD の入力データを処理する自分のアプリケーション ロジックにコピー、編集して追加することができるサンプル コードとツールについて説明します。

*nix での CSV ファイルの圧縮

zip -j series.zip series/*.csv

Windows での CSV ファイルの圧縮

  • すべての CSV ファイルを含むフォルダー "内に" 移動します。
  • 必要なすべての CSV ファイルを選択します。
  • CSV ファイルの 1 つを右クリックし、Send to を選択します。
  • ドロップダウン リストから Compressed (zipped) folder を選択します。
  • 必要に応じて zip ファイルの名前を変更します。

Azure Blob Storage にデータを圧縮してアップロードする Python コード

Azure Blob にファイルをアップロードする方法については、このドキュメントを参照してください。

または、以下のサンプル コードを参照して、圧縮とアップロードを行うこともできます。 このセクションの Python コードをコピーして .py ファイル (例: zipAndUpload.py) として保存し、次のようなコマンド ラインを使用して実行できます。

  • python zipAndUpload.py -s "foo\bar" -z test123.zip -c {azure blob connection string} -n container_xxx

    このコマンドは、foo\bar 内のすべての CSV ファイルを test123.zip という名前の単一の zip ファイルに圧縮します。 test123.zip が BLOB 内のコンテナー container_xxx にアップロードされます。

  • python zipAndUpload.py -s "foo\bar" -z test123.zip -c {azure blob connection string} -n container_xxx -r

    このコマンドは上記と同じことを行いますが、アップロードが正常に完了すると zip ファイル test123.zip が削除されます。

引数:

  • --source-folder-s、CSV ファイルを含むソース フォルダーへのパス
  • --zipfile-name-z、zip ファイルの名前
  • --connection-string-c、BLOB への接続文字列
  • --container-name-n、コンテナーの名前
  • --remove-zipfile-r、オンの場合 zip ファイルを削除
import os
import argparse
import shutil
import sys

from azure.storage.blob import BlobClient
import zipfile


class ZipError(Exception):
    pass


class UploadError(Exception):
    pass


def zip_file(root, name):
    try:
        z = zipfile.ZipFile(name, "w", zipfile.ZIP_DEFLATED)
        for f in os.listdir(root):
            if f.endswith("csv"):
                z.write(os.path.join(root, f), f)
        z.close()
        print("Compress files success!")
    except Exception as ex:
        raise ZipError(repr(ex))


def upload_to_blob(file, conn_str, cont_name, blob_name):
    try:
        blob_client = BlobClient.from_connection_string(conn_str, container_name=cont_name, blob_name=blob_name)
        with open(file, "rb") as f:
            blob_client.upload_blob(f, overwrite=True)
        print("Upload Success!")
    except Exception as ex:
        raise UploadError(repr(ex))


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--source-folder", "-s", type=str, required=True, help="path to source folder")
    parser.add_argument("--zipfile-name", "-z", type=str, required=True, help="name of the zip file")
    parser.add_argument("--connection-string", "-c", type=str, help="connection string")
    parser.add_argument("--container-name", "-n", type=str, help="container name")
    parser.add_argument("--remove-zipfile", "-r", action="store_true", help="whether delete the zip file after uploading")
    args = parser.parse_args()

    try:
        zip_file(args.source_folder, args.zipfile_name)
        upload_to_blob(args.zipfile_name, args.connection_string, args.container_name, args.zipfile_name)
    except ZipError as ex:
        print(f"Failed to compress files. {repr(ex)}")
        sys.exit(-1)
    except UploadError as ex:
        print(f"Failed to upload files. {repr(ex)}")
        sys.exit(-1)
    except Exception as ex:
        print(f"Exception encountered. {repr(ex)}")

    try:
        if args.remove_zipfile:
            os.remove(args.zipfile_name)
    except Exception as ex:
        print(f"Failed to delete the zip file. {repr(ex)}")

3. MVAD モデルをトレーニングする

MVAD モデルをトレーニングするサンプル要求本文と Python のサンプル コードを次に示します。

// Sample Request Body
{
    "slidingWindow": 200,
    "alignPolicy": {
        "alignMode": "Outer",
        "fillNAMethod": "Linear", 
        "paddingValue": 0
    },
    // This could be your own ZIP file of training data stored on Azure Blob and a SAS url could be used here
    "source": "https://aka.ms/AnomalyDetector/MVADSampleData", 
    "startTime": "2021-01-01T00:00:00Z", 
    "endTime": "2021-01-02T12:00:00Z", 
    "displayName": "Contoso model"
}
# Sample Code in Python
########### Python 3.x #############
import http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': '{API key}',
}

params = urllib.parse.urlencode({})

try:
    conn = http.client.HTTPSConnection('{endpoint}')
    conn.request("POST", "/anomalydetector/v1.1-preview/multivariate/models?%s" % params, "{request body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################

応答コード 201 は要求の成功を示します。

入力パラメーター

必須のパラメーター

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 変数-1 変数-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-04 4 4

    "2 つの変数の Outer 結合"

    timestamp 変数-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 を埋める方法。 マージされたテーブルに不足値がある場合は、適切に処理する必要があります。 これらを埋めるには、いくつかの方法があります。 オプションは、LinearPreviousSubsequentZero、および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 - パディング値は fillNAMethodFixed であり、その場合に指定する必要があるときに nan を埋めるために使用されます。 その他の場合は、省略可能です。

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

4. モデルの状態を取得する

トレーニング API は非同期です。トレーニング API を呼び出してもすぐにはモデルを取得することはできません。 ただし、すべてのモデルを一覧表示する API キー、または特定のモデルに関する情報を一覧表示するモデル ID を使用して、モデルの状態を照会できます。

すべてのモデルを一覧表示する

要求 URL と要求ヘッダーについては、このページを参照してください。 更新時間順に 10 個のモデルのみが返されていることに注意してください。ただし、要求 URL で $skip$top のパラメーターを設定することで、他のモデルにアクセスできます。 たとえば、要求 URL が https://{endpoint}/anomalydetector/v1.1-preview/multivariate/models?$skip=10&$top=20 の場合は、最新の 10 個のモデルをスキップし、次の 20 個のモデルが返されます。

応答のサンプルは次のとおりです

{
    "models": [
         {
             "createdTime":"2020-12-01T09:43:45Z",
             "displayName":"DevOps-Test",
             "lastUpdatedTime":"2020-12-01T09:46:13Z",
             "modelId":"b4c1616c-33b9-11eb-824e-0242ac110002",
             "status":"READY",
             "variablesCount":18
         },
         {
             "createdTime":"2020-12-01T09:43:30Z",
             "displayName":"DevOps-Test",
             "lastUpdatedTime":"2020-12-01T09:45:10Z",
             "modelId":"ab9d3e30-33b9-11eb-a3f4-0242ac110002",
             "status":"READY",
             "variablesCount":18
         }
    ],
    "currentCount": 1,
    "maxCount": 50, 
    "nextLink": "<link to more models>"
}

応答には、modelscurrentCountmaxCountnextLink の 4 つのフィールドが含まれています。

  • models には、作成時刻、最終更新時刻、モデル ID、表示名、変数の数、各モデルの状態が含まれます。
  • currentCount には、トレーニング済みの多変量モデルの数が含まれます。
  • maxCount は、この Anomaly Detector リソースでサポートされるモデルの最大数です。
  • nextLink を使用して、より多くのモデルをフェッチできます。

モデル ID でモデルを取得する

このページは、モデル ID でモデル情報のクエリを実行する要求 URL について説明しています。 サンプルの応答は次のようになります

{
        "modelId": "45aad126-aafd-11ea-b8fb-d89ef3400c5f",
        "createdTime": "2020-06-30T00:00:00Z",
        "lastUpdatedTime": "2020-06-30T00:00:00Z",
        "modelInfo": {
          "slidingWindow": 300,
          "alignPolicy": {
            "alignMode": "Outer",
            "fillNAMethod": "Linear",
            "paddingValue": 0
          },
          "source": "<TRAINING_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS>",
          "startTime": "2019-04-01T00:00:00Z",
          "endTime": "2019-04-02T00:00:00Z",
          "displayName": "Devops-MultiAD",
          "status": "READY",
          "errors": [],
          "diagnosticsInfo": {
            "modelState": {
              "epochIds": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
              "trainLosses": [0.6291328072547913, 0.1671326905488968, 0.12354248017072678, 0.1025966405868533, 
                              0.0958492755889896, 0.09069952368736267,0.08686016499996185, 0.0860302299260931,
                              0.0828735455870684, 0.08235538005828857],
              "validationLosses": [1.9232804775238037, 1.0645641088485718, 0.6031560301780701, 0.5302737951278687, 
                                   0.4698025286197664, 0.4395163357257843, 0.4182931482799006, 0.4057914316654053, 
                                   0.4056498706340729, 0.3849248886108984],
              "latenciesInSeconds": [0.3398594856262207, 0.3659665584564209, 0.37360644340515137, 
                                     0.3513407707214355, 0.3370304107666056, 0.31876277923583984, 
                                     0.3283309936523475, 0.3503587245941162, 0.30800247192382812,
                                     0.3327946662902832]
            },
            "variableStates": [
              {
                "variable": "ad_input",
                "filledNARatio": 0,
                "effectiveCount": 1441,
                "startTime": "2019-04-01T00:00:00Z",
                "endTime": "2019-04-02T00:00:00Z",
                "errors": []
              },
              {
                "variable": "ad_ontimer_output",
                "filledNARatio": 0,
                "effectiveCount": 1441,
                "startTime": "2019-04-01T00:00:00Z",
                "endTime": "2019-04-02T00:00:00Z",
                "errors": []
              },
              // More variables
            ]
          }
        }
      }

クエリされたモデルに関する詳細な情報を受け取ります。 応答には、モデルに関するメタ情報、そのトレーニング パラメーター、診断情報が含まれます。 診断情報は、デバッグとトレーニングの進行状況のトレースに役立ちます。

  • epochIds は、モデルが合計 100 エポックでトレーニングされたエポックの数を示します。 たとえば、モデルがまだトレーニング状態の場合、epochId[10, 20, 30, 40, 50] であれば、50 回目のトレーニング エポックが完了し、残り半分を残していることを意味します。
  • trainLossesvalidationLosses は、最適化の進行状況が収束したかどうかを確認するために使用されます。その場合、2 つの損失は徐々に減少します。
  • latenciesInSeconds にはエポックごとに時間コストが含まれており、10 エポックごとに記録されます。 この例では、10 回目のエポックは約 0.34 秒です。 これは、トレーニングの完了時間を見積もる場合に役立ちます。
  • variableStates は、各変数に関する情報の概要を示します。 これは filledNARatio により降順で順位付けされたリストです。 各変数にいくつのデータ ポイントが使用されているかを示し、filledNARatio はいくつのポイントが欠けているかを示します。 通常、できる限り filledNARatio を小さくする必要があります。 欠落しているデータ ポイントが多すぎると、モデルの精度が低下します。
  • データ処理中のエラーは errors フィールドに含まれます。

5. MVAD を使用した推論

推論を実行するには、推論データ、開始時刻、終了時刻を含む zip ファイルに対し BLOB ソースを用意するだけです。

推論も非同期なので、結果はすぐには返されません。 後で結果を取得できる場所がわかるように、resultId を含む 応答ヘッダー 内の結果のリンクを変数に保存する必要があることに注意してください。

通常、エラーはモデルの問題またはデータの問題によって発生します。 モデルの準備ができていない場合、またはデータ リンクが無効な場合は、推論を実行できません。 トレーニング データと推論データに一貫性があることを確認してください。つまり、それらは まったく 同じ変数であるが、タイムスタンプが異なっている必要があります。 変数の数が増加、変数の数が減少、または異なる変数セットを使用した推論では、データ検証フェーズに合格できずに、エラーが発生します。 結果のクエリを実行した場合にのみエラー メッセージが表示されるように、データ検証は遅延されます。

6. 推論結果を取得する

結果を取得するには resultId が必要です。 resultId は、推論の要求を送信するときに応答ヘッダーから取得されます。 このページには、推論結果に対してクエリを実行する手順が記載されています。

サンプルの応答は次のようになります

 {
        "resultId": "663884e6-b117-11ea-b3de-0242ac130004",
        "summary": {
          "status": "READY",
          "errors": [],
          "variableStates": [
            {
              "variable": "ad_input",
              "filledNARatio": 0,
              "effectiveCount": 26,
              "startTime": "2019-04-01T00:00:00Z",
              "endTime": "2019-04-01T00:25:00Z",
              "errors": []
            },
            {
              "variable": "ad_ontimer_output",
              "filledNARatio": 0,
              "effectiveCount": 26,
              "startTime": "2019-04-01T00:00:00Z",
              "endTime": "2019-04-01T00:25:00Z",
              "errors": []
            },
            // more variables
          ],
          "setupInfo": {
            "source": "https://aka.ms/AnomalyDetector/MVADSampleData",
            "startTime": "2019-04-01T00:15:00Z",
            "endTime": "2019-04-01T00:40:00Z"
          }
        },
        "results": [
          {
            "timestamp": "2019-04-01T00:15:00Z",
            "errors": [
              {
                "code": "InsufficientHistoricalData",
                "message": "historical data is not enough."
              }
            ]
          },
          // more results
          {
            "timestamp": "2019-04-01T00:20:00Z",
            "value": {
              "contributors": [],
              "isAnomaly": false,
              "severity": 0,
              "score": 0.17805261260751692
            }
          },
          // more results
          {
            "timestamp": "2019-04-01T00:27:00Z",
            "value": {
              "contributors": [
                {
                  "contributionScore": 0.0007775013367514271,
                  "variable": "ad_ontimer_output"
                },
                {
                  "contributionScore": 0.0007989604079048129,
                  "variable": "ad_series_init"
                },
                {
                  "contributionScore": 0.0008900927229851369,
                  "variable": "ingestion"
                },
                {
                  "contributionScore": 0.008068144477478554,
                  "variable": "cpu"
                },
                {
                  "contributionScore": 0.008222036467507165,
                  "variable": "data_in_speed"
                },
                {
                  "contributionScore": 0.008674941549594993,
                  "variable": "ad_input"
                },
                {
                  "contributionScore": 0.02232242629793674,
                  "variable": "ad_output"
                },
                {
                  "contributionScore": 0.1583773213660846,
                  "variable": "flink_last_ckpt_duration"
                },
                {
                  "contributionScore": 0.9816531517495176,
                  "variable": "data_out_speed"
                }
              ],
              "isAnomaly": true,
              "severity": 0.42135109874230336,
              "score": 1.213510987423033
            }
          },
          // more results
        ]
      }

応答には、結果の状態、変数情報、推論パラメーター、推論結果が含まれます。

  • variableStates は、推論の要求内にある各変数の情報のリストを示します。
  • setupInfo は、この推論のために送信された要求本文です。
  • results には検出結果が含まれています。 検出結果には、典型的なものが 3 種類あります。
    1. エラー コード InsufficientHistoricalData。 これは通常、最初のいくつかのタイムスタンプでのみ発生します。モデルによるデータの推論はウィンドウ ベースの方法であり、判断を下すためには履歴データが必要だからです。 最初のいくつかのタイムスタンプでは、履歴データが不十分なので、それらに対して推論を実行することはできません。 この場合、エラー メッセージは無視できます。
    2. "isAnomaly": false は、現在のタイムスタンプが異常でないことを示します。
      • severity は異常の相対的な重大度を示し、通常のデータの場合は常に 0 です。
      • score は、モデルによる判断でのモデルからの未加工の出力で、通常のデータ ポイントでも 0 以外になる可能性があります。
    3. "isAnomaly": true は、現在のタイムスタンプでの異常を示します。
      • severity は異常の相対的な重大度を示し、異常なデータの場合は常に 0 を超える値です。
      • score は、モデルによる判断でのモデルからの未加工の出力です。 severity は、score からの派生値です。 すべてのデータ ポイントには、score があります。
      • contributors は、各変数のコントリビューション スコアを含むリストです。 投稿スコアが高いほど、根本原因の可能性が高いことを示しています。 このリストは、異常を解釈し、根本原因を診断するためによく使用されます。

注意

よくある落とし穴は、isAnomaly=true のデータ ポイントをすべて異常とみなすことです。 その結果、擬陽性が過多となる可能性があります。 isAnomalyseverity (または score) の両方を使用して、重大ではない異常をふるいにかけ、(必要に応じて) グループ化を使用して異常の期間を確認し、ランダム ノイズを抑制する必要があります。 severityscore の違いについては、ベスト プラクティス ドキュメントの FAQ を参照してください。

次のステップ