前言
機器學習中資料預處理階段,首先要考慮的就是將資料集中的異常值找出來,然後再做額外處理。當然,異常值的處理並不存在什麼銀彈,只能具體情況具體分析再根據效果選擇處理方法。
直方圖
看看資料集直方圖也許能看出點端倪,比如下面這個圖,下方的是原始資料集,上面的是對應直方圖,可以看到大多數都分佈在11000左邊,它的右邊存在一些分佈,這些分佈極少的點很可能就是異常點。
sigma原則
一些簡單的場景可能直接使用某些準則就能找出異常值,比如3 sigma或5 sigma之類的。如下圖,這裡用3 sigma準則找到5個異常點。該過程主要計算出平均值mu
和標準差sigma
,然後再比較[mu-3*sigma,mu+3*sigma]
二次sigma處理
如果直接使用sigma原則效果不好,也就是說可能有些沒問題的點被識別成異常點,或者有些異常點沒有被發現,那麼這種情況下可以考慮用二次sigma處理。第一次使用n1 sigma,第二次n2 sigma。
快速傅立葉變換
如果是週期性的時序資料,假如原始訊號包含了噪音,可以考慮用快速傅立葉變換找出異常點。
假設有一個原始時序序列,現在對其新增高斯噪音,高斯噪音直方圖為圖中第二行,然後變成第三行帶高斯噪音的時序序列,增加噪音後看起來相當混亂,所以我們進行傅立葉變換將其轉換到頻域看能否將噪音分離,計算時通過快速傅立葉變換加快執行。
從頻率響應能清楚看到最獨特的兩個點,對應的頻率為5,知道頻率後可以通過一定的頻寬進行噪音分離,那麼比如選擇0.5,那麼頻率範圍就是[4.5,5.5]。將噪音去除後,我們再通過傅立葉逆變換即能得到去除噪音後的時序訊號。
中值方法
類似的還有均值方法,但是均值有時會將差異平均掉了,效果沒這麼好,於是更多使用中值方法。它的主要思想是定義一個視窗大小,然後通過移動視窗不斷將數值與視窗內的中值進行比較,該點與中值的距離如果超過指定的閾值,則說明這是一個異常點。下面是經過中值方法過濾前後。
其他方法
可以使用馬爾科夫鏈蒙特卡洛(MCMC)、高斯過程等等。
github
-------------推薦閱讀------------
我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)
跟我交流,向我提問:
歡迎關注: