異常檢測算法演變及學習筆記

【說在前面】本人博客新手一枚,象牙塔的老白,職業場的小白。如下內容僅爲我的看法,歡迎批評指正,不喜勿噴![認真看圖][認真看圖]html

【補充說明】異常檢測,又稱離羣點檢測,有着普遍應用。例如金融反欺詐、工業損毀檢測、電網竊電行爲等! python

1、基於時間序列分析

關於時間序列分析的介紹,歡迎瀏覽個人另外一篇博客:時間序列分析中預測類問題下的建模方案,這裏再也不贅述。面試

1. 基於同比和環比

適合數據呈週期性規律的場景中。例如:算法

  • 監控APP的DAU的環比和同比,及時發現DAU上漲或者下跌
  • 監控實時廣告點擊、消耗的環比和同比,及時發現變化

當上述比值超過必定閾值,則斷定出現異常。網絡

2. 基於統計學模型預測

移動平均MA是一種分析時間序列的經常使用工具,它可過濾高頻噪聲和檢測異常點。框架

  • 根據計算方法的不一樣,經常使用的移動平均算法包括簡單移動平均、加權移動平均、指數移動平均。
  • 在序列取值隨時間波動較小的場景中,上述移動均值與該時刻的真實值的差值超過必定閾值,則斷定該時刻的值異常。

固然,還有ARMA、ARIMA、SARIMA等適用於時間序列分析的統計學模型,能夠預測信號並指出其中的異常值。機器學習

3. 基於時間序列分解

STL是一種單維度時間指標異常檢測算法。大體思路是:函數

(1)先將指標作STL時序分解,獲得seasonal、trend、residual成分。工具

(2)用ESD算法對trend+residual成分進行異常檢測。post

(3)爲加強對異常點的魯棒性,將ESD算法中的mean、std等統計量用median, MAD替換。

(4)異常分輸出:abnorm_score = (value - median)/MAD,負分表示異常下跌,正分表示異常上升。

固然,還有其餘的時間序列分解算法,例如STL、X12-ARIMA、STAMP等。

2、基於機率統計

通常會構建一個機率分佈模型,並計算對象符合該模型的機率,把具備低機率的對象視爲異常點。

還記得不,機器學習特徵工程中的RobustScaler方法,在作數據特徵值縮放的時候,利用數據特徵的分位數分佈,將數據根據分位數劃分爲多段,只取中間段來作縮放(例如只取25%分位數到75%分位數的數據作縮放等),這樣減少了異常數據的影響。

1. 單特徵且符合高斯分佈

在正態分佈的假設下,若是有一個新樣本x,當x的正態分佈值小於某個閾值時,就能夠認爲這個樣本是異常的。

在正態分佈中,μ-3σ<=x<=μ+3σ的區域包含了絕大部分數據,能夠以此爲參考,調整ε的值:

 

值得一提的是,若是有些特徵不符合高斯分佈,能夠經過一些函數變換,使其符合高斯分佈,再使用基於統計的方法。

  • 例如取log變換、求內積、指數變換等。

2. 多個特徵,不相關,且均符合高斯分佈

能夠直接對每一個獨立特徵都進行單特徵下的異常檢測(參考1)。

3. 多個特徵,相關,且符合多元高斯分佈

能夠經過如下函數判斷一個樣本是不是異常的:

目的是設法根據訓練集求得μσ,以獲得一個肯定的多元分正態布模型。具體來講,經過最大似然估計量能夠得出下面的結論:

其中Σ是協方差對角矩陣,最終求得的多元正態分佈模型能夠寫成:

關於最大似然估計量、協方差矩陣和多元正態分佈最大似然估計的具體推導過程,這裏不詳細介紹。

4. 馬氏距離 Mahalanobis distance

[公式]

其中S爲二元高斯分佈的協方差矩陣,[公式]爲全部數據對象的均值。Mahalanobis距離越大,數據對象偏離均值越大,也就越異常。

5. G檢驗 Grubbs' Test

Grubbs' Test可理解爲檢驗最大值、最小值偏離均值的程度是否爲異常。

其中,O爲觀測值,E爲指望值。

爲了將Grubbs' Test擴展到k個異常值檢測,須要在數據集中逐步刪除與均值偏離最大的值(即最大值或最小值),同步更新對應的t分佈臨界值,檢驗原假設是否成立。基於此,Rosner提出了Grubbs' Test的泛化版ESD。

6. 箱線圖

