💡一句話定義
你每天都在被它保護:銀行在你刷卡 0.2 秒內判斷「這筆跟你平常的消費模式差多少」;機台的震動感測器一偏離常態就通知維修;防毒軟體看到程式行為怪怪的就隔離它。
🎮互動:異常偵測實驗室
下面是一團正常點(灰色)加上幾個真正的異常點(用菱形標記)。選一種方法、拉動門檻,看系統把哪些點判為異常:紅色=抓對(TP)、橘色=誤報(FP,正常被當異常)、黃框=漏抓(FN,異常沒被抓到)。右邊即時算 Precision、Recall、F1。
📊 這個門檻下的成績
抓到的裡面幾成是真的
真異常被抓到幾成
兩者的調和平均
🤔為什麼它不是「一般的二元分類」?
既然要分「正常/異常」,直接訓練一個分類器不就好了?問題出在資料的長相:
| 面向 | 一般二元分類(例:貓 vs 狗) | 異常偵測(例:正常交易 vs 詐欺) |
|---|---|---|
| 兩類比例 | 大致平衡,或至少都有一定數量 | 極度不平衡:異常常 <1%,甚至 0.01% |
| 標籤 | 每筆都有 | 異常常常沒標籤(沒人知道哪筆是詐欺,直到客訴) |
| 異常的長相 | 兩類各自有穩定模式 | 異常五花八門又會變:今天的詐欺手法跟去年不同,學「異常長怎樣」很快過時 |
| 學習目標 | 學兩類的分界線 | 學正常的範圍,範圍外都算異常(one-class 思維) |
| 評估 | Accuracy 多半夠用 | Accuracy 幾乎無意義,要看 Precision / Recall / F1 / PR-AUC |
| 輸出 | 類別 | 通常是異常分數+一個可調的門檻 |
🧭三種設定:有沒有標籤、有哪種標籤
只有正常資料(或只確定其中一部分是正常)。模型只學「正常的樣子」,偏離就算異常:One-class SVM、Autoencoder 都是這一路。最常見的實務設定。
完全沒標籤,假設「異常很少、而且跟大多數長得不一樣」,直接從資料結構找離群:z-score、IQR、kNN、LOF、Isolation Forest、DBSCAN 噪音點。
🧰方法家族:五種「算怪異分數」的思路
① 統計法:離平均太遠就是怪
② 距離/密度法:附近沒鄰居就是怪
- kNN 距離:算每個點到第 k 個最近鄰的距離(或前 k 個的平均),距離大=孤立。原理同KNN,只是拿距離當分數而不是投票。
- LOF(Local Outlier Factor,局部離群因子):比「我的密度」跟「鄰居的密度」——LOF ≈ 1 代表跟鄰居差不多,LOF ≫ 1 代表我比鄰居稀疏很多。好處是能處理不同密度的群:緊密群旁邊的小偏離也抓得到,鬆散群裡的點不會被冤枉。
- DBSCAN 噪音點:DBSCAN 分群時,密度不夠、進不了任何群的點被標成 −1(噪音),天然就是異常偵測。
③ 隔離法:Isolation Forest——怪咖很容易被「切」出來
直覺:離群點孤零零待在空曠處,隨便切一兩刀就被單獨關進一格;正常點擠在人群裡,要切很多刀才隔得開。所以「被隔離所需的切割次數(路徑長度)越短,越可能是異常」。優點:不用算距離、高維也快、線性時間、對比例不敏感,是目前工業界最常用的預設方法之一。想看故事版?Isolation Forest 漫畫。
④ 重建誤差法:Autoencoder——學會畫正常,畫不出來的就是怪
自編碼器(Autoencoder)是一個「壓縮再還原」的神經網路:只用正常資料訓練它把輸入壓成低維向量再還原回來。因為它只看過正常,遇到異常輸入時還原得很差——重建誤差(reconstruction error)就是異常分數。適合高維資料(影像瑕疵檢測、感測器多通道)。VAE 是它的機率版本,PCA 重建誤差則是線性的簡化版。
⑤ 時序異常:跟「自己的過去」比
感測器、網站流量、股價這類時間序列,異常不是「離全體平均遠」,而是「離預期的下一刻遠」。做法:用 ARIMA/LSTM/Prophet 預測下一個值,實際值與預測值的差(殘差)太大就是異常;或用滑動視窗統計、季節性分解。常見型態:點異常(突波)、情境異常(半夜流量像白天)、集體異常(一段時間整體漂移)。
| 方法 | 怪異分數怎麼算 | 優點 | 弱點 |
|---|---|---|---|
| z-score / IQR | 離平均/四分位數多遠 | 簡單、可解釋、一維超好用 | 假設單峰;多維、多群失效;z 會被極端值拉歪 |
| kNN 距離 | 到第 k 近鄰的距離 | 直覺、無分布假設 | O(n²)、高維距離失靈、密度不均會誤判 |
| LOF | 我的密度 ÷ 鄰居的密度 | 處理不同密度的群 | k 難選、計算重 |
| Isolation Forest | 隨機切割的路徑長度 | 快、高維可用、工業預設 | 對「夾在兩群中間」的異常較弱;隨機性 |
| Autoencoder | 重建誤差 | 高維/影像/多感測器 | 需要夠多正常資料;訓練成本;若訓練集混入異常會學壞 |
| 時序預測殘差 | 實際 − 預測 | 抓情境異常、漂移 | 依賴預測模型品質;季節性要先處理 |
📏評估:Accuracy 是陷阱,門檻是取捨
拉拉看詐欺比例,看「一律判正常」這個什麼都不做的模型,Accuracy 有多漂亮:
所以異常偵測要看的是只跟「異常」這一類有關的指標(詳見Accuracy & F1):
我舉旗的這些,有幾成真的是異常?低=誤報多,客服被灌爆、工程師半夜被叫醒。
所有真異常,我抓到幾成?低=漏抓多,詐欺溜走、機台真的壞掉。
Precision 與 Recall 的調和平均,一個數字看兩邊;也可用 F2 加重 Recall。
門檻怎麼選?看誤報與漏抓各自的成本
| 情境 | 漏抓(FN)的代價 | 誤報(FP)的代價 | 門檻傾向 |
|---|---|---|---|
| 信用卡詐欺 | 損失一筆錢(可事後理賠) | 卡被鎖、顧客抓狂、客服成本 | 折衷;高額交易放鬆、小額收緊 |
| 飛機引擎/醫療設備 | 災難性 | 多檢查一次 | 寧可誤報:門檻放鬆、追求高 Recall |
| 資安入侵警報 | 資料外洩 | SOC 人員警報疲勞(alert fatigue),真的來了反而被忽略 | 分級:高分自動阻擋、中分人工看 |
| 產線品檢 | 瑕疵品流出 | 好品被丟掉 | 看瑕疵品外流成本 vs 報廢成本 |
🏭應用情境:考題最愛的四個場景
特徵:金額、時間、地點、商家類別、跟持卡人歷史的偏離。即時打分、超門檻就二次驗證。異常比例常 <0.2%。
震動、溫度、電流時序;用 Autoencoder 或時序殘差偵測「開始不正常」的早期徵兆,在故障前排維修,取代定期換零件。
流量、登入行為、API 呼叫模式。未知攻擊沒有簽章,只能靠「跟平常不一樣」抓(UEBA、NIDS)。
只用良品影像訓練重建模型,瑕疵區域重建誤差高就定位出來;解決「瑕疵樣本太少、型態太多」的痛點。
其他:醫療(心電圖異常搏動)、電商(刷單、假評論)、日誌監控(伺服器錯誤率突升)、資料清理前的離群值處理(跟前面離群值偵測相呼應——同一套工具,一個用來「丟掉」,一個用來「警報」)。
✅自我檢測
🎯重點整理
- 本質:學「正常長怎樣」,算每個點的怪異分數,超過門檻就警報;不是學「異常長怎樣」。
- 為何不是一般分類:異常極少、常無標籤、型態未知且會變;Accuracy 無意義。
- 三種設定:監督(都有標籤→不平衡分類)、半監督/單類別(只學正常,最常見)、非監督(完全無標籤)。
- 方法家族:統計(z-score、IQR)、距離密度(kNN、LOF、DBSCAN 噪音)、隔離(Isolation Forest:路徑短=異常)、重建誤差(Autoencoder)、時序殘差。
- 評估:Precision(誤報少)、Recall(漏抓少)、F1、PR-AUC;極度不平衡時 PR-AUC 比 ROC-AUC 誠實。
- 門檻:是業務決策不是數學常數——看漏抓與誤報各自的成本;安全攸關的場景追求高 Recall。
- 風險:遮蔽效應、訓練集混入異常、概念漂移、警報疲勞、把少數正常族群誤當異常。
- 應用:詐欺偵測、預測性維護、資安入侵、品質檢測。