編輯導語:在資料分析中,我們可能經常會遇到異常資料識別的情況,為了避免一些資料異常,我們會用到一些識別方法,在不同場景下運用的方法也有所不同;本文作者分享了關於資料分析中異常資料識別的一些方法,我們一起來看一下。
異常資料識別在資料分析和資料探勘中,是經常會遇到的問題;本文會介紹不同場景下,異常資料識別的方法有哪些,以及他們之間的區別。
一、使用場景當前異常資料識別的使用場景主要有以下2方面:
- 資料分析和資料探勘在正式分析前的資料處理,識別異常資料後,刪除或者修正異常資料,避免異常資料影響分析結論;
- 風控業務,透過資料識別異常使用者、異常訪問、異常訂單、異常支付等,避免黑產團隊入侵。
對變數做描述性統計,然後再基於業務考慮哪些資料是不合理的。
常用的統計量是最大值和最小值,判斷這個變數是否超過合理的範圍;例如:使用者的年齡為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,然後按照 我們把資料從一維擴充套件到兩維,同樣的,我們沿著兩個座標軸進行隨機切分,嘗試把下圖中的點A’和點B’分別切分出來;我們先隨機選擇一個特徵維度,在這個特徵的最大值和最小值之間隨機選擇一個值,按照跟特徵值的大小關係將資料進行左右切分。 然後,在左右兩組資料中,我們重複上述步驟,再隨機的按某個特徵維度的取值把資料進行細分,直到無法細分,即:只剩下一個數據點,或者剩下的資料全部相同。 跟先前的例子類似,直觀上,點B’跟其他資料點比較疏離,可能只需要很少的幾次操作就可以將它細分出來;點A’需要的切分次數可能會更多一些。 上面其實就是 Isolation Forest(IF)的核心概念。而具體的IF採用二叉樹去對資料進行切分,資料點在二叉樹中所處的深度反應了該條資料的“疏離”程度。 整個演算法大致可以分為兩步: 訓練:構建一棵 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協議