箱線圖算法不須要數據服從特定分佈。該方法須要先計算第一四分位數Q1(25%)和第三四分位數Q3(75%)。

令IQR=Q3-Q1,而後算出異常值邊界點Q3+λIQR和Q1- λIQR,一般λ取1.5。

固然還有其餘的統計方法,例如基於混合模型的異常檢測方法(假設正常和異常數據分佈不一樣,而後用G檢驗)等,這裏再也不展開。

3、基於距離

1. 基於角度的異常點檢測

2. 基於KNN的異常點檢測

D是點集,則對於任意點,計算其K近鄰的距離之和Dist(K,X)。Dist(K,X)越大的點越異常。

4、基於密度

基於距離的方法中,閾值是一個固定值,屬於全局性方法。可是有的數據集數據分佈不均勻,有的地方比較稠密,有的地方比較稀疏,這就可能致使閾值難以肯定。咱們須要根據樣本點的局部密度信息去判斷異常狀況。

基於密度的方法主要有LOF、COF、ODIN、MDEF、INFLO、LoOP、LOCI、aLOCI等,具體實現這裏不具體介紹。

1. LOF

首先對於每個數據點,找出它的K個近鄰,而後計算LOF得分,得分越高越多是異常點。

LOF是一個比值,分子是K個近鄰的平均局部可達密度,分母是該數據點的局部可達密度。

  • 可達密度是一個比值,分子是K-近鄰的個數,分母是K-近鄰可達距離之和。
  • A到B的可達距離定義:A和B的真實距離與B的k-近鄰距離的最大值。

2. COF

LOF中計算距離是用的歐式距離,也是默認了數據是球狀分佈,而COF的局部密度是根據最短路徑方法求出的,也叫作鏈式距離。

3. INFLO

LOF容易將邊界處的點判斷爲異常,INFLO在計算密度時,利用k近鄰點和反向近鄰集合,改善了LOF的這個缺點。

4. LoOP

將LOF中計算密度的公式加了平方根,並假設近鄰距離的分佈符合正態分佈。

5、基於聚類

關於聚類算法的介紹,歡迎瀏覽個人另外一篇博客:機器學習中的聚類算法演變及學習筆記,這裏再也不贅述。

此類方法主要有三種假設,三種假設下有各自的方法。

1. 假設一:不屬於任何聚類的點是異常點

主要方法:DBSCAN、SNN clustering、FindOut algorithm、WaveCluster Algorithm。

缺點:不能發現異常簇

2. 假設二:距離最近的聚類結果較遠的點是異常點

主要方法:K-Means、Self-Organizing Maps(SOM)、GMM。

主要步驟:首先進行聚類,而後計算樣例與其所屬聚類中心的距離,計算其所屬聚類的類內平均距離,用二者的比值衡量異常程度。

缺點:不能發現異常簇

3. 假設三:稀疏聚類和較小的聚類裏的點都是異常點

主要方法:CBLOF、LDCOF、CMGOS。

主要步驟:首先進行聚類,而後啓發式地將聚類簇分紅大簇和小簇。

  • 若是某同樣例屬於大簇,則利用該樣例和其所屬大簇計算異常得分
  • 若是某同樣例屬於小簇,則利用該樣例和距離其最近的大簇計算異常得分

優勢:考慮到了數據全局分佈和局部分佈的差別,能夠發現異常簇

6、基於線性方法:矩陣分解和PCA降維

基於矩陣分解的異常點檢測方法的主要思想是利用主成分分析(PCA)去尋找那些違反了數據之間相關性的異常點。

爲了找到這些異常點,基於主成分分析的算法會把數據從原始空間投影到主成分空間,而後再從主成分空間投影回原始空間。

  • 對於大多數的數據而言,若是隻使用第一主成分來進行投影和重構,重構以後的偏差是較小的。
  • 可是對於異常點而言,重構以後的偏差相對較大。

這是由於第一主成分反映了正常點的方差,最後一個主成分反映了異常點的方差。

7、基於分佈

即對比基準數據和待檢測數據的某個特徵的分佈。

1. 相對熵(KL散度)

相對熵(KL散度)能夠衡量兩個隨機分佈之間的距離。

  • 當兩個隨機分佈相同時,它們的相對熵爲零。
  • 當兩個隨機分佈的差異增大時,它們的相對熵也會增大。

2. 卡方檢驗

卡方檢驗經過檢驗統計量來比較指望結果和實際結果之間的差異,而後得出實際結果發生的機率。

檢驗統計量提供了一種指望值與觀察值之間差別的度量辦法,最後根據設定的顯著性水平查找卡方几率表來斷定。

