1. 大數據科學家需要掌握的幾種異常值檢測方法
引言
異常值檢測與告警一直是工業界非常關注的問題,自動准確地檢測出系統的異常值,不僅可以節約大量的人力物力,還能盡早發現系統的異常情況,挽回不必要的損失。個推也非常重視大數據中的異常值檢測,例如在運維部門的流量管理業務中,個推很早便展開了對異常值檢測的實踐,也因此積累了較為豐富的經驗。本文將從以下幾個方面介紹異常值檢測。
1、異常值檢測研究背景
2、異常值檢測方法原理
3、異常值檢測應用實踐
異常值檢測研究背景
異常值,故名思議就是不同於正常值的值。 在數學上,可以用離群點來表述,這樣便可以將異常值檢測問題轉化為數學問題來求解。
異常值檢測在很多場景都有廣泛的應用,比如:
1、流量監測
互聯網上某些伺服器的訪問量,可能具有周期性或趨勢性:一般情況下都是相對平穩的,但是當受到某些黑客攻擊後,其訪問量可能發生顯著的變化,及早發現這些異常變化對企業而言有著很好的預防告警作用。
2、金融風控
正常賬戶中,用戶的轉賬行為一般屬於低頻事件,但在某些金融詐騙案中,一些嫌犯的賬戶就可能會出現高頻的轉賬行為,異常檢測系統如果能發現這些異常行為,及時採取相關措施,則會規避不少損失。
3、機器故障檢測
一個運行中的流水線,可能會裝有不同的感測器用來監測運行中的機器,這些感測器數據就反應了機器運行的狀態,這些實時的監測數據具有數據量大、維度廣的特點,用人工盯著看的話成本會非常高,高效的自動異常檢測演算法將能很好地解決這一問題。
異常值檢測方法原理
本文主要將異常值檢測方法分為兩大類:一類是基於統計的異常值檢測,另一類是基於模型的異常值檢測。
基於統計的方法
基於模型的方法
1、基於統計的異常值檢測方法
常見的基於統計的異常值檢測方法有以下2種,一種是基於3σ法則,一種是基於箱體圖。
3σ法則
箱體圖
3σ法則是指在樣本服從正態分布時,一般可認為小於μ-3σ或者大於μ+3σ的樣本值為異常樣本,其中μ為樣本均值,σ為樣本標准差。在實際使用中,我們雖然不知道樣本的真實分布,但只要真實分布與正太分布相差不是太大,該經驗法則在大部分情況下便是適用的。
箱體圖也是一種比較常見的異常值檢測方法,一般取所有樣本的25%分位點Q1和75%分位點Q3,兩者之間的距離為箱體的長度IQR,可認為小於Q1-1.5IQR或者大於Q3+1.5IQR的樣本值為異常樣本。
基於統計的異常檢測往往具有計算簡單、有堅實的統計學基礎等特點,但缺點也非常明顯,例如需要大量的樣本數據進行統計,難以對高維樣本數據進行異常值檢測等。
2、基於模型的異常值檢測
通常可將異常值檢測看作是一個二分類問題,即將所有樣本分為正常樣本和異常樣本,但這和常規的二分類問題又有所區別,常規的二分類一般要求正負樣本是均衡的,如果正負樣本不均勻的話,訓練結果往往會不太好。但在異常值檢測問題中,往往面臨著正(正常值)負(異常值)樣本不均勻的問題,異常值通常比正常值要少得多,因此需要對常規的二分類模型做一些改進。
基於模型的異常值檢測一般可分為有監督模型異常值檢測和無監督模型異常值檢測,比較典型的有監督模型如oneclassSVM、基於神經網路的自編碼器等。 oneclassSVM就是在經典的SVM基礎上改進而來,它用一個超球面替代了超平面,超球面以內的值為正常值,超球面以外的值為異常值。
經典的SVM
1
基於模型的方法
2
基於神經網路的自編碼器結構如下圖所示。
自編碼器(AE)
將正常樣本用於模型訓練,輸入與輸出之間的損失函數可採用常見的均方誤差,因此檢測過程中,當正常樣本輸入時,均方誤差會較小,當異常樣本輸入時,均方誤差會較大,設置合適的閾值便可將異常樣本檢測出來。但該方法也有缺點,就是對於訓練樣本比較相近的正常樣本判別較好,但若正常樣本與訓練樣本相差較大,則可能會導致模型誤判。
無監督模型的異常值檢測是異常值檢測中的主流方法,因為異常值的標注成本往往較高,另外異常值的產生往往無法預料,因此有些異常值可能在過去的樣本中根本沒有出現過, 這將導致某些異常樣本無法標注,這也是有監督模型的局限性所在。 較為常見的無監督異常值檢測模型有密度聚類(DBSCAN)、IsolationForest(IF)、RadomCutForest(RCF)等,其中DBSCAN是一種典型的無監督聚類方法,對某些類型的異常值檢測也能起到不錯的效果。該演算法原理網上資料較多,本文不作詳細介紹。
IF演算法最早由南京大學人工智慧學院院長周志華的團隊提出,是一種非常高效的異常值檢測方法,該方法不需要對樣本數據做任何先驗的假設,只需基於這樣一個事實——異常值只是少數,並且它們具有與正常值非常不同的屬性值。與隨機森林由大量決策樹組成一樣,IsolationForest也由大量的樹組成。IsolationForest中的樹叫isolation tree,簡稱iTree。iTree樹和決策樹不太一樣,其構建過程也比決策樹簡單,因為其中就是一個完全隨機的過程。
假設數據集有N條數據,構建一顆iTree時,從N條數據中均勻抽樣(一般是無放回抽樣)出n個樣本出來,作為這顆樹的訓練樣本。
在樣本中,隨機選一個特徵,並在這個特徵的所有值范圍內(最小值與最大值之間)隨機選一個值,對樣本進行二叉劃分,將樣本中小於該值的劃分到節點的左邊,大於等於該值的劃分到節點的右邊。
這樣得到了一個分裂條件和左、右兩邊的數據集,然後分別在左右兩邊的數據集上重復上面的過程,直至達到終止條件。 終止條件有兩個,一個是數據本身不可再分(只包括一個樣本,或者全部樣本相同),另外一個是樹的高度達到log2(n)。 不同於決策樹,iTree在演算法裡面已經限制了樹的高度。不限制雖然也可行,但出於效率考慮,演算法一般要求高度達到log2(n)深度即可。
把所有的iTree樹構建好了,就可以對測試數據進行預測了。預測的過程就是把測試數據在iTree樹上沿對應的條件分支往下走,直到達到葉子節點,並記錄這過程中經過的路徑長度h(x),即從根節點,穿過中間的節點,最後到達葉子節點,所走過的邊的數量(path length)。最後,將h(x)帶入公式,其中E(.)表示計算期望,c(n)表示當樣本數量為n時,路徑長度的平均值,從而便可計算出每條待測數據的異常分數s(Anomaly Score)。異常分數s具有如下性質:
1)如果分數s越接近1,則該樣本是異常值的可能性越高;
2)如果分數s越接近0,則該樣本是正常值的可能性越高;
RCF演算法與IF演算法思想上是比較類似的,前者可以看成是在IF演算法上做了一些改進。針對IF演算法中沒有考慮到的時間序列因素,RCF演算法考慮了該因素,並且在數據樣本采樣策略上作出了一些改進,使得異常值檢測相對IF演算法變得更加准確和高效,並能更好地應用於流式數據檢測。
IF演算法
RCF演算法
上圖展示了IF演算法和RCF演算法對於異常值檢測的異同。我們可以看出原始數據中有兩個突變異常數據值,對於後一個較大的突變異常值,IF演算法和RCF演算法都檢測了出來,但對於前一個較小的突變異常值,IF演算法沒有檢測出來,而RCF演算法依然檢測了出來,這意味著RCF有更好的異常值檢測性能。
異常值檢測應用實踐
理論還需結合實踐,下面我們將以某應用從2016.08.16至2019.09.21的日活變化情況為例,對異常值檢測的實際應用場景予以介紹:
從上圖中可以看出該應用的日活存在著一些顯著的異常值(比如紅色圓圈部分),這些異常值可能由於活動促銷或者更新迭代出現bug導致日活出現了比較明顯的波動。下面分別用基於統計的方法和基於模型的方法對該日活序列數據進行異常值檢測。
基於3σ法則(基於統計)
RCF演算法(基於模型)
從圖中可以看出,對於較大的突變異常值,3σ法則和RCF演算法都能較好地檢測出來, 但對於較小的突變異常值,RCF演算法則要表現得更好。
總結
上文為大家講解了異常值檢測的方法原理以及應用實踐。綜合來看,異常值檢測演算法多種多樣 ,每一種都有自己的優缺點和適用范圍,很難直接判斷哪一種異常檢測演算法是最佳的, 具體在實戰中,我們需要根據自身業務的特點,比如對計算量的要求、對異常值的容忍度等,選擇合適的異常值檢測演算法。
接下來,個推也會結合自身實踐,在大數據異常檢測方面不斷深耕,繼續優化演算法模型在不同業務場景中的性能,持續為開發者們分享前沿的理念與最新的實踐方案。
2. 怎麼處理缺失值/異常值
https://www.hu.com/question/58230411?sort=created
https://blog.csdn.net/Forlogen/article/details/89534235
(1)隨機丟失(MAR,Missing at Random)(數據丟失的概率與丟失的數據本身無關,而依賴於其他完全變數(無缺失變數))
隨機丟失意味著數據丟失的概率與丟失的數據本身無關,而僅與部分已觀測到的數據有關。也就是說,數據的缺失不是完全隨機的,該類數據的缺失依賴於其他完全變數。
(2)完全隨機丟失(MCAR,Missing Completely at Random)(數據缺失完全隨機事件,無依賴關系)
數據的缺失是完全隨機的,不依賴於任何不完全變數或完全變數,不影響樣本的無偏性。簡單來說,就是數據丟失的概率與其假設值以及其他變數值都完全無關。
(3)非隨機丟失(MNAR,Missing not at Random)
數據的缺失與不完全變數自身的取值有關。分為兩種情況:缺失值取決於其假設值(例如,高收入人群通常不希望在調查中透露他們的收入);或者,缺失值取決於其他變數值(假設基礎數據很正常,也無臨床症狀,醫生可能就覺得無需進一步檢查,所以會有數據缺失)。
在前兩種情況下可以根據其出現情況刪除缺失值的數據,同時,隨機缺失可以通過已知變數對缺失值進行估計。
在第三種情況下,刪除包含缺失值的數據可能會導致模型出現偏差,同時,對數據進行填充也需要格外謹慎。
如果一個病人的體溫測量值是有時缺失的,其原因是醫生覺得病得太重的病人不需要量體溫,那這個缺失顯然不是MAR或者MCAR的。對於離散型特徵,如果將特徵中的缺失值單獨編碼成一個獨立的類別(比如missing),而這個missing類別訓練出來後對response有預測作用,那麼這個特徵中的缺失行為基本不是MAR或者MCAR的。
(1)generative methods:這些方法主要依賴於EM演算法和深度學習,如DAE、GAN等
(2)discriminative methods:如MICE、螞御坦MissForest、matrix completion等
目前的生成式填補演算法存在著一些缺點,它們是以一種基於對數據分布的先驗假設的方法,當數據中含有混合類別和連續變數時,它的泛化能力就會很差。DAE在一定程度上解決了這個問題,但是它在訓練的過程中需要完整的數據集,在很多情況下,缺失的數據部分在拆橋一定程度上反映了完整數據集的內在結構信息,所以獲取到完整的數據集是不太可能的。DAE的另一種方法允許使用不完整的數據集進行訓練,但是它只能根據觀察到的部分來表示數據。而使用DCGANs來完成圖像填補的演算法,同樣需要完整的數據集來訓練判別器。
難點:如果其他變數和缺失變數無關,則預測的結果無意義。如果預測結果相悶桐當准確,則又說明這個變數是沒必要加入建模的。一般情況下,介於兩者之間。
方法 0(最簡單粗暴):在構建模型時忽略異常值。 如果缺失數據量少的話
方法1(快速簡單但效果差):把數值型(連續型)變數中的缺失值用其所對應的類別中的中位數替換。把描述型(離散型)變數缺失的部分用所對應類別中出現最多的數值替代。
方法2(耗時費力但效果好):雖然依然是使用中位數和出現次數最多的數來進行替換,方法2引入了權重。即對需要替換的數據先和其他數據做相似度測量也就是下面公式中的Weight,在補全缺失點是相似的點的數據會有更高的權重W。
方法3 (類xgboost):把缺失值當做稀疏矩陣來對待,本身的在節點分裂時不考慮的缺失值的數值。缺失值數據會被分到左子樹和右子樹分別計算損失,選擇較優的那一個。如果訓練中沒有數據缺失,預測時出現了數據缺失,那麼默認被分類到右子樹。這樣的處理方法固然巧妙,但也有風險:即我們假設了訓練數據和預測數據的分布相同,比如缺失值的分布也相同,不過直覺上應該影響不是很大:)
方法4 (回歸):基於完整的數據集,建立回歸方程。對於包含空值的對象,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變數不是線性相關時會導致有偏差的估計。
方法5 (Kmeans)先根據歐式距離或相關分析來確定距離具有缺失數據樣本最近的K個樣本,將這K個值加權平均來估計該樣本的缺失數據。
方法6 (離散化)為缺失值定製一個特徵值比如,男/女/缺失 分別對應[0/1,0/1,0/1]=>[0,0,1] 這種onehot編碼,特徵離散化後加入計算。
方法1(AutoEncoder系列):在訓練的時候使用0作為缺失值,相當於不激活邊,在輸出的時候不論輸出了什麼都強行置為0,防止反向傳播的時候影響到邊的權重。
方法2 GAN(GAIN),目前的SOTA
方法1(MissForest):對於一個有n個特徵的數據來說,其中特徵T有缺失值,我們就把特徵T當作標簽,其他的n-1個特徵和原本的標簽組成新的特徵矩陣。那對於T來說,它沒有缺失的部分,就是我們的Y_test,這部分數據既有標簽也有特徵,而它缺失的部分,只有特徵沒有標簽,就是我們需要預測的部分。
那如果數據中除了特徵T之外,其他特徵也有缺失值怎麼辦?答案是遍歷所有的特徵,從缺失最少的開始進行填補(因為填補缺失最少的特徵所需要的准確信息最少)。
填補一個特徵時,先將其他特徵的缺失值若為連續型值可用中位數、平均數代替,離散可用眾數代替,每完成一次回歸預測,就將預測值放到原本的特徵矩陣中,再繼續填補下一個特徵。每一次填補完畢,有缺失值的特徵會減少一個,所以每次循環後,需要用0來填補的特徵就越來越少。當進行到最後一個特徵時(這個特徵應該是所有特徵中缺失值最多的),已經沒有任何的其他特徵需要用0來進行填補了,而我們已經使用回歸為其他特徵填補了大量有效信息,可以用來填補缺失最多的特徵。
方法2(matrix factorization):矩陣分解
然後梯度下降一把梭
「年收入」:商品推薦場景下填充平均值,借貸額度場景下填充最小值;
「行為時間點」:填充眾數;
「價格」:商品推薦場景下填充最小值,商品匹配場景下填充平均值;
「人體壽命」:保險費用估計場景下填充最大值,人口估計場景下填充平均值;
「駕齡」:沒有填寫這一項的用戶可能是沒有車,為它填充為0較為合理;
」本科畢業時間」:沒有填寫這一項的用戶可能是沒有上大學,為它填充正無窮比較合理;
「婚姻狀態」:沒有填寫這一項的用戶可能對自己的隱私比較敏感,應單獨設為一個分類,如已婚1、未婚0、未填-1。
主流的機器學習模型千千萬,很難一概而論。但有一些經驗法則(rule of thumb)供參考:
1)樹模型對於缺失值的敏感度較低,大部分時候可以在數據有缺失時使用。
2)涉及到距離度量(distance measurement)時,如計算兩個點之間的距離,缺失數據就變得比較重要。因為涉及到「距離」這個概念,那麼缺失值處理不當就會導致效果很差,如K近鄰演算法(KNN)和支持向量機(SVM)。
3)線性模型的代價函數(loss function)往往涉及到距離(distance)的計算,計算預測值和真實值之間的差別,這容易導致對缺失值敏感。
4)神經網路的魯棒性強,對於缺失數據不是非常敏感,但一般沒有那麼多數據可供使用。
5)貝葉斯模型對於缺失數據也比較穩定,數據量很小的時候首推貝葉斯模型。
總結來看,對於有缺失值的數據在經過缺失值處理後:
3. 運行MATLAB BP神經網路後,得到了誤差曲線(mse),圖例里有四個量,其中,Validation代表啥意思啊
代表檢驗這個網路的訓練結果。
mse表示均方差,當然越小越好。但是這與你訓哪旦練樣本的多少,訓練次數都有很大關系。
這個其實沒有統一的標准,任何人都知道0偏差當然是最好。但是根絕神經網路本身致命的缺陷,由於它是迭代收斂逼近解析式,所以不可能達到0誤差。
這只有根據使用者的工程技術要求來加以判斷,這個誤差指標肯定應該在小於工程誤差范圍內啊。但源核是對於科研研究,也只能具體情況具體分析。定量一說沒有具體絕對一說的。
(3)神經網路異常值檢驗擴展閱讀:
BP神經網路的計算過程由正向計算過程和反向計算過程組成。正向傳播過程,輸入模式從輸入層經隱單元層逐層處理,並轉向輸出層,每~層神經元的狀李裂擾態隻影響下一層神經元的狀態。如果在輸出層不能得到期望的輸出,則轉入反向傳播,將誤差信號沿原來的連接通路返回,通過修改各神經元的權值,使得誤差信號最小。
4. 怎麼去驗證神經網路的有效性
第一步:先看訓練數據的誤差,如果大,那肯定是不行。 若果你只仿鏈有一個輸出,可以畫圖看一下預測的結果和輸出的結果相差多少。
第二步:在訓練前一般會留20%的數據出來作檢驗。 如果在第一步中檢驗了訓練數據的預測結果不錯。,那麼接下來檢驗檢驗數嫌大稿據的預測結果如何,用檢驗數據作為輸入 , 看下預測芹孝出來的結果和實際的相多少。 如果OK,那就OK了, 恭喜,投入使用!
《神經網路之家》