數據分析——異常數據識別

LLL
0 評論 36546 瀏覽 175 收藏 16 分鐘

編輯導語:在數據分析中,我們可能經常會遇到異常數據識別的情況,為了避免一些數據異常,我們會用到一些識別方法,在不同場景下運用的方法也有所不同;本文作者分享了關于數據分析中異常數據識別的一些方法,我們一起來看一下。

異常數據識別在數據分析和數據挖掘中,是經常會遇到的問題;本文會介紹不同場景下,異常數據識別的方法有哪些,以及他們之間的區別。

一、使用場景

當前異常數據識別的使用場景主要有以下2方面:

  • 數據分析和數據挖掘在正式分析前的數據處理,識別異常數據后,刪除或者修正異常數據,避免異常數據影響分析結論;
  • 風控業務,通過數據識別異常用戶、異常訪問、異常訂單、異常支付等,避免黑產團隊入侵。

二、單變量數據異常識別

1. 簡單統計量分析

對變量做描述性統計,然后再基于業務考慮哪些數據是不合理的。

常用的統計量是最大值和最小值,判斷這個變量是否超過合理的范圍;例如:用戶的年齡為150歲,這就是異常的。

2. 三倍標準差

定義:如果單變量數據服從正態分布,異常值被定義為與平均值偏差超過3倍標準差的值。

原因:是因為在正態分布的假設下,偏離均值3倍標準差出現的概率小于0.003,是一個小概率事件。

在實際分析中,我們也不一定要拘泥于3倍標準差,可以根據實際嚴格程度定義,如偏離均值的4倍標準差。

3. BOX-COX轉化+3倍標準差

如果原始數據的分布是有偏的,不滿足正態分布時,可通過BOX-COX轉化,在一定程度上修正分布的偏態;轉換無需先驗信息,但需要搜尋最優的參數λ。

Box-Cox變換的一般形式為:

數據分析-異常數據識別

  • 式中y(lambda)為經Box-Cox變換后得到的新變量,y為原始連續因變量,lambda為變換參數。
  • 以上變換要求原始變量y取值為正,若取值為負時,可先對所有原始數據同加一個常數a,使其(y+a)為正值,然后再進行以上的變換。
  • 常見的lambda取值為0,0.5,-1;在lambda = 0 時該變換為對數變換,-1時為倒數變換,而0.5時為平方根變換。

Box-Cox的python實現如下,可直接通過函數boxcox找到最優的lambda和轉化后的值:

數據分析-異常數據識別

4. 箱線圖

箱形圖(Box plot),又稱為盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況的統計圖。

它能顯示出一組數據的最大值、最小值、中位數及上下四分位數;

箱線圖提供了一種數據識別的標準:異常值通常被定義為小于下邊緣或者大于上邊緣的數據為異常值。

如下圖所示:

數據分析-異常數據識別

  • 上四分位數:1/4的樣本值取值比他大
  • 下四分位數:1/4的樣本值取值比他小
  • 上邊緣=上四分位數+1.5*(上四分位數-下四分位數)
  • 下邊緣=下四分位數-1.5*(上四分位數-下四分位數)

箱線圖識別異常數據的優勢:

  • 箱線圖根據數據的真實分布繪制,他對數據不做任何限制性的要求,比如要服從正態分布等;
  • 箱線圖異常數據識別依賴于上四分數和下四分位數,因此異常值極其偏差不會影響異常值識別的上下邊緣,這一點是優于3倍標準差方法的。

三、時間序列數據異常識別

日常工作中還有一種場景,是需要對時間序列數據進行監控,如:訂單量、廣告訪問量、廣告點擊量;我們需要從時間維度識別出是否異常刷單、刷廣告點擊的問題;像廣告投放場景下,如果發現渠道刷量,會及時停止廣告投放,減少損失。

對于時間序列數據異常識別,根據數據不同的特點,識別方法不同。

1. 設置恒定閾值

如果時間序列呈現平穩分布狀態,即時間序列數據圍繞中心值小范圍內波動;我們可以定義上下界的恒定閾值,如果超過上下閾值則定義為異常。

2. 設定動態閾值-移動平均法

所謂動態閾值是指,當前時間的異常閾值是由過去n段時間的時序數據計算決定的;通常對于無周期,比較平穩的時間序列,設定動態閾值的方法是移動平均法。

所謂移動平均法:就是用過去n個時間點的時序數據的平均值作為下一個時間點的時序數據的預測。

數據分析-異常數據識別

異常數據識別即是:確定固定移動窗口n,以過去n個窗口的指標平均值作為下一個窗口的預測值;以過去n個窗口的指標的平均值加減3倍方差作為監控的上下界。

使用范圍:數據無周期性,數據比較平穩。

3. STL數據拆解法

如果時間序列數據是周期性數據,可使用STL算法將時序數據拆解成趨勢項、周期項和余項,即每個時刻的時序數據等于當前時序趨勢項、周期項和余項的和(或者乘)。

數據分析-異常數據識別

  • 趨勢項(T_v):涵蓋了這個時序數據的趨勢變化;
  • 周期項(S_v):涵蓋了時序數據的周期變化;
  • 余項(R_v):表示時序數據除去趨勢項和周期項后的日常波動變化。

一般使用STL需要確定2個點:

  • 確定數據周期,外賣業務的一個常規周期為7天,在周一至周五又可以將數據周期縮短為1天。
  • 拆分規則,是選擇加法方式還是乘法方式。

