異常檢測算法分類及經典模型概覽

最近工作涉及有關異常檢測的內容,而且前幾天在公司做了一次有關異常檢測算法和應用場景的分享,在此總結記錄一下。

 

什麼是異常檢測?

異常檢測(Anomaly Detection 或 Outlier Detection)指的是通過數據挖掘手段識別數據中的“異常點”,常見的應用場景包括:

金融領域:從金融數據中識別”欺詐案例“,如識別信用卡申請欺詐、虛假信貸等;

網絡安全:從流量數據中找出”入侵者“,並識別新的網絡入侵模式;

電商領域:從交易數據中識別”惡意買家“,如羊毛黨、惡意刷屏團伙;

生態災難預警:基於對風速、降雨量、氣溫等指標的預測,判斷未來可能出現的極端天氣;

工業界:可通過異常檢測手段進行工業產品的瑕疵檢測,代替人眼進行測量和判斷。

除此之外,還有很多行業都在使用異常檢測技術來幫助企業降低風險,併爲業務提供指導建議。

 

異常點有哪幾種類型?

目前比較公認的分類方式是分爲三種:

  • 單點異常(Global Outliers):也可以稱爲全局異常,即某個點與全局大多數點都不一樣,那麼這個點構成了單點異常。例如,和三隻小黃人相比,海綿寶寶的混入就可以算作是單點異常。

 

→_→ 最右邊這隻看起來不太一樣!

 

  • 上下文異常(Contextual Outliers):這類異常多爲時間序列數據中的異常,即某個時間點的表現與前後時間段內存在較大的差異,那麼該異常爲一個上下文異常點。例如,在某個溫帶城市夏天的氣溫時序數據中,其中有一天溫度爲10℃,而前後的氣溫都在25-35℃的範圍,那麼這一天的氣溫就可以說是一個上下文異常。

  • 集體異常(Collective Outliers):這類異常是由多個對象組合構成的,即單獨看某個個體可能並不存在異常,但這些個體同時出現,則構成了一種異常。集體異常可能存在多種組成方式,可能是由若干個單點組成的,也可能由幾個序列組成。想象這樣一個場景,某小區某天有一戶人家搬家了,這是一件很正常的事,但如果同一天有10戶同時搬家了,那就構成了集體異常,顯然這不是一個正常小區會時常發生的事情。

 

在異常檢測中經常遇到哪些困難?

1. 在大多數實際的場景中,數據本身是沒有標籤的,也存在一些數據集有標籤,但標籤的可信度非常低,導致放入模型後效果很差,這就導致我們無法直接使用一些成熟的有監督學習方法。

2. 常常存在噪音和異常點混雜在一起的情況,難以區分。

3. 在一些欺詐檢測的場景中,多種詐騙數據都混在一起,很難區分不同類型的詐騙,因爲我們也不瞭解每種詐騙的具體定義。

由於沒有準確的標籤,也沒有對具體詐騙類型的理解,就導致我們陷入雞生蛋 or 蛋生雞的循環之中。要解決這種情況,目前比較常用的手段是,將無監督學習方法和專家經驗相結合,基於無監督學習得到檢測結果,並讓領域專家基於檢測結果給出反饋,以便於我們及時調整模型,反覆進行迭代,最終得到一個越來越準確的模型。

到這裏,我們都發現了,在風控場景中最重要的一環就是:專家經驗。

 

異常檢測算法的分類

異常檢測涉及的場景非常豐富,那麼異常檢測算法可以從哪些角度進行分類呢?一般可以從以下四個角度作區分:

  • 時序相關 VS 時序獨立

  • 全局檢測 VS 局部檢測

  • 輸出形式:標籤 VS 異常分數

  • 根據不同的模型特徵

 

時序相關 VS 時序獨立

首先可以根據該場景的異常是否與時間維度相關。在時序相關問題中,我們假設異常的發生與時間的變化相關,比如一個人平時的信用卡消費約爲每月5000元,但11月的消費達到了10000元,那這種異常的出現就明顯與時間維度相關,可能是因爲”萬惡“的雙十一。

而在時序獨立問題中,我們假設時間的變化對異常是否發生是無影響的,在後續的分析建模中,也就不會代入時間維度。

 

全局檢測 VS 局部檢測

在全局檢測方法中,針對每個點進行檢測時,是以其餘全部點作爲參考對象的,其基本假設是正常點的分佈很集中,而異常點分佈在離集中區域較遠的地方。這類方法的缺點是,在針對每個點進行檢測時,其他的異常點也在參考集內,這可能會導致結果可能存在一定偏差。

而局部檢測方法僅以部分點組成的子集作爲參考對象,基於的假設是,正常點中可能存在多種不同的模式,與這些模式均不同的少數點爲異常點。該類方法在使用過程中的缺點是,參考子集的選取比較困難。

 

輸出形式:標籤 VS 異常分數

這種分類方式是根據模型的輸出形式,即直接輸出標籤還是異常分數。輸出標籤的方法比較簡單直觀,可以直接根據模型輸出的結果判斷每個點是否爲異常點。

使用可以輸出異常得分的模型,我們可以進一步看哪些點的異常程度更高,也可以根據需要設定閾值,比如設定百分比,找出異常程度排在前10%的異常點。

 

根據不同的模型特徵

最後,還可以根據模型本身的特點進行分類,大致可以分爲以下幾種:

  • 統計檢驗方法

  • 基於深度的方法

  • 基於偏差的方法

  • 基於距離的方法

  • 基於密度的方法

  • 深度學習方法

如今用於異常檢測的算法已經非常多了,但萬變不離其宗,無論優化到什麼程度,它們都是由一些原始的模型和思想衍生出來的。下面來回顧一下這些最原始的模型思想。

 