8、基於樹模型

該類方法假設咱們用一個隨機超平面來切割數據空間,每切一次即可以生成兩個子空間。接着繼續用一個隨機超平面來切割每一個子空間,循環下去,直到每一個子空間裏面只有一個數據點爲止。

  • 那些密度很高的簇是須要被切不少次才能讓子空間中只有一個數據點
  • 那些密度很低的點的子空間則很快就被切割成只有一個數據點

此類方法不受球形鄰近的限制,能夠劃分任意形狀的異常點。不一樣的方法區別主要在三個地方:特徵的選取、分割點的選取和分類空間打標籤的方案。此類方法主要包括iForest、SCiForest、RRCF。

1. iForest

此方法適用於異常點較少的狀況,採用構造多個決策樹的方式進行異常檢測。

  • 對數據集進行有放回抽樣,對每一次抽樣出來的樣本構建二叉樹。
  • 構建二叉樹時,隨機選取一個特徵,而後在特徵上隨機選一個分割點,將該特徵小於分割點的數據放在二叉樹左邊,反之放在右邊。
  • 直至二叉樹達到必定深度或者葉子節點只包含一個數據點爲止。
  • 進行異常檢測時,計算該數據點在多個二叉樹上的平均深度,深度越淺,越多是異常值。

iForest只適合檢測全局異常點,不適合檢測局部異常點。

  • 如左圖所示,黑點是異常點,被切幾回就停到一個子空間。白點爲正常點,白色點聚焦在一個簇中。
  • 如右圖所示,用iForest切割4個數據,b和c的高度爲3,a的高度爲2,d的高度爲1,d最早被孤立,它最有可能異常。

image.pngimage.png

2. SCiForest

傳統iForest方法在選擇特徵是隨機選取的,SCiForest在選擇特徵時利用了方差。

傳統iForest選擇分割點後造成的分割超平面是平行於座標軸的,SCiForest能夠生成任意角度的分割超平面。

3. RRCF

能夠動態增刪樹種的節點,適用於流數據異常檢測。

9、基於圖模型

1. 最大聯通圖

在無向圖G中,若從頂點A到頂點B有路徑相連,則稱A和B是連通的。在圖G中存在若干子圖,其中每一個子圖中全部頂點之間都是連通的,但不一樣子圖間不存在頂點連通,那麼稱圖G的這些子圖爲最大連通子圖。

  • 最大聯通圖的前提條件是每條邊必須置信,當數據中存在不太置信的邊時,須要先剔除髒數據,不然會影響最大聯通圖的效果。
  • 如圖所示,device是設備id,mbr是會員id,節點之間有邊表示設備上有對應的會員登陸過,容易看出device_一、device_二、device_三、device_4是同人,能夠根據場景用於判斷做弊,經常使用於挖掘團伙做弊。

image.png

2. 標籤傳播聚類

標籤傳播圖聚類算法是根據圖的拓撲結構,進行子圖的劃分,使得子圖內部節點的鏈接較多,子圖之間的鏈接較少。

標籤傳播算法的基本思路是:節點的標籤依賴其鄰居節點的標籤信息,影響程度由節點類似度決定,經過傳播迭代更新達到穩定。

標籤傳播聚類的子圖間能夠有少許鏈接。適用場景:節點之間「高內聚低耦合」。

  • 圖中的節點經標籤傳播聚類後將得2個子圖,其中節點一、二、三、4屬於一個子圖,節點五、六、七、8屬於一個子圖。
  • 值得一提的是,圖中若是用最大聯通圖(參考1)只會獲得1個子圖,用標籤傳播聚類則會獲得2個子圖。

image.png

10、基於行爲序列:馬爾科夫鏈

如圖所示,用戶在搜索引擎上有5個行爲狀態:頁面請求(P),搜索(S),天然搜索結果(W),廣告點擊(O),翻頁(N)。狀態之間有轉移機率,由若干行爲狀態組成的一條鏈能夠看作一條馬爾科夫鏈。

統計正常行爲序列中任意兩個相鄰的狀態,而後計算每一個狀態轉移到其餘任意狀態的機率,得狀態轉移矩陣。針對每個待檢測用戶行爲序列,易得該序列的機率值,機率值越大,越像正經常使用戶行爲。

image.png

11、基於半監督模型

此類方法適用於標註的數據全都是正常數據,經常使用方法有one-class SVM、SVDD、AutoEncoder、GMM、Naïve Bayes等。