加法方式:原始數據 = 平均季節數據 + 趨勢數據 + 余項這種方式,隨著時間的推移季節數據不會有太大的變化,在以七天為一大周期的業務數據更適合這樣的拆分方式。

數據分析-異常數據識別

乘法方式:原始數據 = 平均季節數據 * 趨勢數據 * 余項。

這種方式,直觀感受是隨著時間的推移季節數據波動會非常明顯。

數據分析-異常數據識別

至于如何要判斷某事的時序數據是否異常,是根據STL分解后的余項來判斷;一般情況下,余項部分的時序數據是平穩分布狀態,我們可對余項設置恒定閾值或者動態閾值,如果某個時間節點的分解余項超過設定閾值,則是異常數據。

python可以用seasonal_decompose可以將時間序列數據拆解成三部分,具體函數代碼如下:

import statsmodels.api as sm

from statsmodels.tsa.seasonal import seasonal_decompose

# Multiplicative Decomposition

result_mul = seasonal_decompose(data1, model=’multiplicative’, extrapolate_trend=’freq’)

Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid
# Additive Decomposition

result_add = seasonal_decompose(data1, model=’additive’, extrapolate_trend=’freq’)

Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid

四、多變量數據異常識別

所謂多變量數據異常識別是指:不只從一個特征去判讀數據異常,而是在多個特征下來判斷其是否異常。多變量異常數據識別的方法很多,比如聚類模型、孤立森林模型、one-class svm模型等。下面主要介紹簡單高效,更容易使用的孤立森林模型。

1. 孤立森林

孤立森林iForest (Isolation Forest) 是一個可擴散到多變量的快速異常檢測方法;iForest 適用于連續數據的異常檢測,將異常定義為“容易被孤立的離群點——可以理解為分布稀疏且離密度高的群體較遠的點;用統計學來解釋,在數據空間里面,分布稀疏的區域表示數據發生在此區域的概率很低,因而可以認為落在這些區域里的數據是異常的。

iForest屬于Non-parametric和unsupervised的方法,即不用定義數學模型也不需要有標記的訓練。

算法邏輯介紹:

假設現在有一組一維數據(如下圖所示),我們要對這組數據進行隨機切分,希望可以把點 A 和點 B 單獨切分出來。

具體的,我們先在最大值和最小值之間隨機選擇一個值 x,然后按照 <x 和 >=x 可以把數據分成左右兩組;然后,在這兩組數據中分別重復這個步驟,直到數據不可再分。

顯然,點 B 跟其他數據比較疏離,可能用很少的次數就可以把它切分出來;點 A 跟其他數據點聚在一起,可能需要更多的次數才能把它切分出來。

數據分析-異常數據識別

我們把數據從一維擴展到兩維,同樣的,我們沿著兩個坐標軸進行隨機切分,嘗試把下圖中的點A’和點B’分別切分出來;我們先隨機選擇一個特征維度,在這個特征的最大值和最小值之間隨機選擇一個值,按照跟特征值的大小關系將數據進行左右切分。

然后,在左右兩組數據中,我們重復上述步驟,再隨機的按某個特征維度的取值把數據進行細分,直到無法細分,即:只剩下一個數據點,或者剩下的數據全部相同。

跟先前的例子類似,直觀上,點B’跟其他數據點比較疏離,可能只需要很少的幾次操作就可以將它細分出來;點A’需要的切分次數可能會更多一些。

數據分析-異常數據識別

上面其實就是 Isolation Forest(IF)的核心概念。而具體的IF采用二叉樹去對數據進行切分,數據點在二叉樹中所處的深度反應了該條數據的“疏離”程度。

整個算法大致可以分為兩步:

  • 訓練:抽取多個樣本,構建多棵二叉樹(Isolation Tree,即 iTree);
  • 預測:綜合多棵二叉樹的結果,計算每個數據點的異常分值。

訓練:構建一棵 iTree 時,先從全量數據中抽取一批樣本,然后隨機選擇一個特征作為起始節點,并在該特征的最大值和最小值之間隨機選擇一個值;將樣本中小于該取值的數據劃到左分支,大于等于該取值的劃到右分支。

然后,在左右兩個分支數據中,重復上述步驟,直到滿足如下條件:

  • 數據不可再分,即:只包含一條數據,或者全部數據相同。
  • 二叉樹達到限定的最大深度。

預測:根據估算它在每棵 iTree 中的路徑長度(也可以叫深度),計算數據 x 的異常分值,通常這個異常分值越小越異常。

Isolation Forest 算法主要有兩個參數:一個是二叉樹的個數;另一個是訓練單棵 iTree 時候抽取樣本的數目。

實驗表明,當設定為 100 棵樹,抽樣樣本數為 256 條時候,IF 在大多數情況下就已經可以取得不錯的效果,這也體現了算法的簡單、高效。

具體python實現如下:

from sklearn.ensemble import IsolationForest

IsolationForest(*, n_estimators=100, max_samples=’auto’, contamination=’auto’, max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)

下圖是我用孤立森林擬合數據識別異常值的可視化圖,左邊表示原始數據的呈現,右邊表示孤立森林異常識別(黑色表示異常,黃色表示正常);從左右對比可看出,離散點都能識別出,但是也有一些偏離中心的正常點也被識別為異常數據。

數據分析-異常數據識別

以上就是我要介紹的異常數據識別的方法,上述方法可以覆蓋日常中80%的異常數據識別,所以要熟悉掌握這些方法哦。

 

公眾號:須臾即永恒;

本文由 @須臾即永恒 原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!