共用方式為


使用多變量異常偵測 API 的最佳做法

重要

從 2023 年 9 月 20 日起,您將無法建立新的異常偵測器資源。 異常偵測器服務將於 2026 年 10 月 1 日淘汰。

本文會提供使用多變量異常偵測器 (MVAD) API 時,應遵循的建議做法指引。 在本教學課程中,您將會:

  • API 使用方式:瞭解如何使用 MVAD 而不會發生錯誤。
  • 資料工程:瞭解如何最大化運用您的資料,讓 MVAD 以更佳的精確度執行。
  • 常見陷阱:瞭解如何避免客戶所遭遇的常見陷阱。
  • 常見問題:取得常見問題的解答。

API 使用方式

請遵循本節中的指示,以避免在使用 MVAD 時發生錯誤。 如果您仍然收到錯誤,可參閱錯誤碼的完整清單,以取得相關說明和應採取的動作。

輸入參數

必要參數

定型和推斷 API 要求中需要下列三個參數:

  • source - 位於 Azure Blob 儲存體中,具有共用存取簽章 (SAS) 的 zip 檔案連結。
  • startTime - 用於定型或推斷的資料開始時間。 如果該時間早於資料中的實際最早時間戳記,則會使用實際最早的時間戳記作為起點。
  • endTime - 用於定型或推斷的資料結束時間,必須晚於或等於 startTime。 如果 endTime 晚於資料中的實際最新時間戳記,則會使用實際的最新時間戳記做為結束點。 如果 endTime 等於 startTime,則表示會推斷一個通常用於串流案例的單一資料點。

定型 API 的選擇性參數

定型 API 的其他參數為選擇性:

  • slidingWindow - 用來判斷異常的資料點數目。 介於 28 和 2,880 之間的整數。 預設值為 300。 如果 slidingWindow 是為模型定型的 k,則在推斷期間應該可從來源檔案存取最少 k 點,以取得有效的結果。

    MVAD 會使用資料點區段來決定下一個資料點是否為異常。 區段的長度為 slidingWindow。 選擇 slidingWindow 值時,請記住兩件事:

    1. 資料的屬性:是否為定期和取樣率。 當您的資料為定期時,您可以將 1-3 迴圈的長度設定為 slidingWindow。 當您的資料是較高頻率時 (很小的資料細微性),例如分層級或秒層級,您可以設定相對較高的 slidingWindow 值。
    2. 定型/推斷時間與潛在效能影響之間的取捨。 較大的 slidingWindow 可能會導致定型/推斷時間更長。 無法保證較大的 slidingWindow 會導致正確性提升。 較小的 slidingWindow 可能導致模型難以收斂為最佳的解決方案。 例如,當 slidingWindow 只有兩個點時,很難偵測到異常。
  • alignMode - 如何在時間戳記上對齊多個變數 (時間序列)。 此參數有 InnerOuter 兩個選項,且預設值為 Outer

    當變數的時間戳記序列之間有不一致時,此參數便十分重要。 模型需要將變數對齊相同的時間戳記順序,然後再進行進一步的處理。

    Inner 表示模型只會針對每一變數有值的時間戳記報告偵測結果,亦即所有變數的交集。 Outer 表示模型會針對任一變數有值的時間戳記報告偵測結果,亦即所有變數的聯集。

    以下範例說明不同的 alignModel 值。

    Variable-1

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

    Variable-2

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

    Inner 聯結兩個變數

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

    Outer 聯結兩個變數

    timestamp Variable-1 Variable-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

    選項 方法
    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),且只能有兩個,並應儲存在逗號分隔值 (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
    ... ...

    注意

    如果您的時間戳記有小時、分鐘及/或秒,請務必在呼叫 API 之前適當進位。

    例如,如果您的資料頻率每隔 30 秒就應是一個資料點,但您看到的時間戳記是 "12:00:01" 和 "12:00:28",則應該將時間戳記預先處理為新值 (例如 "12:00:00" 和 "12:00:30")。

    如需詳細資料,請參閱最佳做法文件中的「時間戳記進位」一節

  • 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 API 來執行程式碼,而不會發生任何錯誤。 您可以如何提升模型的精確度?

資料品質

  • 當模型從歷程記錄資料中學習正常模式時,定型資料應代表系統的整體正常狀態。 如果定型資料充滿異常,模型將很難學習這些類型的模式。 根據經驗,異常比率的閾值為 1%,低於此值表示精確度良好。
  • 一般而言,訓練資料的遺漏值比例應低於 20%。 遺漏的資料太多可能導致將自動填滿的值 (通常是線性值或常數值) 作為一般模式學習。 這可能會導致實際的 (非遺漏) 資料點被偵測為異常。

資料品質

  • MVAD 的基礎模型具有數百萬個參數。 其需要至少具有一定的資料點數目下限,才能學習最佳的參數集。 經驗法則是您必須提供每個變數 5,000 或更多資料點 (時間戳記),才能訓練模型並取得良好的精確度。 一般而言,訓練資料越多,精確度就越好。 但是,如果您無法累積太多資料,我們仍建議您使用較少的資料試驗,並查看是否仍可接受妥協後的精確度。

  • 每次呼叫推斷 API 時,您都必須確定來源資料檔包含的資料點剛好足夠。 這通常是 slidingWindow + 確實需要推斷結果的資料點數目。 例如,在資料流程處理案例中,每次您想要在一個新的時間戳記上進行推斷時,資料檔案只能包含前 slidingWindow 個加上一個資料點,然後您可以使用相同數目的資料點 (slidingWindow + 1) 來移動並建立另一個 zip 檔案,但是將一個步驟移至「右側」端,接著提交其他推斷工作。

    除此之外或前置滑動視窗「之前」的項目不會影響推斷結果,而且可能只會導致效能降級。 低於該值的任何項目都可能導致 NotEnoughInput 錯誤。

時間戳記進位

在變數群組 (時間序列) 中,每個變數都可以從獨立來源收集。 不同變數的時間戳記可能會彼此不一致,且具有已知的頻率。 以下是簡單的範例。

Variable-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 秒傳送一個資料點。 不過,感應器不會以嚴格的平均頻率傳送資料點,有時也會在稍早或稍後進行。 因為 MVAD 會將不同變數之間的關聯納入考慮,所以時間戳記必須適當對齊,才能讓計量正確地反映系統狀況。 在上述範例中,變數 1 和變數 2 的時間戳記,必須適當「進位」到其在對齊之前的頻率。

讓我們看看未預先處理的情況。 如果將 alignMode 設定為 Outer (這表示兩個集合的聯集),則合併的資料表會是:

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 秒時間戳記),而新的時間序列是:

