Tutorial: Pelajari Deteksi Anomali Multivariat dalam satu jam

Anomaly Detector with Multivariate Anomaly Detection (MVAD) adalah alat AI canggih untuk mendeteksi anomali dari sekelompok metrik tanpa diawasi.

Secara umum, Anda dapat mengambil langkah-langkah ini untuk menggunakan MVAD:

  1. Membuat sumber daya Anomaly Detector yang mendukung MVAD di Azure.
  2. Siapkan data Anda.
  3. Latih model MVAD.
  4. Tanyakan status model Anda.
  5. Deteksi anomali dengan model MVAD terlatih.
  6. Ambil dan interpretasi hasil inferensi.

Dalam tutorial ini, Anda akan:

  • Pahami cara menyiapkan data Anda dalam format yang benar.
  • Pahami cara melatih dan menyimpulkan dengan MVAD.
  • Pahami parameter input dan cara menginterpretasi output dalam hasil inferensi.

1. Buat sumber daya Anomaly Detector yang mendukung MVAD

Catatan

Selama tahap pratinjau, MVAD hanya tersedia di wilayah terbatas. Silakan tandai Apa yang baru dalam Anomaly Detector untuk tetap mengikuti perkembangan peluncuran wilayah MVAD. Anda juga dapat mengajukan GitHub atau menghubungi kami di AnomalyDetector@microsoft.com untuk meminta wilayah tertentu.

2. Penyiapan data

Maka Anda perlu menyiapkan data pelatihan Anda (dan data inferensi).

Input skema data

MVAD mendeteksi anomali dari sekelompok metrik, dan kami menyebut setiap metrik sebagai variabel atau deret waktu.

  • Anda dapat mengunduh sampel file data dari Microsoft untuk memeriksa skema yang diterima dari: https://aka.ms/AnomalyDetector/MVADSampleData

  • Setiap variabel harus memiliki dua dan hanya dua bidang, timestamp dan value, dan harus disimpan dalam file nilai yang dipisahkan koma (CSV).

  • Nama kolom file CSV harus tepat timestamp dan value peka huruf besar/kecil.

  • timestamp Nilai harus sesuai dengan ISO 8601; value bisa berupa bilangan bulat atau desimal dengan sejumlah angka di belakang koma. Contoh yang baik dari isi file CSV:

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

    Catatan

    Jika tanda waktu Anda memiliki jam, menit, dan/atau detik, pastikan tanda waktu dibulatkan dengan benar sebelum memanggil API.

    Misalnya, jika frekuensi data Anda seharusnya menjadi satu poin data setiap 30 detik, tetapi Anda melihat tanda waktu seperti "12:00:01" dan "12:00:28", itu adalah sinyal kuat bahwa Anda harus memproses tanda waktu terlebih dahulu ke nilai baru seperti "12:00:00" dan "12:00:30".

    Untuk detailnya, lihat bagian "Ringkasan tanda waktu" di dokumen praktik terbaik.

  • Nama file csv akan digunakan sebagai nama variabel dan harus unik. Misalnya, "temperature.csv" dan "humidity.csv".

  • Variabel untuk pelatihan dan variabel untuk inferensi harus konsisten. Misalnya, jika Anda menggunakan series_1, series_2, series_3, series_4, dan series_5 untuk pelatihan, Anda harus menyediakan variabel yang sama persis untuk inferensi.

  • File CSV harus dikompresi ke dalam file zip dan diunggah ke kontainer blob Azure. File zip dapat bernama apa pun yang Anda inginkan.

Struktur folder

Kesalahan umum dalam persiapan data adalah folder tambahan dalam file zip. Misalnya, asumsikan nama file zip adalah series.zip. Kemudian setelah mendekompresi file ke folder baru./series, jalur yang benar ke file CSV adalah ./series/series_1.csv dan jalur yang salah bisa jadi ./series/foo/bar/series_1.csv.

Contoh pohon direktori yang benar setelah mendekompresi file zip di Windows

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

Contoh pohon direktori yang tidak benar setelah mendekompresi file zip di Windows

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

Alat untuk zipping dan mengunggah data

Di bagian ini, kami membagikan beberapa contoh kode dan alat yang dapat Anda salin dan edit untuk ditambahkan ke logika aplikasi Anda sendiri yang berkaitan dengan data input MVAD.

Mengompres file CSV dalam *nix

