異常檢測的閾值,你怎麼選?給你整理好了...
異常值是指距離其他觀測值非常遙遠的點,但是我們應該如何度量這個距離的長度呢?同時異常值也可以被視為出現概率非常小的觀測值,但是這也面臨同樣的問題——我們要如何度量這個概率的大小呢?
有許多用來識別異常值的參數和非參數方法,參數方法需要一些關於變數分布情況的假設條件,而非參數方法並不需要這些假設條件。此外,你還可以利用單變數分析和多變數分析的方法來識別異常值。
那麼問題來了,哪個方法得到的結果才是正確的呢?不幸的是,實際上並不存在唯一的標準答案,結果的正確與否取決於你識別這些異常值的目的。你可能想要單獨分析某個變數的情況,或者想利用這些變數構建預測模型。
讓我們採用更直觀的方法來識別異常值吧。
假設存在一個關於移動應用程序的數據集,其中包括操作系統、用戶收入和設備情況三個變數,如下圖所示:
我們應該如何識別出收入變數的異常值呢?
接下來我將嘗試利用參數和非參數方法來檢測異常值。
參數方法
如上圖所示,x軸中的變數是收入,y軸代表收入值對應的概率密度值。圖中粉色部分代表真實的樣本數據,綠色部分表示正態分布數據,藍色部分代表對數正態分布數據。其中正態分布和對數正態分布數據與實際樣本數據具有相同的均值和方差。
我們可以通過計算觀測值出現的概率或者計算觀測值與均值之間的距離來判斷異常值的情況。比如,正態分布情況下位於距均值三倍標準差範圍外的觀測值被視為異常值。
上述的例子中,如果我們假設原始數據服從正態分布,那麼收入大於60,000元的數據都被視為異常值。從右圖中可以看出,對數正態分布能更好地識別出真實的異常值,這是因為原始數據的分布近似於服從對數正態分布。但這並不是一個通用的方法,因為我們很難事先判斷出數據潛在的分布情況。我們可以通過數據的擬合曲線來判斷參數情況,但是如果原始的數據發生了變化,那麼分布的參數也會隨之發生改變。
上圖展示了概率密度函數如何隨參數的變化而發生改變,我們可以很明顯地看出參數的變化會影響異常值的識別過程。
非參數方法
首先讓我們來看一個識別異常值的簡單的非參數方法——箱線圖:
如上圖所示,我們可以看出數據中存在 7 個顯著的異常值(綠色標記的數據)。更多關於箱線圖的內容請參考這篇文章。
上文提到的數據集中還存在一個分類變數——操作系統。如果我們根據操作系統將數據分組並繪製箱線圖,那麼我們是否能夠識別出相同的異常值呢?
上圖中,我們採用了多變數分析的方法。從圖中我們可以看出,IOS 組中存在 3 個異常值,而安卓組則沒有檢測出異常值。這是因為安卓用戶和 IOS 用戶的收入分布情況不一致,所以如果只利用單變數分析方法的話,我們將會錯誤地識別出異常值。
結論
我們可以利用基於數據潛在分布情況的參數和非參數方法來檢測異常值。在樣本數據的均值十分貼近於分布函數的中心且數據集足夠大的情況下,我們可以利用參數方法來識別異常值。如果中位數比均值更貼近於數據的分布中心,那麼我們應該利用非參數的方法來識別異常值。
接下來我們將介紹如何利用聚類方法識別多變數情形中的異常值。
顧名思義,聚類方法就是將特徵相似的樣本聚集在同一個類別中,因此樣本間的相似性是一個非常重要的概念,我們需要考慮如何量化樣本間的相似情況。通常情況下,我們用樣本之間的距離遠近來衡量其相似度,不同的聚類方法採用不同的距離測度方式來實現聚類的目標。我們應該著重關注一個被廣泛使用的聚類方法——K均值聚類演算法。
K均值聚類演算法主要是基於兩兩樣本之間的歐式距離,歐式距離是兩點之間的直線距離。我們還可以採用其他方法——比如馬氏距離,閔式距離和切比雪夫距離——來度量樣板間的相似性,但是這些方法的缺點是計算量大、收斂速度較慢。
給定一組樣本x1,x2,…,xn,其中每個觀測值都是一個d維的向量,K均值演算法的目標是在最小化類內離差的前提下將這n個觀測值分成 k(<=n) 組(S={S1,S2,…,Sk})。換句話說,該演算法的目標函數如下所示:
其中μi表示第 i 組樣本的均值。
藉助上面這個目標函數,我們可以更加直觀地介紹K均值演算法的計算過程。
K均值演算法的基本步驟
步驟一:聚類數目
選擇類別數目k。這是一個循環迭代的過程,我們無法提前知道應該選擇聚成幾個類別。我們將用一個例子來說明如何選擇類別數目。
步驟二:聚類中心
從樣本中隨機抽取出k個點,並將其定義為k個組的中心。
步驟三:計算距離
分別計算所有觀測值到聚類中心的歐式距離,並將其歸到距離最近的中心類別中。假設我們有一個包含100個觀測值的數據集,我們的目標是將其聚成5類。首先我們需要計算每個觀測值到5個中心點的距離,然後從5個距離中篩選出距離最小值,並將該樣本歸到對應的類別中。
步驟四:重新計算類中心
接下來我們需要重新計算各個類別的中心值。某個類的中心值等於該類別中所有樣本點的均值。因此,如果某個類別中的樣本點由於步驟三的計算導致了重分配,那麼相應的類中心也會隨之改變。
步驟五:迭代過程
重複步驟三和步驟四直到類別中心不再改變為止。
擬合K均值演算法前需要記住一個要點——對變數進行標準化處理。比如,你的數據集中包含年齡、身高、體重、收入等無法直接比擬的變數,我們需要將其標準化到同一量綱中。如果數據集中的變數單位一致但方差不同,我們也需要事先將其標準化。數據集中的變數方差不相等,這相當於對方差小的變數賦予了一個更大的權重,因此該演算法傾向於對方差大的變數進行劃分。標準化處理可以保證K均值演算法同等對待所有的變數。一個常用的標準化方法是——所有的觀測值減去均值然後除以標準差。
接下來,讓我們利用K均值聚類演算法來識別數據集中的異常值。假設數據集中某一個類別的特徵完全不同於其他類別,如下表所示:
上表是某個 app 的部分用戶數據。表中有 5 個變數,其中 3 個數值變數,2 個分類變數。分析過程中,我們將忽略第一列變數。通常情況下,我們將 OS 變數中的 Android 賦值為 0,iOS 賦值為1。但是從理論上來說,我們並不建議這樣做,因為擬合K均值模型需要計算樣本之間的歐式距離,我們無法很好地量化 Android 用戶和 iOS 用戶之間的距離。
舉個例子,如果點 A 和點 B 之間的歐式距離等於 30,點 A 和點 C 之間的歐式距離等於 8,那麼我們可以推出點 A 和點 C 更相似。但分類變數不是由數值構成的,而是由枚舉的方式展現出來,比如「香蕉」、「蘋果」和「橙子」,我們無法計算這些水果之間的歐式距離,所以我們無法判斷橙子和香蕉哪個與蘋果更相近。基於這個原因,我們應該採用K眾數演算法來處理分類變數問題,而不是K均值演算法。
獲取聚類數目是一個反覆迭代的過程。為了獲取最佳類別數目,我們可以嘗試對所有的樣本分別擬合 2-20 個類別的模型,然後通過評估統計量的表現情況來選取最佳類別數目。作為一名分析師,擬合多少個類別的模型都是由你決定的。但需要注意的是,你必須在建模前標準化處理數據。
我們可以利用一些統計量來評估最佳類別數目,比如類內平方和,類間平方和,方差貢獻比和統計差異值。本文中主要採用類內平方和來選擇最佳類別數目。
類內平方和(wss)
類內平方和主要反映同一類別中樣本的同質性,該統計量通過計算類中所有點與類中心之間的距離平方和來刻畫聚類效果。加總所有類的類內平方和得到所有樣本的總離差平方和(Total wss)。
上述指標是個相對指標而不是絕對指標,也就是說我們需要結合類別數目來進一步判斷最佳類別數目。如果我們的最佳類別數目在 2 和 20 之間,那麼我們傾向於選擇具有最小 twss 的類別數目。
上圖展現了 twss 隨類別數目變化的趨勢圖,從圖中可以看出:當類別數目大於4時,twss的下降率大大降低。理論上來說,你會傾向於選擇最小twss所對應的類別數目,但在實際應用中這並不是一個好的方案;雖然將樣本聚成 19 類時具有最小的 twss,但是分析這麼多類的數據非常麻煩,我們無法達到聚類的基本要求——類內差異小,類間差異大。綜合多方面信息,本例中我們應該選擇的最佳類別數目為 4。你甚至可以比較不同類別數目模型之間的差異,然後再選取出最佳類別數目。
上圖中不同顏色的點代表不同類別中的樣本。其中第 4 類不同於其他三個類,它的標記顏色為藍色。
聚類特徵
上表給出了每個類別中觀測值的數量,其中類別 4 佔比最小,僅為 3.7%。
接下來讓我們看看每個類別各自的一些特徵:
上表不僅給出了每個類別中各個變數的均值以及樣本的總體均值和標準差,同時還提供了一個用于衡量類均值與總體均值之間差異的統計量 Z-score:
其中μ代表總體均值,σ代表總體標準差。
對每個數值型變數來說,標準差越小,對應的 Z-score 越大。Z-score 的符號代表類均值高於或低於總體均值。
第 4 類的變數值與其他三個類別相差甚遠,比如較低的樣本個數,較高的訪問量、交易值和 Z-score。
讓我們也來看看不同類別中分類變數 OS 的差異情況:
從上表中可以看出,第 4 類中 iOS用戶的比例遠高於其他三組,因此我們可以認為第 4 類為異常值。作為一名分析師,我們需要進一步探索第 4 類的詳細情況,以便於更好地了解異常值的情況。
總之,我們可以利用聚類方法來識別多變數情形中的異常值。除了K均值演算法外還有許多聚類演算法可以用於檢測異常值,但這些已經超出了本文的討論範圍。

