數(shù)據(jù)分析——異常數(shù)據(jù)識(shí)別

LLL
0 評(píng)論 37062 瀏覽 177 收藏 16 分鐘

編輯導(dǎo)語(yǔ):在數(shù)據(jù)分析中,我們可能經(jīng)常會(huì)遇到異常數(shù)據(jù)識(shí)別的情況,為了避免一些數(shù)據(jù)異常,我們會(huì)用到一些識(shí)別方法,在不同場(chǎng)景下運(yùn)用的方法也有所不同;本文作者分享了關(guān)于數(shù)據(jù)分析中異常數(shù)據(jù)識(shí)別的一些方法,我們一起來(lái)看一下。

異常數(shù)據(jù)識(shí)別在數(shù)據(jù)分析和數(shù)據(jù)挖掘中,是經(jīng)常會(huì)遇到的問(wèn)題;本文會(huì)介紹不同場(chǎng)景下,異常數(shù)據(jù)識(shí)別的方法有哪些,以及他們之間的區(qū)別。

一、使用場(chǎng)景

當(dāng)前異常數(shù)據(jù)識(shí)別的使用場(chǎng)景主要有以下2方面:

  • 數(shù)據(jù)分析和數(shù)據(jù)挖掘在正式分析前的數(shù)據(jù)處理,識(shí)別異常數(shù)據(jù)后,刪除或者修正異常數(shù)據(jù),避免異常數(shù)據(jù)影響分析結(jié)論;
  • 風(fēng)控業(yè)務(wù),通過(guò)數(shù)據(jù)識(shí)別異常用戶(hù)、異常訪(fǎng)問(wèn)、異常訂單、異常支付等,避免黑產(chǎn)團(tuán)隊(duì)入侵。

二、單變量數(shù)據(jù)異常識(shí)別

1. 簡(jiǎn)單統(tǒng)計(jì)量分析

對(duì)變量做描述性統(tǒng)計(jì),然后再基于業(yè)務(wù)考慮哪些數(shù)據(jù)是不合理的。

常用的統(tǒng)計(jì)量是最大值和最小值,判斷這個(gè)變量是否超過(guò)合理的范圍;例如:用戶(hù)的年齡為150歲,這就是異常的。

2. 三倍標(biāo)準(zhǔn)差

定義:如果單變量數(shù)據(jù)服從正態(tài)分布,異常值被定義為與平均值偏差超過(guò)3倍標(biāo)準(zhǔn)差的值。

原因:是因?yàn)樵谡龖B(tài)分布的假設(shè)下,偏離均值3倍標(biāo)準(zhǔn)差出現(xiàn)的概率小于0.003,是一個(gè)小概率事件。

在實(shí)際分析中,我們也不一定要拘泥于3倍標(biāo)準(zhǔn)差,可以根據(jù)實(shí)際嚴(yán)格程度定義,如偏離均值的4倍標(biāo)準(zhǔn)差。

3. BOX-COX轉(zhuǎn)化+3倍標(biāo)準(zhǔn)差

如果原始數(shù)據(jù)的分布是有偏的,不滿(mǎn)足正態(tài)分布時(shí),可通過(guò)BOX-COX轉(zhuǎn)化,在一定程度上修正分布的偏態(tài);轉(zhuǎn)換無(wú)需先驗(yàn)信息,但需要搜尋最優(yōu)的參數(shù)λ。

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

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

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

Box-Cox的python實(shí)現(xiàn)如下,可直接通過(guò)函數(shù)boxcox找到最優(yōu)的lambda和轉(zhuǎn)化后的值:

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

4. 箱線(xiàn)圖

箱形圖(Box plot),又稱(chēng)為盒須圖、盒式圖、盒狀圖或箱線(xiàn)圖,是一種用作顯示一組數(shù)據(jù)分散情況的統(tǒng)計(jì)圖。

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

箱線(xiàn)圖提供了一種數(shù)據(jù)識(shí)別的標(biāo)準(zhǔn):異常值通常被定義為小于下邊緣或者大于上邊緣的數(shù)據(jù)為異常值。

如下圖所示:

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

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

箱線(xiàn)圖識(shí)別異常數(shù)據(jù)的優(yōu)勢(shì):

  • 箱線(xiàn)圖根據(jù)數(shù)據(jù)的真實(shí)分布繪制,他對(duì)數(shù)據(jù)不做任何限制性的要求,比如要服從正態(tài)分布等;
  • 箱線(xiàn)圖異常數(shù)據(jù)識(shí)別依賴(lài)于上四分?jǐn)?shù)和下四分位數(shù),因此異常值極其偏差不會(huì)影響異常值識(shí)別的上下邊緣,這一點(diǎn)是優(yōu)于3倍標(biāo)準(zhǔn)差方法的。

三、時(shí)間序列數(shù)據(jù)異常識(shí)別

