如何從大量資料中找出異常值

超人汪小建發表於2018-11-08

前言

機器學習中資料預處理階段,首先要考慮的就是將資料集中的異常值找出來,然後再做額外處理。當然,異常值的處理並不存在什麼銀彈,只能具體情況具體分析再根據效果選擇處理方法。

直方圖

看看資料集直方圖也許能看出點端倪,比如下面這個圖,下方的是原始資料集,上面的是對應直方圖,可以看到大多數都分佈在11000左邊,它的右邊存在一些分佈,這些分佈極少的點很可能就是異常點。

image

sigma原則

一些簡單的場景可能直接使用某些準則就能找出異常值,比如3 sigma或5 sigma之類的。如下圖,這裡用3 sigma準則找到5個異常點。該過程主要計算出平均值mu和標準差sigma,然後再比較[mu-3*sigma,mu+3*sigma]

image

二次sigma處理

如果直接使用sigma原則效果不好,也就是說可能有些沒問題的點被識別成異常點,或者有些異常點沒有被發現,那麼這種情況下可以考慮用二次sigma處理。第一次使用n1 sigma,第二次n2 sigma。

快速傅立葉變換

如果是週期性的時序資料,假如原始訊號包含了噪音,可以考慮用快速傅立葉變換找出異常點。

假設有一個原始時序序列,現在對其新增高斯噪音,高斯噪音直方圖為圖中第二行,然後變成第三行帶高斯噪音的時序序列,增加噪音後看起來相當混亂,所以我們進行傅立葉變換將其轉換到頻域看能否將噪音分離,計算時通過快速傅立葉變換加快執行。

從頻率響應能清楚看到最獨特的兩個點,對應的頻率為5,知道頻率後可以通過一定的頻寬進行噪音分離,那麼比如選擇0.5,那麼頻率範圍就是[4.5,5.5]。將噪音去除後,我們再通過傅立葉逆變換即能得到去除噪音後的時序訊號。

image

中值方法

類似的還有均值方法,但是均值有時會將差異平均掉了,效果沒這麼好,於是更多使用中值方法。它的主要思想是定義一個視窗大小,然後通過移動視窗不斷將數值與視窗內的中值進行比較,該點與中值的距離如果超過指定的閾值,則說明這是一個異常點。下面是經過中值方法過濾前後。

image

其他方法

可以使用馬爾科夫鏈蒙特卡洛(MCMC)、高斯過程等等。

github

github.com/sea-boat/Ma…

-------------推薦閱讀------------

我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)

為什麼寫《Tomcat核心設計剖析》

我的2017文章彙總——機器學習篇

我的2017文章彙總——Java及中介軟體

我的2017文章彙總——深度學習篇

我的2017文章彙總——JDK原始碼篇

我的2017文章彙總——自然語言處理篇

我的2017文章彙總——Java併發篇


跟我交流,向我提問:

如何從大量資料中找出異常值

歡迎關注:

如何從大量資料中找出異常值

相關文章