本講學習重點
異常偵測特殊性:標注資料極少(真實詐欺案例佔比<1%)、異常形態多樣未知、正常/異常的邊界模糊,適合無監督或半監督方法
統計方法:Z-score(超過 3 個標準差)、IQR(落在 Q1-1.5×IQR 到 Q3+1.5×IQR 外)、馬哈拉諾比斯距離(多變量版 Z-score)
Isolation Forest:隨機切割資料空間,異常點因孤立而需要的切割次數少(路徑短),平均路徑長度越短、異常分數越高
Autoencoder:用神經網路學習「正常模式」的壓縮表示,對新資料重建;正常資料重建誤差小,異常資料重建誤差大
One-Class SVM:在特徵空間中找到包住正常資料的最小超球面,球面外的點視為異常
閾值設定:要在偽陽性(誤報,消耗人工審查成本)和偽陰性(漏報,放走真實異常)之間取捨,業務優先考量
類別不平衡問題:詐欺/異常比例極低(如 0.1%),評估指標不能用 Accuracy,要用 Precision、Recall、AUC-PR
🎙️ Podcast(中文)
一句話搞懂
異常偵測是在大量「正常」資料中,自動找出「和正常模式不符」的少數案例——不需要(也往往無法)事先標注所有的異常形態;從信用卡詐欺偵測、工廠設備故障預警、網路入侵偵測,到醫療影像的病灶識別,AI 系統通過學習「什麼是正常」,自動將不符合正常模式的資料標記為潛在異常,大幅降低了人工監控的成本和漏報率。
白話解說
為什麼異常偵測不能直接用分類模型
你可能會想:「詐欺偵測不就是一個二元分類問題嗎?標注正常交易和詐欺交易,然後用 XGBoost 訓練,不就好了?」這個想法方向是對的,但面臨三個根本性的挑戰:
第一:極端的類別不平衡。在台灣的信用卡詐欺資料中,詐欺交易佔比通常不到 0.1%。在一百萬筆交易中,大約只有 1,000 筆是詐欺。如果你訓練一個「全說正常」的「模型」,準確率高達 99.9%,但它對詐欺防護毫無用處。這是為什麼評估指標必須用 Precision(精確率)、Recall(召回率)和 AUC-PR,而不是 Accuracy。
第二:異常的形態是未知的、不斷演化的。詐欺犯每天都在設計新的詐欺手法,如果你只是訓練了一個「找出已知詐欺模式」的分類器,遇到全新的詐欺手法就會漏報。而且,你也不可能事先標注所有可能的異常形態。無監督的異常偵測方法的優勢在於:它不需要知道「異常長什麼樣子」,只需要學習「正常長什麼樣子」,凡是不符合正常模式的都視為潛在異常。
第三:標注成本極高。標注「這筆交易是詐欺還是正常」需要安全專家逐筆審查,每份標注可能需要 15-30 分鐘的調查。對於每天數百萬筆的交易量,全面標注是不現實的。
因此,異常偵測通常採用以下三種策略之一:
- 無監督(Unsupervised):完全不用標注資料,純粹從資料分佈中找出離群點。Isolation Forest、Autoencoder 都屬於此類。
- 半監督(Semi-supervised):只標注正常資料,把學習到的「正常邊界」之外視為異常。One-Class SVM 屬於此類。
- 弱監督(Weakly Supervised):有少量不完整或不確定的標注,配合業務規則使用。
統計方法:Z-score 和 IQR
最簡單的異常偵測是統計方法,直觀易懂,適合快速的基線分析。
| Z-score(標準分數):把每個資料點轉換為「它距離平均值幾個標準差」的分數。如果 Z = (x - μ) / σ,通常以 | Z | > 3 作為判斷為異常的閾值(正態分佈中,3 個標準差外的資料約佔 0.3%)。 |
例如,監控伺服器的 CPU 使用率,假設歷史均值 45%、標準差 10%。某一刻 CPU 使用率突然跳到 92%,Z = (92 - 45) / 10 = 4.7,超過閾值 3,觸發異常告警。
IQR(四分位距)法:計算第 25 百分位數(Q1)和第 75 百分位數(Q3),IQR = Q3 - Q1。落在 [Q1 - 1.5 × IQR, Q3 + 1.5 × IQR] 範圍外的資料點視為異常。IQR 法的優勢是對離群值本身不敏感(因為計算 IQR 不涉及平均值,而平均值容易被極端值拉偏),比 Z-score 更穩健。
馬哈拉諾比斯距離(Mahalanobis Distance):Z-score 的多變量版本。在多個特徵同時存在的情況下,馬哈拉諾比斯距離考慮了特徵之間的相關性——例如,一個用戶「凌晨 3 點在國外刷卡 10 萬元」,單看「凌晨 3 點」或「國外消費」都可能正常,但兩者同時出現加上高金額,組合起來才顯得異常。
統計方法的限制:
- Z-score 假設資料符合正態分佈,對高度偏斜的分佈(如交易金額)效果差。
- 這些方法本質上只適合低維度資料,對高維度(數百個特徵)的資料,「維度詛咒」讓距離計算失去意義。
- 無法學習複雜的非線性正常模式(如用戶的整體行為模式)。
Isolation Forest:用隨機切割找孤立點
Isolation Forest(孤立森林)是 2008 年提出的機器學習算法,至今仍是業界使用最廣泛的表格資料異常偵測方法之一,它的核心直觀非常優美:異常點容易被孤立,正常點難以被孤立。
想像你在一個散點圖中隨機畫直線來切割空間,把資料點逐一隔離。密密麻麻聚在一起的正常點,需要很多次切割才能把它們各自孤立(因為它們周圍有很多鄰居);而孤立地存在於資料邊緣的異常點,只需要幾次切割就能被隔離出來(因為周圍沒有鄰居)。
算法步驟:
- 建立多棵「隔離樹(Isolation Tree)」:每棵樹隨機選擇一個特徵、隨機選擇一個切割點,把資料空間遞迴地二分,直到每個資料點都被完全隔離。
- 計算每個資料點在所有樹中的「平均路徑長度」:平均路徑長度越短,說明這個點越容易被孤立,異常分數越高。
- 根據異常分數排名,設定閾值(如最高 5% 的異常分數)來識別異常。
Isolation Forest 的優勢:
- 時間複雜度低:訓練速度快,適合大規模資料集。
- 無需假設分佈:不像 Z-score 假設正態分佈。
- 適合高維度:對多特徵的表格資料效果好。
- 超參數少:主要只有
n_estimators(樹的數量)和contamination(預期異常比例)。
from sklearn.ensemble import IsolationForest
import numpy as np
# 假設 X 是特徵矩陣(正常資料 + 少量異常資料混合)
X = ...
# contamination 是預期的異常比例,例如 0.01 = 預期 1% 的資料是異常
model = IsolationForest(n_estimators=100, contamination=0.01, random_state=42)
model.fit(X)
# 預測:-1 = 異常,1 = 正常
predictions = model.predict(X)
anomaly_scores = model.score_samples(X) # 分數越負,異常可能性越高
Autoencoder:用神經網路學習「正常的樣貌」
Autoencoder(自動編碼器)是一種神經網路架構,它的訓練目標是「輸入什麼就輸出什麼」——把輸入資料壓縮成低維度的隱藏表示(Encoding),再從隱藏表示還原回原始維度(Decoding)。
聽起來很像在做無意義的複製,但關鍵在於中間的壓縮瓶頸:網路必須把輸入資料的本質結構壓縮進比原始維度更小的隱藏空間,然後再重建。訓練過程迫使網路學習資料中最重要的模式(正常的特徵組合),而不是簡單地記憶每個輸入。
異常偵測的原理:
- 只用正常資料訓練 Autoencoder:網路學會了「正常資料長什麼樣子」的壓縮表示。
- 計算測試資料的重建誤差(Reconstruction Error):對一個輸入,計算「Autoencoder 輸出」和「原始輸入」之間的差異(如 MSE)。
- 設定閾值:正常資料因為符合模型學到的模式,重建誤差很小;異常資料的模式不在訓練集中,網路不知道如何良好重建,重建誤差很大。重建誤差超過閾值的資料點被標記為異常。
Autoencoder 特別適合以下場景:
- 高維度非結構化資料:影像(醫療影像的病灶、工廠零件的瑕疵)、音訊(設備的異常噪音)。
- 複雜的非線性正常模式:用戶的行為序列(正常用戶的點擊和瀏覽路徑有複雜的規律,異常帳號的行為序列會有根本性的不同)。
- 多變量時間序列異常:把一段時間窗口的多個感測器讀數輸入 Autoencoder,學習感測器之間的正常相關性,任何一個感測器偏離正常相關模式就會被偵測到。
閾值設定:異常偵測中最難的問題
無論選擇哪種算法,最終都需要設定一個閾值,決定「異常分數高到多少才視為異常」。閾值設定涉及業務的核心取捨:
偽陽性(False Positive,誤報):正常的被標記為異常。對詐欺偵測來說,正常的交易被攔截會讓用戶不滿和信任受損;對工廠設備告警來說,過多的誤報讓維修人員疲於奔命,最終「告警疲勞」讓他們忽視真實告警。
偽陰性(False Negative,漏報):真實的異常被遺漏。信用卡詐欺漏報直接導致財務損失;工廠設備故障漏報可能導致生產停線甚至安全事故。
Precision-Recall 曲線:透過在不同閾值下計算 Precision 和 Recall,畫出 PR 曲線,根據業務需求(更看重「不誤報」還是「不漏報」)選擇最合適的操作點。
在實際業務中,閾值往往不是純數據問題,而是業務策略問題:一個詐欺偵測系統的閾值設定,本質上是「我們願意用多少的用戶體驗摩擦(誤攔截正常交易)來換取多少的詐欺損失減少」的商業決策。
應用場景
| 場景 | 資料類型 | 適用方法 | 判斷機制 |
|---|---|---|---|
| 信用卡詐欺偵測 | 交易特徵表格(金額、地點、時間、商家) | Isolation Forest、XGBoost(半監督) | 異常分數 + 業務規則 |
| 工廠設備預測維護 | IoT 感測器時間序列(溫度、振動、電流) | Autoencoder(多變量時間序列)、統計控制圖 | 重建誤差超過閾值觸發告警 |
| 網路入侵偵測 | 網路封包特徵(流量大小、連接頻率、協議) | Isolation Forest、One-Class SVM | 結合 SIEM 系統的規則引擎 |
| 醫療影像瑕疵偵測 | CT/X-ray 影像 | 卷積 Autoencoder | 重建誤差熱圖定位異常區域 |
| 金融市場風險監控 | 多資產價格時間序列 | LSTM Autoencoder | 突然的相關性結構改變 |
| 電商假評論偵測 | 評論文字 + 行為特徵 | 文字 Autoencoder + Isolation Forest | 語言模式異常 + 行為模式異常 |
| 電力網格異常用電 | 每日電表讀數時間序列 | STL 分解後的統計方法 | 分解後的殘差項超過正常範圍 |
常見誤區
誤區 1:「異常偵測算法找到的『異常』就是真實的問題,可以直接採取行動」
這是生產環境中的高危認知。異常偵測算法標記的「異常」只是「和訓練時期的正常資料模式不符」,但「不符合正常模式」有很多種可能的解釋,並非所有都是真正的問題:
業務變化導致的「正常異常」:一個信用卡交易異常偵測系統在疫情前訓練,疫情後用戶大量轉移到線上購物,海外刷卡大幅減少,境內線上消費暴增。如果沒有更新模型,系統會把大量完全正常的線上交易標記為異常(因為模式和訓練時不同),製造大量誤報。「異常」反映的是業務模式的改變,而非真實詐欺。
資料品質問題產生的「假異常」:感測器故障、數據傳輸錯誤、系統更新後的格式變化,都可能產生看起來「異常」的資料點,但根本原因是資料管道的問題,而非被監控的系統本身出了問題。直接把這些「異常」當真處理,只會浪費維修人力和資源。
正確的做法:異常偵測算法應該作為「第一道篩選」,把需要關注的案例從百萬分之一的比例縮小到千分之一或萬分之一,然後仍然需要人工(或後續的更精細的自動化系統)來驗證這些「候選異常」是否是真實問題。在詐欺偵測中,通常先用 Isolation Forest 快速篩選出高風險交易(佔比 1-2%),再用更精細的規則引擎或人工審查來確認;在設備監控中,觸發告警後由工程師到現場確認,而非直接停機。
誤區 2:「我有 1,000 個詐欺案例,訓練一個分類模型比無監督異常偵測更好」
這個說法部分正確,但忽略了一個根本性的問題:已知的詐欺案例只代表你已經觀察到的詐欺手法,無法代表未來的新型詐欺。
在 2020 年之前,「掃碼詐欺(用假二維碼替換真二維碼)」幾乎不存在,任何在 2020 年前訓練的分類模型都不可能識別這種新型詐欺。但一個無監督的異常偵測模型,因為掃碼詐欺的金額模式、時間模式、商家類型都和正常消費模式不符,有機會捕捉到這種新型詐欺的早期案例。
實際上,業界最佳實踐往往是混合策略:
- 規則引擎:基於已知的高置信度詐欺規則(如「異地 10 分鐘內兩筆交易」),即時攔截明顯詐欺。
- 監督學習(有標注的歷史詐欺資料):高精確率地識別已知模式的詐欺。
- 無監督異常偵測:Isolation Forest 或 Autoencoder 作為「未知異常探測器」,發現新型詐欺手法的早期訊號。
這三層系統互補,缺一不可。純粹依賴監督學習會對新型詐欺束手無策;純粹依賴無監督異常偵測則無法達到足夠的 Precision(太多誤報)。
誤區 3:「Autoencoder 重建誤差越低說明模型越好,應該盡量降低重建誤差」
這個誤解會讓你的 Autoencoder 完全失去異常偵測能力,核心問題是過擬合(Overfitting):
如果 Autoencoder 的網路架構太深太寬(容量太大),或者訓練時間太長,網路可能學會了幾乎完美地記憶所有訓練資料,包括訓練資料中的異常值(即使訓練資料中只有少量異常,模型容量夠大的情況下也可能把它們「記住」)。這時候,重建誤差對所有資料(包括真正的異常)都很低,喪失了區分正常和異常的能力。
另一個情況是 Autoencoder 容量過大,學會了把輸入幾乎原封不動地複製到輸出(通過增加隱藏層的維度,讓「壓縮」形同虛設),這樣什麼資料都能被低誤差地重建,異常偵測失效。
正確的方法:
- 設定適當的瓶頸(Bottleneck)大小:隱藏表示的維度應遠小於輸入維度(如輸入 100 維,隱藏層 10-20 維),強迫模型學習真正的壓縮表示,而非走捷徑。
- 提前停止訓練(Early Stopping):在驗證集的重建誤差停止下降時停止訓練,避免過擬合。
- 在驗證集上評估異常偵測能力(而非重建誤差):如果有少量已知的異常樣本,在驗證集上同時計算已知正常和已知異常的重建誤差分佈,確保兩者之間有足夠的分離。
小練習
練習 1:選擇合適的異常偵測方法
以下四個業務場景各需要一個異常偵測系統,請為每個場景推薦最合適的方法,並說明理由:
-
電商退貨異常偵測:每天有 50 萬筆退貨申請,想找出「可能是詐騙性退貨」(如同一地址大量退貨後的轉售、偽造損壞理由)。有 500 筆歷史確認詐騙退貨的標注資料。
-
半導體晶圓品質檢測:生產線末端對每片晶圓拍一張顯微影像(512×512 像素),想偵測晶圓表面的細微瑕疵(刮痕、粉塵污染等)。瑕疵形態多樣,無法事先枚舉所有類型。
-
醫院 ICU 病患生命徵象監控:同時監控 50 位 ICU 病患的 8 個生命徵象指標(心跳、血壓、血氧等),每秒更新一次,需要在 30 秒內發出告警。絕大多數時候所有指標都在正常範圍,偶爾某個病患的指標組合會出現預示危機的異常模式。
-
雲端服務日誌異常偵測:每分鐘產生 1000 萬條系統日誌(文字格式,如
"ERROR: connection timeout to database after 30s"),想偵測前所未見的新型錯誤模式。
練習 2:設計信用卡詐欺偵測評估
一個信用卡詐欺偵測系統在測試集上的結果如下:
- 測試集:100,000 筆交易,其中 200 筆是真實詐欺(詐欺率 0.2%)
- 模型預測為詐欺:500 筆
- 其中正確預測為詐欺(True Positive):150 筆
- 錯誤預測為詐欺(False Positive):350 筆
- 未被偵測到的詐欺(False Negative):50 筆
- 計算模型的 Accuracy、Precision、Recall(召回率)和 F1-Score。
- 說明為什麼 Accuracy 不適合評估這個模型。
- 在 Precision 和 Recall 之間,信用卡詐欺偵測應該優先哪個?為什麼?你的答案會如何影響閾值的設定?