zip -j series.zip series/*.csv

Mengompres file CSV dalam Windows

  • Navigasi ke folder dengan semua file CSV.
  • Pilih semua file CSV yang Anda butuhkan.
  • Klik kanan pada salah satu file CSV dan pilih Send to.
  • Pilih Compressed (zipped) folder dari menu turun bawah.
  • Ganti nama file zip sesuai kebutuhan.

Zipping kode python & mengunggah data ke Azure Blob Storage

Anda dapat merujuk ke dokumen ini untuk mempelajari cara mengunggah file ke Azure Blob.

Atau, Anda dapat merujuk ke contoh kode di bawah ini yang dapat melakukan zipping dan mengunggah untuk Anda. Anda dapat menyalin dan menyimpan kode Python di bagian ini sebagai file .py (misalnya, zipAndUpload.py) dan menjalankannya menggunakan baris perintah seperti ini:

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

    Perintah ini akan mengompres semua file CSV di foo\bar ke dalam satu file zip bernama test123.zip. Ini akan mengunggah test123.zip ke kontainer container_xxx dalam blob Anda.

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

    Perintah ini akan melakukan hal yang sama seperti di atas, tetapi akan menghapus file zip test123.zip setelah berhasil diunggah.

Argumen:

  • --source-folder, -s, jalur ke folder sumber yang berisi file CSV
  • --zipfile-name, -z, nama file zip
  • --connection-string, -c, string koneksi ke blob Anda
  • --container-name, -n, nama kontainer
  • --remove-zipfile,-r, jika aktif, menghapus file 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. Melatih Model MVAD

Berikut adalah contoh isi permintaan dan kode sampel di Python untuk melatih model MVAD.

// 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))

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

Kode respons 201 menunjukkan permintaan yang berhasil.

Parameter input

Parameter yang Diperlukan

Ketiga parameter ini diperlukan dalam permintaan pelatihan dan inferensi API:

  • source - Tautan ke file zip Anda yang terletak di Azure Blob Storage dengan Tanda Tangan Akses Bersama (SAS).
  • startTime - Waktu mulai data yang digunakan untuk pelatihan atau inferensi. Jika lebih awal dari tanda waktu paling awal aktual dalam data, tanda waktu paling awal aktual tersebut akan digunakan sebagai titik awal.
  • endTime - Waktu akhir data yang digunakan untuk pelatihan atau inferensi yang harus lebih lambat dari atau sama dengan startTime. Jika endTime lebih lambat dari tanda waktu terbaru aktual dalam data, tanda waktu terbaru aktual akan digunakan sebagai titik akhir. Jika endTime sama denganstartTime, itu berarti inferensi dari satu titik data tunggal yang sering digunakan dalam skenario streaming.

Parameter opsional untuk pelatihan API

Parameter lain untuk pelatihan API bersifat opsional:

  • slidingWindow - Berapa banyak titik data yang digunakan untuk menentukan anomali. Bilangan bulat antara 28 dan 2.880. Nilai default-nya adalah 300. Jika slidingWindow adalah k untuk pelatihan model, setidaknya k poin harus dapat diakses dari file sumber selama inferensi untuk mendapatkan hasil yang valid.

    MVAD mengambil segmen titik data untuk memutuskan apakah titik data selanjutnya adalah anomali. Panjang segmen adalah slidingWindow. Harap ingat dua hal saat memilih nilai slidingWindow:

    1. Properti data Anda: apakah itu berkala dan laju pengambilan sampel. Ketika data Anda berkala, Anda dapat mengatur panjang 1 - 3 siklus sebagai slidingWindow. Ketika data Anda berada pada frekuensi tinggi (granularitas kecil) seperti tingkat menit atau tingkat kedua, Anda dapat menetapkan nilai yang relatif lebih tinggi dari slidingWindow.
    2. Trade-off antara waktu pelatihan/inferensi dan dampak performa potensial. slidingWindow yang lebih besar dapat menyebabkan waktu pelatihan/inferensi yang lebih lama. Tidak ada jaminan slidingWindow yang lebih besar akan menghasilkan peningkatan akurasi. slidingWindow yang kecil dapat menyebabkan model sulit untuk bertemu dengan solusi yang optimal. Misalnya, sulit untuk mendeteksi anomali ketika hanya slidingWindow yang memiliki dua poin.
  • alignMode - Cara menyelaraskan beberapa variabel (seri waktu) pada tanda waktu. Ada dua opsi untuk parameter ini, Inner dan Outer, nilai default-nya adalah Outer.

    Parameter ini sangat penting ketika ada ketidakselarasan antara urutan tanda waktu dari variabel tersebut. Model perlu menyelaraskan variabel ke urutan tanda waktu yang sama sebelum pemrosesan lebih lanjut.

    Inner berarti model akan melaporkan hasil deteksi hanya pada tanda waktu ketika setiap variabel memiliki nilai, yaitu persimpangan semua variabel. Outer berarti model akan melaporkan hasil deteksi hanya pada tanda waktu ketika variabel apa pun memiliki nilai, yaitu persimpangan semua variabel.

    Berikut adalah contoh untuk menjelaskan nilai alignModel yang berbeda.

    Variabel-1

    timestamp nilai
    2020-11-01 1
    2020-11-02 2
    20201104 4
    2020-11-05 5

    Variabel-2

    timestamp nilai
    2020-11-01 1
    2020-11-02 2
    2020-11-03 3
    20201104 4

    Inner menggabungkan dua variabel

    timestamp Variabel-1 Variabel-2
    2020-11-01 1 1
    2020-11-02 2 2
    20201104 4 4

    Outer menggabungkan dua variabel

    timestamp Variabel-1 Variabel-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-03 nan 3
    20201104 4 4
    2020-11-05 5 nan
  • fillNAMethod - Cara mengisi nan di tabel yang digabungkan. Mungkin ada nilai yang hilang dalam tabel yang digabungkan dan nilai tersebut harus ditangani dengan benar. Kami menyediakan beberapa metode untuk mengisinya. Pilihannya adalah Linear, Previous, Subsequent, Zero, dan Fixed serta nilai default adalah Linear.

    Opsi Metode
    Linear Mengisi nilai nan menurut interpolasi linear
    Previous Menyebarkan nilai terakhir yang valid untuk mengisi kesenjangan. Contoh: [1, 2, nan, 3, nan, 4] -> [1, 2, 2, 3, 3, 4]
    Subsequent Gunakan nilai valid berikutnya untuk mengisi kesenjangan. Contoh: [1, 2, nan, 3, nan, 4] -> [1, 2, 3, 3, 4, 4]
    Zero Mengisi nilai nan dengan 0.
    Fixed Isi nilai nan dengan nilai valid tertentu yang harus disediakan dalam paddingValue.
  • paddingValue - Nilai padding digunakan untuk mengisi nan ketika fillNAMethod da nFixed harus disediakan dalam kasus tersebut. Dalam kasus lain, ini bersifat opsional.

  • displayName - Ini adalah parameter opsional yang digunakan untuk mengidentifikasi model. Misalnya, Anda dapat menggunakannya untuk menandai parameter, sumber data, dan metadata lainnya tentang model dan data inputnya. Nilai default-nya adalah untaian kosong.

4. Mendapatkan status model

Karena API pelatihan tidak sinkron, Anda tidak akan mendapatkan model segera setelah memanggil API pelatihan. Namun, Anda dapat meminta status model baik dengan kunci API, yang akan mencantumkan semua model, atau dengan ID model, yang akan mencantumkan informasi tentang model tertentu.

Daftar semua model

Anda dapat merujuk ke halaman ini untuk informasi tentang URL permintaan dan header permintaan. Perhatikan bahwa kami hanya mengembalikan 10 model yang dipesan berdasarkan waktu pembaruan, tetapi Anda dapat mengunjungi model lain dengan mengatur parameter $skip dan $top dalam URL permintaan. Misalnya, jika URL permintaan Anda https://{endpoint}/anomalydetector/v1.1-preview/multivariate/models?$skip=10&$top=20, kami akan melewati 10 model terbaru dan mengembalikan 20 model berikutnya.

Respons sampel adalah

{
    "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>"
}

Tanggapannya berisi 4 bidang, models, currentCount, maxCount, dan nextLink.

  • models berisi waktu yang dibuat, waktu terakhir diperbarui, ID model, nama tampilan, jumlah variabel, dan status setiap model.
  • currentCount berisi jumlah model multivariat terlatih.
  • maxCount adalah jumlah maksimum model yang didukung oleh sumber daya Anomaly Detector ini.
  • nextLink dapat digunakan untuk mengambil lebih banyak model.

Dapatkan model menurut ID model

Halaman ini menjelaskan URL permintaan untuk mengkueri informasi model berdasarkan ID model. Respons sampel terlihat seperti ini

{
        "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
            ]
          }
        }
      }

Anda akan menerima informasi lebih rinci tentang model yang diminta. Respons berisi informasi meta tentang model, parameter pelatihan, dan informasi diagnostiknya. Informasi Diagnostik berguna untuk men-debug dan melacak kemajuan pelatihan.

  • epochIds menunjukkan jumlah masa yang dilatih model dari total 100 masa. Misalnya, jika model masih dalam status pelatihan, epochId mungkin [10, 20, 30, 40, 50] yang berarti telah menyelesaikan masa pelatihan ke-50, dan ada setengah jalan lagi.
  • trainLosses dan validationLosses digunakan untuk memeriksa apakah progres pengoptimalan menyatu dalam hal ini kedua kerugian harus berkurang secara bertahap.
  • latenciesInSeconds berisi biaya waktu untuk setiap masa dan dicatat setiap 10 masa. Dalam contoh ini, masa ke-10 membutuhkan waktu sekitar 0,34 detik. Ini akan sangat membantu untuk memperkirakan waktu penyelesaian pelatihan.
  • variableStates meringkas informasi tentang setiap variabel. Ini adalah daftar yang diberi peringkat filledNARatio menurut urutan menurun. Ini menjelaskan jumlah titik data yang digunakan untuk setiap variabel dan filledNARatio menjelaskan jumlah titik yang hilang. Kita biasanya perlu mengurangi filledNARatio sebanyak mungkin. Terlalu banyak titik data yang hilang akan menurunkan akurasi model.
  • Kesalahan selama pemrosesan data akan disertakan di bidang errors.

5. Inferensi dengan MVAD

Untuk melakukan inferensi, cukup berikan sumber blob ke file zip yang berisi data inferensi, waktu mulai, dan waktu akhir.

Kesimpulan juga tidak sinkron, sehingga hasilnya tidak segera dikembalikan. Perhatikan bahwa Anda perlu menyimpan dalam variabel tautan hasil di header respons yang berisi resultId, sehingga Anda mungkin tahu di mana mendapatkan hasilnya sesudahnya.

Kegagalan biasanya disebabkan oleh masalah model atau masalah data. Anda tidak dapat melakukan inferensi jika model belum siap atau tautan data tidak valid. Pastikan bahwa data pelatihan dan data inferensi konsisten, yang berarti mereka harus menjadi variabel yang sama persis tetapi dengan cap waktu yang berbeda. Lebih variabel, kurang variabel, atau inferensi dengan serangkaian variabel yang berbeda tidak akan melewati fase verifikasi data dan kesalahan akan terjadi. Verifikasi data ditangguhkan sehingga Anda hanya akan mendapatkan pesan kesalahan saat kueri hasil.

6. Mendapatkan hasil inferensi

Anda perlu resultId untuk mendapatkan hasil. resultId diperoleh dari header respons saat Anda mengirimkan permintaan inferensi. Halaman ini berisi instruksi untuk kueri hasil inferensi.

Respons sampel terlihat seperti ini

 {
        "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
        ]
      }

Respons berisi status hasil, informasi variabel, parameter inferensi, dan hasil inferensi.

  • variableStates mencantumkan informasi setiap variabel dalam permintaan inferensi.
  • setupInfo adalah isi permintaan yang diajukan untuk inferensi ini.
  • results berisi hasil deteksi. Ada tiga jenis khas hasil deteksi.
    1. Kode Galat InsufficientHistoricalData. Ini biasanya terjadi hanya dengan beberapa stempel waktu pertama karena model menyimpulkan data dengan cara berbasis jendela dan perlu data historis untuk membuat keputusan. Untuk beberapa stempel waktu pertama, ada data historis yang tidak mencukupi, sehingga inferensi tidak dapat dilakukan. Dalam hal ini, pesan kesalahan dapat diabaikan.
    2. "isAnomaly": false menunjukkan cap waktu saat ini bukan anomali.
      • severity menunjukkan tingkat keparahan relatif anomali dan untuk data normal selalu 0.
      • score adalah output mentah dari model tempat model membuat keputusan yang bisa tidak-nol bahkan untuk titik data normal.
    3. "isAnomaly": true menunjukkan anomali pada cap waktu saat ini.
      • severity menunjukkan tingkat keparahan relatif anomali dan untuk data yang tidak normal selalu lebih besar dari 0.
      • score adalah output mentah dari model tempat model membuat keputusan. severity adalah nilai yang diturunkan dari score. Setiap titik data memiliki score.
      • contributors adalah daftar yang berisi skor kontribusi setiap variabel. Skor kontribusi yang lebih tinggi menunjukkan kemungkinan yang lebih tinggi dari akar penyebabnya. Daftar ini sering digunakan untuk menafsirkan anomali serta mendiagnosis akar penyebabnya.

Catatan

Jebakan umum adalah mengambil semua titik data dengan isAnomaly=true sebagai anomali. Itu mungkin berakhir dengan terlalu banyak positif salah. Anda harus menggunakan isAnomaly dan severity (atau score) untuk menyaring anomali yang tidak parah dan (opsional) menggunakan pengelompokan untuk memeriksa durasi anomali untuk menekan kebisingan acak. Silakan merujuk ke FAQ dalam dokumen praktik terbaik untuk perbedaan antara severity dan score.

Langkah berikutnya