有哪些比較好的做異常值檢測的方法?

數據預處理的好壞,很大程度上決定了模型分析結果的好壞。(Garbage In Garbage Out!)

其中,異常值(outliers)檢測是整個數據預處理過程中,十分重要的一環。方法也是多種多樣。比如有基於經典統計的方法——三倍於標準差之上的數據為異常值等等。

由於異常值檢驗,和去重、缺失值處理不同,它帶有一定的主觀性。所以,想請問一下各位大牛,平時你們更願意相信哪種或哪幾種異常值檢測的方法。

謝謝!~


之前寫過幾篇文章:分別介紹了概率方法,矩陣分解,神經網路的方法。

(1)異常點檢測演算法(一)

(2)異常值檢測演算法(二)

(3)異常點檢測演算法(三)

(4)異常點檢測演算法綜述


1. 首先,你要明白什麼是異常值,如何處理異常值

有時候數據集中會包含一個或多個數值異常大或異常小的值,這樣的極端值稱為異常值(outlier)。

對於異常值,我們該怎麼辦呢?

第1步,你需要採用一定的技術手段從大量數據中找出哪些數值可能是異常值。

第2步,然後對找到的這些異常值的準確性進行檢查,以確定如何處理異常值

處理異常值一般有3種辦法:

1)異常值可能是一個被錯誤記錄的數據值,如果是這樣,就可以在進一步分析之前把它修正。

例如在全國人口系統中,出生了一個叫王思聰的嬰兒,王健林前來登記,你手動將王思聰的性別錯誤輸入成「女」。這種情況下的異常值,就需要進一步核實對應人把它修正。

2)異常值也可能是一個被錯誤包含在數據集總的值,如果是這樣,則可以把它刪除。

例如在全國人口系統中,你不小心把你家狗狗的姓名「王二狗」記錄進去了,記錄的年齡是10歲,身高是1米,這明顯不符合正常情況下的10歲兒童身高,進一步識別出異常值後,進行核對,發現是錯誤數據,刪掉。

3)異常值也可能是一個反常的數據值,它被正確記錄並且屬於數據集,這種情況下,它應該被保留。

例如你公司發布了一款吊炸天的產品,沒想到全球用戶都喜歡用,發布會當天銷售量暴增。這時候的異常值代表了銷售的實際數值,應該保留。

2. 如何自動識別出異常值

在了解了異常值和對異常值的處理知識後,可以用四分位數是自動識別出可能的異常值的。

這個方法叫Tukey『s test方法,用於計算出數據集中最小估計值,和最大估計值。這樣超出最小估計值和最大估計值範圍的數值就可能是異常值了。如何計算呢?

最小估計值和最大估計值的計算公式如圖中列出。可以根據不同的數據分析目對k取值。一般k=1.5,計算出的是中度異常的範圍。

K=3計算出的是極度異常的範圍。我們通過下面圖片用圖形的方式看下這個公式是如何計算出數值的範圍的。

下面圖片紅色是k=1.5時,計算出的是中度異常的範圍。

藍色是K=3計算出的是極度異常的範圍。

超出這個範圍的數值就有可能是異常值,這樣我們就可以從大量數據中自動識別出異常值。


Dixon和Grubbs都不錯,演算法也容易實行。效果的好壞,還要具體情況,可設定不同的前提條件加上合適的演算法,進行組合判斷。


還有一個非常高效的演算法,由南京大學周志華老師參與開發的,詳見 iForest (Isolation Forest)孤立森林 異常檢測 入門篇


沒有相信哪種,全部都取決於數據。具體來說就是能獲得什麼樣的數據以及數據特徵。

如果可以獲得label過的training set, 可以用supervised method. 這部分演算法很多,Genetic Algorithm, SVM, etc.

如果可以獲得正確data的label, 則可以用semi-supervised method. 一般是根據正確的數據建立一個模型,不符合這個模型的entry則視為 outliers.

但更多時候,我們都無法獲得有label的training set. 這時候就要用unsupervised method.比較多見的包括:

-LOF: Local Outlier Factor, 根據數據點周圍數據的密度來判斷此數據是否outlier. 這裡是base on neighbor density 決定的。

-Cluster: 類聚。被分到小的cluster里的數據即是outlier.

-KNN: 拿出一個最具代表性的特徵A,以其他特徵為基礎用KNN預測A的值。如果預測錯了,則為outlier

-Etc.

一般是根據數據特徵和你對outlier的定義去選擇。


這個問題,要多看paper,少看知乎,畢竟後者是拿來裝X用的。


想問下四分位數的理論依據是啥?


哈哈,目前在采坑,這個很不錯Outlier Analysis Authors: Charu C. Aggarwal 如果下載不了,請聯繫我!


基於密度的異常檢測,常用LOF,可以看下這篇文章

異常點/離群點檢測演算法——LOF


數據預處理裡面通常畫圖,用box—plot等或者結合現實生活場景,然後我自己感覺重要的是你建模後去看殘差的異常值,Q-Q圖 或者 cook統計量 leverage 都可以

畢竟殘差異常值很可能直接導致你模型的穩健性。


這種預處理不需要用複雜的方法去弄,憑感覺吧。當然你可以用聚類,但聚類其實也是用感覺來做的


我好像有點明白自己為什麼不怎麼回答專業問題了,因為,這種應該查文獻而且一查一個準的,你過來問我?回頭在電腦上編輯一下,把之前搜集過的資料貼一些給題主感受一下。


推薦閱讀:

喜歡 Data Visualization 這個概念的人如何在追求「數據之美」的同時避免「數字的陷阱」?
需要做數據彙報,有什麼好的工具推薦?
數據產品的定義和種類?
你從數據中發現了哪些奇妙的不為人知的知識或者見解?
學習python中的pandas有沒有好的教程推薦?

TAG:數據挖掘 | 數據 | 數據分析 | 統計 | 數據預處理 |