此類方法與無監督方法有些重合,由於無監督方法的基本假設就是數據集中正常數據遠遠多於異常數據。

1. One-class SVM

利用核函數將數據映射到高維空間,尋找超平面使得數據和座標原點間隔最大。

2. SVDD

利用核函數將數據映射到高維空間,尋找儘量小的超球體包裹住正常數據。

3. AutoEncoder

對正常數據進行訓練Encoder和Decoder,進行異常檢測時,若是Decoder出來的向量與原始向量差異很大,就認爲是異常數據。

4. GMM

對正常數據進行高斯混合模型建模,最大似然估計參數。進行異常檢測時,將其特徵帶入模型,可得出它屬於正常數據的機率。

5. Naïve Bayes

過程同高斯混合模型。

6. 生成對抗網絡GAN:比較新的方法

最直觀的理解:利用生成對抗的思想,生成器從隨機噪聲中生成異常數據,判別器判別數據是生成的異常數據,仍是原始的正常數據。

  • 生成器的目標是生成儘量和正常數據類似的數據,讓判別器沒法識別出。
  • 判別器的目標是儘量判別出真實數據和異常數據。

二者進行博弈,最終達到平衡。在異常檢測過程當中,對於給定數據,只須要利用判別器判別出是正常數據仍是異常數據。

12、基於有監督模型

上述方法都是無監督方法,實現和理解相對簡單。可是因爲部分方法每次使用較少的特徵,爲了全方位攔截做弊,須要維護較多策略。

同時,上述部分方法組合多特徵的效果取決於人工經驗。而有監督模型能自動組合較多特徵,具有更強的泛化能力。

1. 基於機器學習模型

關於機器學習算法的介紹,歡迎瀏覽個人另外一篇博客:數據挖掘比賽/項目全流程介紹 ,這裏再也不贅述。

可使用前面的無監督方法挖掘的做弊樣本做爲訓練樣本。若是做弊樣本仍然較少,用SMOTE或者GAN生成做弊樣本。

能夠採用LR、SVM、GBDT、XGBOOST等機器學習算法進行迴歸,實現二分類,完成異常檢測。

2. 基於深度學習模型

關於深度學習算法的介紹,歡迎瀏覽個人另外一篇博客:深度學習中的序列模型演變及學習筆記,這裏再也不贅述。

關於深度學習組件的介紹,歡迎瀏覽個人另外一篇博客:深度學習中的一些組件及使用技巧 ,這裏再也不贅述。

一樣的,可使用前面的無監督方法挖掘的做弊樣本做爲訓練樣本。若是做弊樣本仍然較少,用SMOTE或者GAN生成做弊樣本。

能夠採用CNN、RNN、LSTM等深度學習模型及其融合進行迴歸,實現二分類,完成異常檢測。

值得一提的是,其餘隨筆提到的不少深度學習模型,均適用於「異常檢測」這個應用場景,細品!

舉個例子,阿里的GEM模型實現了異構圖網絡在異常檢測中的應用,採用圖神經網絡相關算法實現了「是否異常」的二分類。

同時,天然還有基於知識圖譜、引入遷移學習、引入強化學習等新技術的推動。

十3、數據類型

隨着信息流的不斷髮展,除了上文提到的時間序列數據、高維數據,目前有圖像、視頻、文本、日誌等數據類型的異常檢測方法。

十4、開源工具庫

可使用Python異常檢測工具庫Pyod。這個工具庫除了支持Sklearn上支持的模型外,還額外提供了不少模型。

本文參考了阿里巴巴的一篇文章:異常檢測的N種方法,阿里工程師都盤出來了

 

若是您對人工智能算法感興趣,歡迎瀏覽個人另外一篇博客:人工智能新手入門學習路線和學習資源合集(含AI綜述/python/機器學習/深度學習/tensorflow)人工智能領域經常使用的開源框架和庫(含機器學習/深度學習/強化學習/知識圖譜/圖神經網絡)

若是你是計算機專業的應屆畢業生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的應屆生,你如何準備求職面試?

若是你是計算機專業的本科生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的本科生,你能夠選擇學習什麼?

若是你是計算機專業的研究生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的研究生,你能夠選擇學習什麼?

若是你對金融科技感興趣,歡迎瀏覽個人另外一篇博客:若是你想了解金融科技,不妨先了解金融科技有哪些可能?

以後博主將持續分享各大算法的學習思路和學習筆記:hello world: 個人博客寫做思路

相關文章
相關標籤/搜索