資料分析——異常資料識別

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

資料分析——異常資料識別

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

一、使用場景

當前異常資料識別的使用場景主要有以下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,然後按照

我們把資料從一維擴充套件到兩維,同樣的,我們沿著兩個座標軸進行隨機切分,嘗試把下圖中的點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協議

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 4340 字。

轉載請註明: 資料分析——異常資料識別 - 楠木軒