Variable-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 有一些限制,您應注意這些限制以避免錯誤。

一般限制

  • 滑動視窗:28-2880 時間戳記,預設值為 300。 針對定期資料,請設定 2-4 週期長度作為滑動視窗。
  • 變數數目:針對定型和批次推斷,最多 301 個變數。

定型限制

  • 時間戳記:最多 1000000 個。 時間戳記太少可能會降低模型品質。 建議有超過 5,000 個時間戳記。
  • 細微性:最小細微性為 per_second

批次推斷限制

  • 時間戳記:最多 20000 個,至少 1 個滑動視窗長度。

串流推斷限制

  • 時間戳記:最多 2880 個,至少 1 個滑動視窗長度。
  • 偵測時間戳記:從 1 到 10。

模型品質

如何處理實際案例中的誤判為真和誤判為否?

我們已提供嚴重性,可指出異常的重要性。 透過設定嚴重性的閾值來篩選誤判為真。 當推斷資料中發生模式轉移時,可能會顯示過多誤判為真。 在這種情況下,模型可能必須以新的資料重新定型。 如果定型資料包含太多異常,偵測結果中可能會有誤判為否。 這是因為會透過定型資料學習模式,而異常可能會對模型產生偏差。 因此,適當的資料清除可能有助於降低誤判為否。

如何根據定型遺失和驗證遺失來預估最適合使用的模型?

一般而言,如果沒有標記的資料集,不容易判斷哪一個模型最適合。 不過,我們可以利用定型和驗證遺失來粗略預估並捨棄不良模型。 首先,我們必須觀察定型遺失是否交集。 發散的遺失通常指出模型品質不良。 其次,遺失值可能有助於識別是否發生學習不足或過度學習。 屬於學習不足或過度學習的模型可能沒有所需的效能。 再次,即使遺失函數的定義不會直接反映偵測效能,遺失值可能會是預估模型品質的輔助工具。 低遺失值是良好模型的必要條件,因此我們可能會捨棄有高遺失值的模型。