日常工作中還有一種場(chǎng)景,是需要對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行監(jiān)控,如:訂單量、廣告訪(fǎng)問(wèn)量、廣告點(diǎn)擊量;我們需要從時(shí)間維度識(shí)別出是否異常刷單、刷廣告點(diǎn)擊的問(wèn)題;像廣告投放場(chǎng)景下,如果發(fā)現(xiàn)渠道刷量,會(huì)及時(shí)停止廣告投放,減少損失。

對(duì)于時(shí)間序列數(shù)據(jù)異常識(shí)別,根據(jù)數(shù)據(jù)不同的特點(diǎn),識(shí)別方法不同。

1. 設(shè)置恒定閾值

如果時(shí)間序列呈現(xiàn)平穩(wěn)分布狀態(tài),即時(shí)間序列數(shù)據(jù)圍繞中心值小范圍內(nèi)波動(dòng);我們可以定義上下界的恒定閾值,如果超過(guò)上下閾值則定義為異常。

2. 設(shè)定動(dòng)態(tài)閾值-移動(dòng)平均法

所謂動(dòng)態(tài)閾值是指,當(dāng)前時(shí)間的異常閾值是由過(guò)去n段時(shí)間的時(shí)序數(shù)據(jù)計(jì)算決定的;通常對(duì)于無(wú)周期,比較平穩(wěn)的時(shí)間序列,設(shè)定動(dòng)態(tài)閾值的方法是移動(dòng)平均法。

所謂移動(dòng)平均法:就是用過(guò)去n個(gè)時(shí)間點(diǎn)的時(shí)序數(shù)據(jù)的平均值作為下一個(gè)時(shí)間點(diǎn)的時(shí)序數(shù)據(jù)的預(yù)測(cè)。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

異常數(shù)據(jù)識(shí)別即是:確定固定移動(dòng)窗口n,以過(guò)去n個(gè)窗口的指標(biāo)平均值作為下一個(gè)窗口的預(yù)測(cè)值;以過(guò)去n個(gè)窗口的指標(biāo)的平均值加減3倍方差作為監(jiān)控的上下界。

使用范圍:數(shù)據(jù)無(wú)周期性,數(shù)據(jù)比較平穩(wěn)。

3. STL數(shù)據(jù)拆解法

如果時(shí)間序列數(shù)據(jù)是周期性數(shù)據(jù),可使用STL算法將時(shí)序數(shù)據(jù)拆解成趨勢(shì)項(xiàng)、周期項(xiàng)和余項(xiàng),即每個(gè)時(shí)刻的時(shí)序數(shù)據(jù)等于當(dāng)前時(shí)序趨勢(shì)項(xiàng)、周期項(xiàng)和余項(xiàng)的和(或者乘)。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

  • 趨勢(shì)項(xiàng)(T_v):涵蓋了這個(gè)時(shí)序數(shù)據(jù)的趨勢(shì)變化;
  • 周期項(xiàng)(S_v):涵蓋了時(shí)序數(shù)據(jù)的周期變化;
  • 余項(xiàng)(R_v):表示時(shí)序數(shù)據(jù)除去趨勢(shì)項(xiàng)和周期項(xiàng)后的日常波動(dòng)變化。

一般使用STL需要確定2個(gè)點(diǎn):

  • 確定數(shù)據(jù)周期,外賣(mài)業(yè)務(wù)的一個(gè)常規(guī)周期為7天,在周一至周五又可以將數(shù)據(jù)周期縮短為1天。
  • 拆分規(guī)則,是選擇加法方式還是乘法方式。

加法方式:原始數(shù)據(jù) = 平均季節(jié)數(shù)據(jù) + 趨勢(shì)數(shù)據(jù) + 余項(xiàng)這種方式,隨著時(shí)間的推移季節(jié)數(shù)據(jù)不會(huì)有太大的變化,在以七天為一大周期的業(yè)務(wù)數(shù)據(jù)更適合這樣的拆分方式。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

乘法方式:原始數(shù)據(jù) = 平均季節(jié)數(shù)據(jù) * 趨勢(shì)數(shù)據(jù) * 余項(xiàng)。

這種方式,直觀(guān)感受是隨著時(shí)間的推移季節(jié)數(shù)據(jù)波動(dòng)會(huì)非常明顯。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

至于如何要判斷某事的時(shí)序數(shù)據(jù)是否異常,是根據(jù)STL分解后的余項(xiàng)來(lái)判斷;一般情況下,余項(xiàng)部分的時(shí)序數(shù)據(jù)是平穩(wěn)分布狀態(tài),我們可對(duì)余項(xiàng)設(shè)置恒定閾值或者動(dòng)態(tài)閾值,如果某個(gè)時(shí)間節(jié)點(diǎn)的分解余項(xiàng)超過(guò)設(shè)定閾值,則是異常數(shù)據(jù)。

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

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

四、多變量數(shù)據(jù)異常識(shí)別

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

1. 孤立森林