異常檢測經典模型思想

統計檢驗方法

使用這類方法基於的基本假設是,正常的數據是遵循特定分佈形式的,並且佔了很大比例,而異常點的位置和正常點相比存在比較大的偏移。

比如高斯分佈,在平均值加減3倍標準差以外的部分僅佔了0.2%左右的比例,一般我們把這部分數據就標記爲異常數據。

 

高斯分佈

 

使用這種方法存在的問題是,均值和方差本身都對異常值很敏感,因此如果數據本身不具備正態性,就不適合使用這種檢測方法。

 

基於深度的方法

基於深度的方法,即從點空間的邊緣定位異常點,按照不同程度的需求,決定層數及異常點的個數。如下圖所示,圓中密密麻麻的黑點代表一個個數據點,基於的假設是點空間中心這些分佈比較集中、密度較高的點都是正常點,而異常點都位於外層,即分佈比較稀疏的地方。

如下圖,最外層點的深度爲1,再往內幾層深度一次爲2、3、4…… 若我們設置閾值k=2,那麼深度小於等於2的點就全部爲異常點。這一方法最早由 Tukey 在1997年首次提出。

但這個基礎模型僅適用於二維、三維空間。現在有很多流行的算法都借鑑了這種模型的思想,但通過改變計算深度的方式,已經可以實現高維空間的異常檢測,如孤立森林算法。

 

基於偏差的方法

這是一種比較簡單的統計方法,最初是爲單維異常檢測設計的。給定一個數據集後,對每個點進行檢測,如果一個點自身的值與整個集合的指標存在過大的偏差,則該點爲異常點。

具體的實現方法是,定義一個指標 SF(Smooth Factor),這個指標的含義就是當把某個點從集合剔除後方差所降低的差值,我們通過設定一個閾值,與這些偏差值進行比較來確定哪些點存在異常。這個方法是由 Arning 在1996年首次提出的。

 

基於距離的方法

基於距離的方法,即計算每個點與周圍點的距離,來判斷一個點是不是存在異常。基於的假設是正常點的周圍存在很多個近鄰點,而異常點距離周圍點的距離都比較遠。

有一個比較古老的DB基礎模型,是1997年被首次提出的,基本思想是:我們給定一個半徑 ε 和比例 π,假設對點 p 進行異常檢測,若與 p 點的距離小於半徑 ε 的點在所有點中的佔比低於 π,則點 p 爲異常點。比如下圖中的 p1 和 p2 兩個點,它們方圓 ε 的範圍內沒有點,就會被模型標記異常。

之後基於最初這個模型,又出現了基於嵌套循環、基於網格的距離模型,再之後就是我們熟知的 kNN、KMeans,都可以通過計算距離來做異常檢測。

 

基於密度的方法

與基於距離的方法類似,該類方法是針對所研究的點,計算它的周圍密度和其臨近點的周圍密度,基於這兩個密度值計算出相對密度,作爲異常分數。即相對密度越大,異常程度越高。基於的假設是,正常點與其近鄰點的密度是相近的,而異常點的密度和周圍的點存在較大差異。

設計這種方法的動機是,基於距離的異常檢測方法不能很好地處理一些密度存在差異的數據集。如下圖中的數據點分佈,如果使用基於距離的模型,半徑和比例已經設定好了,點 o2 很容易被識別爲異常點,因爲右上的 C1 子集中很多點與周圍點的距離要比 o2 還小,其中很多點就會被標爲正常點。但如果從密度的角度來看,o2 更像是一個正常點。所以無論單從哪個角度看,我們都可能會忽略另一個維度上的特徵,因此還是要根據具體場景和目標任務,以及數據集本身的特點來進行算法的選擇,或是進行算法的結合。

 

深度學習方法

目前最常用於異常檢測的深度學習方法要非 Autoencoder 莫屬了。

Autoencoder 的中文名叫自編碼器,由 Encoder(編碼器)和 Decoder(解碼器)兩部分構成,如下圖:

 

Autoencoder 的結構

 

左邊部分爲編碼器,它可以把高維的輸入壓縮成低維的形式來表示,在此過程中,神經網絡會盡量留下有用的信息,去除掉一些不重要的信息和噪聲。右邊部分爲解碼器,它負責把壓縮了的數據再進行還原,努力恢復成原本的樣子。也就是說,訓練的時候是這個樣子的:


 

 

whatever = autoencoder.fit(X_train, X_train, ...)

妥妥的自己訓練自己,是一個自力更生的模型!

那麼爲什麼它壓縮自己再解壓,這樣折騰一圈後就能用來檢測異常呢?這裏借用李宏毅老師課程中的例子作解釋:

在訓練過程中,我們用辛普森一家中的人物麗莎作爲訓練數據,來訓練一個 Autoencoder 模型,讓模型對圖像進行壓縮再還原,訓練好後,模型記住瞭如何進行這種圖像的編碼和解碼。

此時,使用辛普森家人中爺爺的圖像進行這個模型的測試,此時模型有很好的還原表現,因爲麗莎和爺爺很像,模型之前已經知道如何處理這種數據了。

但是,如果用涼宮春日的頭做測試……

結果就很糟糕了,因爲模型不認識長這樣子的人。因此,Autoencoder 能夠記住自己見過的數據,如果來了新的、相似的數據,也能進行比較好的還原。但如果來了不同於以往的數據,則會有非常大的還原誤差。基於這一點,我們可以使用 Autoencoder 做很多場景的異常或欺詐檢測。


⬇️ 掃描下方二維碼關注公衆號【數據池塘】 ⬇️

回覆【算法】,獲取最全面的機器學習算法網絡圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章