使用多變量異常偵測 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-3 迴圈的長度設定為
slidingWindow
。 當您的資料是較高頻率時 (很小的資料細微性),例如分層級或秒層級,您可以設定相對較高的slidingWindow
值。 - 定型/推斷時間與潛在效能影響之間的取捨。 較大的
slidingWindow
可能會導致定型/推斷時間更長。 無法保證較大的slidingWindow
會導致正確性提升。 較小的slidingWindow
可能導致模型難以收斂為最佳的解決方案。 例如,當slidingWindow
只有兩個點時,很難偵測到異常。
- 資料的屬性:是否為定期和取樣率。 當您的資料為定期時,您可以將 1-3 迴圈的長度設定為
alignMode
- 如何在時間戳記上對齊多個變數 (時間序列)。 此參數有Inner
和Outer
兩個選項,且預設值為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
。 合併的資料表中可能有遺漏的值,而且應該妥善處理。 我們提供數種方式來填滿這些值。 選項包括Linear
、Previous
、Subsequent
、Zero
和Fixed
,預設值為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
- 填補值是當fillNAMethod
為Fixed
時,用來填滿nan
的值,而且必須在該情況下提供。 在其他情況下則是選擇性。displayName
- 這是用來識別模型的選擇性參數。 例如,您可以使用其標記參數、資料來源,以及有關模型和其輸入資料的任何其他中繼資料。 預設值為空字串。
輸入資料結構描述
MVAD 會偵測計量群組的異常狀況,並將每個計量稱為變數或時間序列。
您可以從 Microsoft 下載範例資料檔案,以查看接受的結構描述:https://aka.ms/AnomalyDetector/MVADSampleData
每個變數都必須有兩個欄位 (
timestamp
和value
),且只能有兩個,並應儲存在逗號分隔值 (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 注意
如果您的時間戳記有小時、分鐘及/或秒,請務必在呼叫 API 之前適當進位。
例如,如果您的資料頻率每隔 30 秒就應是一個資料點,但您看到的時間戳記是 "12:00:01" 和 "12:00:28",則應該將時間戳記預先處理為新值 (例如 "12:00:00" 和 "12:00:30")。
如需詳細資料,請參閱最佳做法文件中的「時間戳記進位」一節。
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
資料工程
現在您可以使用 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 作為異常接受所有資料點 |
過多誤報 | 您應該同時使用 isAnomaly 和 severity (或 score ),以找出不嚴重的異常狀況,並 (選擇性地) 使用群組來檢查異常的持續時間,以抑制隨機雜訊。 請參閱下面的常見問題一節,以瞭解 severity 和 score 之間的差異。 |
子資料夾會壓縮到資料檔案中,以進行訓練或推斷。 | 子資料夾內的 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" 的一個資料點是否為異常。
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
的資料是否異常。 然後,MVAD 會向前移動,並使用從2021-01-01T00:01:00Z
到2021-01-02T00:00:00Z
(內含) 的資料,來判斷位於2021-01-02T00:01:00Z
的資料是否異常。 其會以相同的方式進行移動 (採用 1,440 資料點來比較) 直到endTime
所指定的最後時間戳記 (或實際的最新時間戳記) 為止。 因此,您的推斷資料來源必須包含從startTime
-slidingWindow
開始的資料,且最好包含總大小slidingWindow
+ (endTime
-startTime
) 的資料。
severity
與 score
有何差異?
一般來說,我們建議您使用 severity
作為篩選條件,以篩選出對您業務而言不重要的「異常」。 根據您的案例和資料模式,此類異常通常會有相對較低的 severity
值或獨立 (不連續) 高 severity
值,例如隨機尖峰。
如果您發現對 severity
或持續高 severity
值的持續時間,需要比閾值更複雜的規則,可能會想要使用 score
來建立更強大的篩選準則。 瞭解 MVAD 如何使用 score
來判斷異常狀況,可能會有所幫助:
我們從全域和區域的觀點來考量資料點是否異常。 如果時間戳記的 score
高於特定閾值,則系統會將時間戳記標示為異常。 如果 score
低於閾值,但在區段中相對較高,則系統也會將其標示為異常。