孤立森林iForest (Isolation Forest) 是一個(gè)可擴(kuò)散到多變量的快速異常檢測(cè)方法;iForest 適用于連續(xù)數(shù)據(jù)的異常檢測(cè),將異常定義為“容易被孤立的離群點(diǎn)——可以理解為分布稀疏且離密度高的群體較遠(yuǎn)的點(diǎn);用統(tǒng)計(jì)學(xué)來(lái)解釋?zhuān)跀?shù)據(jù)空間里面,分布稀疏的區(qū)域表示數(shù)據(jù)發(fā)生在此區(qū)域的概率很低,因而可以認(rèn)為落在這些區(qū)域里的數(shù)據(jù)是異常的。

iForest屬于Non-parametric和unsupervised的方法,即不用定義數(shù)學(xué)模型也不需要有標(biāo)記的訓(xùn)練。

算法邏輯介紹:

假設(shè)現(xiàn)在有一組一維數(shù)據(jù)(如下圖所示),我們要對(duì)這組數(shù)據(jù)進(jìn)行隨機(jī)切分,希望可以把點(diǎn) A 和點(diǎn) B 單獨(dú)切分出來(lái)。

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

顯然,點(diǎn) B 跟其他數(shù)據(jù)比較疏離,可能用很少的次數(shù)就可以把它切分出來(lái);點(diǎn) A 跟其他數(shù)據(jù)點(diǎn)聚在一起,可能需要更多的次數(shù)才能把它切分出來(lái)。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

我們把數(shù)據(jù)從一維擴(kuò)展到兩維,同樣的,我們沿著兩個(gè)坐標(biāo)軸進(jìn)行隨機(jī)切分,嘗試把下圖中的點(diǎn)A’和點(diǎn)B’分別切分出來(lái);我們先隨機(jī)選擇一個(gè)特征維度,在這個(gè)特征的最大值和最小值之間隨機(jī)選擇一個(gè)值,按照跟特征值的大小關(guān)系將數(shù)據(jù)進(jìn)行左右切分。

然后,在左右兩組數(shù)據(jù)中,我們重復(fù)上述步驟,再隨機(jī)的按某個(gè)特征維度的取值把數(shù)據(jù)進(jìn)行細(xì)分,直到無(wú)法細(xì)分,即:只剩下一個(gè)數(shù)據(jù)點(diǎn),或者剩下的數(shù)據(jù)全部相同。

跟先前的例子類(lèi)似,直觀(guān)上,點(diǎn)B’跟其他數(shù)據(jù)點(diǎn)比較疏離,可能只需要很少的幾次操作就可以將它細(xì)分出來(lái);點(diǎn)A’需要的切分次數(shù)可能會(huì)更多一些。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

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

整個(gè)算法大致可以分為兩步:

  • 訓(xùn)練:抽取多個(gè)樣本,構(gòu)建多棵二叉樹(shù)(Isolation Tree,即 iTree);
  • 預(yù)測(cè):綜合多棵二叉樹(shù)的結(jié)果,計(jì)算每個(gè)數(shù)據(jù)點(diǎn)的異常分值。

訓(xùn)練:構(gòu)建一棵 iTree 時(shí),先從全量數(shù)據(jù)中抽取一批樣本,然后隨機(jī)選擇一個(gè)特征作為起始節(jié)點(diǎn),并在該特征的最大值和最小值之間隨機(jī)選擇一個(gè)值;將樣本中小于該取值的數(shù)據(jù)劃到左分支,大于等于該取值的劃到右分支。

然后,在左右兩個(gè)分支數(shù)據(jù)中,重復(fù)上述步驟,直到滿(mǎn)足如下條件:

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

預(yù)測(cè):根據(jù)估算它在每棵 iTree 中的路徑長(zhǎng)度(也可以叫深度),計(jì)算數(shù)據(jù) x 的異常分值,通常這個(gè)異常分值越小越異常。

Isolation Forest 算法主要有兩個(gè)參數(shù):一個(gè)是二叉樹(shù)的個(gè)數(shù);另一個(gè)是訓(xùn)練單棵 iTree 時(shí)候抽取樣本的數(shù)目。

實(shí)驗(yàn)表明,當(dāng)設(shè)定為 100 棵樹(shù),抽樣樣本數(shù)為 256 條時(shí)候,IF 在大多數(shù)情況下就已經(jīng)可以取得不錯(cuò)的效果,這也體現(xiàn)了算法的簡(jiǎn)單、高效。

具體python實(shí)現(xiàn)如下:

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)

下圖是我用孤立森林?jǐn)M合數(shù)據(jù)識(shí)別異常值的可視化圖,左邊表示原始數(shù)據(jù)的呈現(xiàn),右邊表示孤立森林異常識(shí)別(黑色表示異常,黃色表示正常);從左右對(duì)比可看出,離散點(diǎn)都能識(shí)別出,但是也有一些偏離中心的正常點(diǎn)也被識(shí)別為異常數(shù)據(jù)。

數(shù)據(jù)分析-異常數(shù)據(jù)識(shí)別

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

 

公眾號(hào):須臾即永恒;

本文由 @須臾即永恒 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!