寻找不合群的数据(异常值)
對于煉丹師來說,處理異常值是必備技能,不然模型擬合了這些異常值,對模型的泛化能力可能是相當嚴重的。但是處理前,我們得發現這些異常值。那么什么是異常值呢?比如我們拿到用戶行為畫像,發現年齡一欄是1000歲,這就是異常值了,吉尼斯世界紀錄年齡是146歲(by 度娘)。異常值來源很多,可能是測量誤差帶來的,有些時候我們需要把他們從訓練數據里排除,不然我們獲得的統計特征偏差會很大。
Boxplots
畫出數據的箱線圖可以通過數據的分位值可視化的呈現連續值,很容易且高效的發現異常值,如下圖所示:
上圖中lower whisker和upper whisker就是界限,在這兩個線之外的都是異常值。
Robust Random Cut Forest
該算法會給一個異常評分。低分表示數據點正常。得分較高,則表明存在異常。通常的做法總是建議分數超過平均分的三個標準差被認為是一種異常。該算法可以高效的處理高維數據、離線數據和實時流數據。特別對于實時流數據而言,數據的分布隨著時間的變化而發生變化,所以該算法使用了一些采樣策略(蓄水池策略),同時也指定了窗口,不斷的從模型中剔除過期數據。該算法核心的操作如下所示:
構造樹
在樹中刪除樣本
樹種插入新樣本
構建完樹后,每個樣本的異常值分數就是該樹包含/不包含該節點,發生改變的程度。
論文及代碼地址:
Implementation of the Robust Random Cut Forest Algorithm for anomaly detection on streams. https://klabum.github.io/rrcf/scoring-rctree.html
論文作者還出了個視頻講解:
https://youtu.be/yx1vf3uapX8
Isolation Forest
用無監督的學習方法,檢測離群點。知乎上給了一個非常通俗易懂的例子,假如我們有很多數據,需要做的就是對這些數據進行隨機切分,如下圖所示:
一維數據:
二維數據:
對于異常數據而言,由于比較稀疏,只需要很少幾次切分,即可將他們單獨劃分出來。skearn有現成的庫可以使用,使用起來也是比較方便的。
使用標準差
學過統計學的煉丹師都知道,有這樣一條“名言警句”,68%的數據都出現在離均值1個標準差范圍內,95%的數據都出現在離均值2個標準差之內,99.7%的數據都出現在離均值3個標準差之內。所以我們只要找到那些離均值差3個標準差以上的數據即可認為他們是異常值。
聚類
聚類算法有很多,有基于距離的聚類,如K-means,也有基于密度的聚類,如DBscan。這里我們使用DBscan做異常檢測。下圖是DBscan聚類后的效果圖:
要想通過這種方法進行異常檢測,我們得了解這種聚類算法。簡而言之,基于密度指的是空間上相近,且密度較高的將會聚成一個類,一個類下面的樣本個數有個閾值,太少將不能成為一個類。如果兩個樣本點距離超過閾值,則會拆分為兩個類。聚類完成后不屬于任何類別的點我們最后都認為是噪聲點。
參考資料
- 1、https://www.jiqizhixin.com/articles/2019-07-05-2?from=synced&keyword=%E5%BC%82%E5%B8%B8%E6%A3%80%E6%B5%8B
- 2、https://zhuanlan.zhihu.com/p/88491463
- 3、https://medium.com/swlh/top-five-methods-to-identify-outliers-in-data-2777a87dd7fe
- 4、https://zhuanlan.zhihu.com/p/27777266
總結
以上是生活随笔為你收集整理的寻找不合群的数据(异常值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统开源数据集
- 下一篇: NLP十大数据扩充策略