常見陷阱

除了錯誤碼資料表以外,我們也從和您一樣的客戶學習到在使用 MVAD API 時,常見的一般陷阱。 此表格可協助您避免這些問題。

陷阱 結果 說明與解決方案
定型資料及/或推斷資料中的時間戳記不會四捨五入,以配合每個變數的個別資料頻率。 推斷結果的時間戳記不如預期:時間戳記太少或太多。 請參閱時間戳記進位
訓練資料中有太多異常資料點 模型精確度會受到負面影響,因為其會在定型期間將異常資料點視為正常模式。 根據經驗,若將異常率保持在 1% 以下,將會有所幫助。
訓練資料過少 模型精確度有所妥協。 根據經驗,訓練 MVAD 模型需要每個變數 15,000 個或更多資料點 (時間戳記),才能保持良好的精確度。
isAnomaly=true 作為異常接受所有資料點 過多誤報 您應該同時使用 isAnomalyseverity (或 score),以找出不嚴重的異常狀況,並 (選擇性地) 使用群組來檢查異常的持續時間,以抑制隨機雜訊。 請參閱下面的常見問題一節,以瞭解 severityscore 之間的差異。
子資料夾會壓縮到資料檔案中,以進行訓練或推斷。 子資料夾內的 csv 資料檔案會在訓練和/或推斷期間遭到忽略。 Zip 檔案中不允許任何子資料夾。 請參閱資料夾結構以取得詳細資料。
推斷資料檔中的資料太多:例如,將推斷資料 zip 檔案中的所有歷程記錄資料壓縮 您可能不會看到任何錯誤,但當您嘗試將 zip 檔案上傳至 Azure Blob 並嘗試執行推斷時,將會遇到效能降低的情況。 如需詳細資料,請參閱資料數量
在不支援 MVAD 的 Azure 區域上建立異常偵測器資源,並呼叫 MVAD API 呼叫 MVAD API 時,您會收到「找不到資源」錯誤。 在預覽階段,MVAD 僅適用于有限的區域。 請將異常偵測器的新功能加入書簽,以掌握最新的 MVAD 區域推出。 您也可以提出 GitHub 問題,或在 AnomalyDetector@microsoft.com 與我們聯絡,以要求特定區域。

常見問題集

MVAD 滑動視窗的運作方式為何?

讓我們使用兩個範例來瞭解 MVAD 的滑動視窗如何運作。 假設您已設定 slidingWindow = 1,440,而您的輸入資料是以一分鐘為單位的資料細微性。

  • 串流案例:您想要預測 "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:00Z2021-01-01T23:59:00Z (內含) 的資料,來判斷位於 2021-01-02T00:00:00Z 的資料是否異常。 然後,MVAD 會向前移動,並使用從 2021-01-01T00:01:00Z2021-01-02T00:00:00Z (內含) 的資料,來判斷位於 2021-01-02T00:01:00Z 的資料是否異常。 其會以相同的方式進行移動 (採用 1,440 資料點來比較) 直到 endTime 所指定的最後時間戳記 (或實際的最新時間戳記) 為止。 因此,您的推斷資料來源必須包含從 startTime - slidingWindow 開始的資料,且最好包含總大小 slidingWindow + (endTime - startTime) 的資料。

severityscore 有何差異?

一般來說,我們建議您使用 severity 作為篩選條件,以篩選出對您業務而言不重要的「異常」。 根據您的案例和資料模式,此類異常通常會有相對較低的 severity 值或獨立 (不連續) 高 severity 值,例如隨機尖峰。

如果您發現對 severity 或持續高 severity 值的持續時間,需要比閾值更複雜的規則,可能會想要使用 score 來建立更強大的篩選準則。 瞭解 MVAD 如何使用 score 來判斷異常狀況,可能會有所幫助:

我們從全域和區域的觀點來考量資料點是否異常。 如果時間戳記的 score 高於特定閾值,則系統會將時間戳記標示為異常。 如果 score 低於閾值,但在區段中相對較高,則系統也會將其標示為異常。

下一步