## 前言 異常偵測是一種資料分析的方法,可以識別資料中`不尋常`的模式,常用於發現潛在的威脅或異常行為,如入侵檢測、欺詐檢測、故障檢測和感測器網路事件檢測等。 ## 傳統方法 ### 1. 基於規則的方法 基於規則的異常偵測通常於領域專家設計,用於明確定義正常與異常行為的邊界,方法簡單直觀。 - 基於閾值的方法:設定資料範圍的上下限,超出範圍的資料點被視為異常。 - 多條件規則:將多個條件結合,並賦予不同規則權重與優先級,用於檢測複雜的異常模式。 ### 2. 統計方法 - z score:假設資料符合某種分布情況 (如常態分佈),檢測某個數據點是否偏離分布。 - IQR(Interquartile Range,四分位距):計算IQR(第25個百分位數和第75個百分位數之間的範圍),並將位於第75 個百分位數以上或第25 個百分位數以下IQR 1.5 倍以外的資料點識別為異常值。 ```python import numpy as np # Z-Score Method def detect_anomalies_zscore(data, threshold=3): mean = np.mean(data) std = np.std(data) return [point for point in data if (point - mean) / std > threshold] # IQR Method def detect_anomalies_iqr(data): q25, q75 = np.percentile(data, [25, 75]) iqr = q75 - q25 lower_bound = q25 - (1.5 * iqr) upper_bound = q75 + (1.5 * iqr) return [point for point in data if point < lower_bound or point > upper_bound] ``` ### 3. 時間序列 分析數據的時間變化特性,識別偏離正常趨勢的點,主要用於監控連續數據(如網路流量、股票價格等)。 - ARIMA模型:基於過去數據預測未來值,偏離預測值的數據即為異常。 ## 機器學習 (Machine Learning, ML) ### 1. 監督式學習 (Supervised Learning) - 依賴於一個帶有標籤的數據集來進行訓練。這些數據標籤通常包括「正常」和「異常」兩類,對異常的分類性能高度依賴訓練資料的數量和品質。 - 典型方法: - SVM分類器 (SVM Classifier):構建超平面(Hyperplane)以區分正常和異常樣本。 ![image](https://hackmd.io/_uploads/HkDXlaXL1x.png) - 決策樹 (Decision Tree):使用樹形結構進行分類。 ![image](https://hackmd.io/_uploads/rkcGB-4LJe.png) - 隨機森林 (Random Forest):多個決策樹的集成方法,增強模型的穩定性和準確性。 ![image](https://hackmd.io/_uploads/ByFRba7Uye.png) ### 3. 無監督式學習 (Unsupervised Learning) - 適合異常數據稀少或無標籤的情況,主要依賴正常數據進行學習,以建立正常行為的模式並檢測偏離該模式的異常數據,或是從數據本身中提取有用的信息。 - 典型方法: - 基於向量機方法 (SVM--based) - One-class:將正常數據可以用一個邊界(超平面或超球體)封閉起來,偏離該邊界的數據被認為是異常。 ![image](https://hackmd.io/_uploads/rk9Vlp7UJg.png) - 聚類方法 (Clustering): - DBSCAN:基於密度的分群方法,能識別噪聲點和異常點。 - K-means:將數據分為𝑘個群組,基於距離最小化的原則劃分。 - 密度估計 (Density Estimation): - KNN:計算數據點與其最近鄰的距離,距離大的數據被視為異常。 - LOF (Local Outlier Factor):基於數據點與其鄰域密度的比較,密度明顯較低的點標記為異常。 - 降維方法 (Dimensionality Reduction): - PCA:透過線性變換找到數據最大方差的方向,常用於數據預處理、降維。 - T-SNE (t-Distributed Stochastic Neighbor Embedding):非線性降維方法,用於高維數據的可視化,用於資料點在 2D 或 3D 空間中的分佈展示。 - 基於樹的方法 (Tree-based) - 孤立森林 (Isolation Forest):基於異常數據更容易被隔離的原理進行檢測。 ### 3. 集成學習方法 (Ensemble Methods) 將多個弱學習器(Weak Learners)結合成為一個強學習器(Strong Learner)的機器學習方法,其目的是提高模型的準確性和穩健性。這些方法通過整合多個基礎模型的優勢,彌補單一模型的不足。 - 典型方法: - Voting: - 硬投票 (Hard Voting):基於多數決定輸出標籤,異常點由多數模型標記決定。 - 軟投票 (Soft Voting):基於異常分數的加權平均,分數超過某閾值的數據點被標記為異常。 - Bagging: - 將樣本重複抽樣 (取後放回),產生多個子資料集 (Subsets) 後,依序建立多個模型,最後再將所有模型的結果彙整在一起。 - 孤立森林 (Isolation Forest) 是基於隨機樹的 Bagging 方法,每棵樹使用不同的數據子集,異常點因更容易被隔離而被標記。 ![image](https://hackmd.io/_uploads/B1qAl3m8Jx.png) - Boosting: - 跟 Bagging 使用多個強模型不同, Boosting 會強調使用上需要多個**弱模型**,若M1 M2 M3 太複雜(太強),那彼此之間就會互相干擾,影響最後預測/分類結果。 - 一開始先建一個簡單的模型 M1 ,此時會有預測錯誤的資料,把這些資料的權重加大,建 M2 模型,然後又會有預測錯的資料,再把資料的權重加大,建 M3 模型… ![image](https://hackmd.io/_uploads/r1r6G3XI1g.png) - Stacking: - 在傳統的做法會將(y1, y2, y3)的結果直接拿來平均(預測問題)或投票法(分類問題),得到最後的結果。而 Stacking 採用另一個模型(blender)來取代這樣的概念,也就是「把本來的預測結果再進一步做預測」的感覺。 ![image](https://hackmd.io/_uploads/By8HC3XLye.png) - 在這個流程中,首先將訓練資料分割成多個子集,例如 3-folds,這樣一部分子集用於訓練模型(綠色部分),另一部分則用於模型預測生成中間結果 **Predict_X**(紅色部分)。所有這些 **Predict_X** 結果被組合成 **Meta-X**,作為最終模型(Meta-Model)的訓練資料。 - 對於測試資料,將其輸入各個子模型,生成每個模型的測試資料預測結果 **Predict**(紫色部分)。因為有多個子模型,會得到多組預測結果,這些結果通過平均法或投票法整合成 **Meta-Y**。 - 最終,使用 **Meta-X** 和 **Meta-Y** 作為資料,訓練最終的 Meta-Model,該模型負責進行最終的預測。這種方法結合了多個模型的優勢,通過中間層的預測結果(Meta-X 和 Meta-Y)提高了整體的預測性能。 - 因此,整個 Stacking 的概念可以用下圖表示: ![image](https://hackmd.io/_uploads/HyPmC2XIJg.png) ## 深度學習 (Deep Learning, DL) ### 1. 監督式學習 (Supervised Learning) - 卷積神經網絡 (CNN):利用卷積層提取局部特徵,池化層進行特徵壓縮,最終通過全連接層完成特徵表示或分類任務。 ![image](https://hackmd.io/_uploads/rkJkvTm81l.png) - LSTM:針對**時間序列數據**的深度學習模型,擅長處理具有長期依賴性的數據。它能學習序列中長期和短期的模式,廣泛應用於異常偵測場景,特別是涉及時間序列或順序依賴數據的問題。 ![image](https://hackmd.io/_uploads/H1hcLa7Ikx.png) ### 2. 無監督式學習 (Unsupervised Learning) - 自編碼器 (Autoencoder):通過學習正常數據的壓縮和重建模式來建立模型,重建誤差高的數據點被視為異常。 ![image](https://hackmd.io/_uploads/H127bTmL1g.png) - 生成對抗網絡 (GAN, Generative Adversarial Network):由生成器 (Generator) 和判別器 (Discriminator) 組成,通過兩者的對抗,學習數據的真實分布。 ![image](https://hackmd.io/_uploads/SkP2DpmIkl.png) ## 強化學習 (Reinforcement Learning, RL) 強化學習在異常檢測中主要是作為一個優化和調整的機制,而不是直接用來檢測異常。它的核心思想是通過與環境的互動來學習最優的決策策略,使系統具有自適應能力,可以根據環境的變化動態調整檢測策略,從而提高異常檢測的效果。 - 動態調整檢測閾值或參數: - 這是強化學習在異常檢測中最常見的應用。 - 不同的系統狀態可能需要不同的檢測閾值。 - 強化學習智能體可以根據系統的即時狀態 (State) 採取調整動作 (Action),例如提高或降低檢測閾值。 - 如果調整後檢測的準確度提高,則給予正向獎勵 (Reward);反之,若產生過多誤報或漏報,則給予負向獎勵。 - 透過不斷的學習,智能體(agent)可以找到最佳的閾值調整策略。 - 學習最佳的檢測策略或方法組合: - 實際系統中可能存在多種異常檢測方法,例如基於統計、機器學習或深度學習的方法。 - 強化學習可以學習在不同情境下選擇最適合的檢測方法,或如何最佳地組合多個檢測器的結果。 - 智能體(agent)透過反覆試驗和調整,學習在什麼樣的場景下使用什麼樣的檢測方法最為有效,以達到最佳的檢測效能。 ## 結論 異常偵測技術已成為資料分析、工業監控、金融安全等領域的重要工具。從統計方法到機器學習,再到深度學習和強化學習,技術的發展讓異常偵測在處理數據複雜性和提升準確性上取得了顯著進步。我列舉了目前常見的異常偵測方法,希望能幫助大家對這個領域有更清楚的認識。 未來,異常偵測技術將隨著資料規模的增長和應用需求的多樣化不斷演進,結合更多創新的模型和技術,進一步提升在不同場景中的效能和應用價值。