檢測異常值的常用方法,除了超過幾倍標準差,還有哪些?
比如數據多維,沒什麼顯著分布,要進行無監督檢測異常值,有哪些常用處理手段
檢測異常值一定程度上也可以叫做離群點識別,常規有以下幾種識別方法:
1.統計檢驗(假設檢驗)
舉個例子:以下一組用戶用車月花費:100,110,90,80,200,120,115,月花費的均值在116左右,標準差在39左右,理論上用戶的分布應該在116±2x39,所以200是離群點
當數據和檢驗類型(t、卡方等)已知的情況下,通過統計方法得出的結果非常可靠,但通常都是單個變數檢驗,工程實踐中重複次數較多
2.距離檢驗(基於不同業務下,選擇不同距離定義)
常規步驟:
1.kmeans尋找k個中心點
2.計算每個點到k個中心點的距離
3.取k個點中min值,不妨記為km
4.倒序排列剔除前N個,即為所求
當數據是連續型變數時計算快速,效果優秀,但是當數據分布為凹分布時或者存在分類或者名義變數時需要預處理,比較麻煩
3.密度檢驗
常規步驟:
1.判斷每個點是不是核心點(滿足最少密度點)
2.核心點之間是否密度可達(算是所有相互包含的密度點)
3.合併密度點
4.repeat
5.尋找剩餘點即為所求
換句話說,思路就是定一個距離半徑,定最少有多少個點,然後把可以到達的點都連起來,判定為同類。但是高維度表現差,密度分布不均表現差
4.特徵檢驗
這個只是在書上讀過,只能講一個大概,如果有人很熟悉歡迎指教。
舉個例子,每個人出行數據之間是有相關性的,比如你的出行距離越長,理論上你的支出也應該更高。存在用戶出行公里數及價格如下,A(100,350),B(150,470),C(200,605),D(80,400),在其他條件一致的情況下,D用戶的出行數據是極其不符合用戶的特徵屬性的,所以可以看作離群點,其實這種方法也可以看作是模型檢驗吧(做一個能夠擬合大部分數據的模型,然後提出殘差過高的點)。
希望能過幫助到你,;)
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計算出的是極度異常的範圍。
超出這個範圍的數值就有可能是異常值,這樣我們就可以從大量數據中自動識別出異常值。
剛好撞上,筆者兩年來的工作一直在這個領域,我只列我用過的方法吧:
1. 統計類方法,題主所說的三倍方差,還有CUSUM,以及X^2檢驗,t檢驗,工作原因細節略去;
2. 聚類方法:聚出類以後找異常類,聚類方法根據你自己的場景選,可以是密度聚類發比如DBSCAN等;
3. ONE-class SVM:該方法只能針對某類異常,泛化能力不足;
4. 基於歷史畫像的方法(profile based)方法,該法雖然簡單,卻有奇效
5. 時間序列中的異常檢測方法。
最近開了一個專欄,準備些一系列介紹異常檢測的方法的文章,剛開始寫第一篇
異常檢測之定義和應用場景篇 - 知乎專欄,之後會陸續更新,歡迎交流
one-class SVM主要用在半監督異常檢測,對於題主說的高維的無監督演算法,建議使用基於近鄰的演算法,如k-NN(不是k-NN分類演算法)等。並且k值要儘可能從小於5的值k開始試。
1、如果異常點很少,使用高斯分布,通過概率判別,概率低於一定閥值則視為異常;
2、如果異常點很多,則可考慮用分類方法判別;
3、聚類;4、四分位數;
推薦閱讀:
※經過第一盤棋,李世石戰勝 AlphaGo 的可能性更大了還是更渺茫了?
※自學數據挖掘可以找到相關工作嗎?
※R 與 Python 在機器學習和數據挖掘領域的優勢和擅長方向分別是什麼?
※出於興趣,我想做一個能思考會幻想的人工智慧。該怎麼做呢?
※t-sne數據可視化演算法的作用是啥?為了降維還是認識數據?