異常值檢測算法

    閒話:最近總是特別嗜睡,不知爲何牀對我的引力總是讓我死死的賴在上面,大概是懶癌又犯了....要改。

異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據的過程,忽視異常值的存在是十分危險的,不加剔除地把異常值包括進數據的計算分析過程中,對結果會產生不良影響,重視異常值的出現,分析其產生的原因,常常成爲發現問題進而改進決策的契機。

常用的異常值檢測方法主要有:

 1. 簡單統計量分析:

先對變量做一個描述性統計,進而查看哪些數據是不合理的,如箱型圖分析,平均值,最大最小值分析,統計學上的3σ法則(若數據服從正太分佈,在3σ原則下,異常值被定義爲一組測定值中與平均值的偏差超過3倍標準差的值,因爲在正態分佈的假設下,距離平均值3σ之外的值出現的概率小於0.003)。
3σ原則

2. 基於距離的方法:

通常可以在對象之間定義鄰近性度量,並且許多移倉檢測方法都基於鄰近度。異常對象是那些遠離大部分其他對象的對象,這一鄰域的許多技術都基於距離,稱作基於距離的離羣點檢測技術,代表算法:基於KNN的密度檢測算法。優點與缺點:基於鄰近度的方法一般需要O(m^2)時間。這對於大型數據集可能代價過高,儘管在低維情況下可以使用專門的算法來提高性能。該方法對參數的選擇也是敏感的。此外,它不能處理具有不同密度區域的數據集,因爲它使用全局閾值,不能考慮這種密度的變化。

3. 基於密度的離羣點檢測:

從基於密度的觀點來看,離羣點是在低密度區域中的對象。基於密度的離羣點檢測與基於鄰近度的離羣點檢測密切相關,因爲密度通常用鄰近度定義。一種常用的定義密度的方法是,定義密度爲到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。優點與缺點:基於相對密度的離羣點檢測給出了對象是離羣點程度的定量度量,並且及時數據具有不同密度的區域也能夠很好地處理。與基於距離的方法一樣,這些方法必然具有O(m^2)時間複雜度(其中m是對象個數),雖然對於低維數據,使用專門的數據結構可以將它降低到O(mlogm)。參數選擇也是困難的,雖然標準LOF算法通過觀察不同的k值,然後取最大離羣點得分來處理該問題。然而,仍然需要選擇這些值的上下界。

4. 基於密度的離羣點檢測:

一種利用聚類檢測離羣點的方法是丟棄原理其他簇的小簇。這種方法可以與任何聚類技術一起使用,但是需要最小簇大小和小簇與其他簇之間距離的閾值,通常,該過程可以簡化爲丟棄小於某個最小尺寸的所有簇。
優點與缺點:有些聚類技術(如K均值)的時間和空間複雜度是線性或接近線性的,因而基於這種算法的離羣點檢測技術可能是高度有效的。此外,簇的定義通常是離羣點的補,因此可能同時發現簇和離羣點。缺點方面,產生的離羣點集和它們的得分可能非常依賴所用的簇的個數和數據總離羣點的存在性。例如,基於原型的算法產生的簇可能因數據中存在離羣點而扭曲。聚類算法產生的簇的質量對該算法產生的離羣點的質量影響非常大。每種聚類算法只適合特定的數據類型;因此,應當小心地選擇聚類算法。

5. Isolation Forest:

Isolation Forest 簡稱 IForest,這個算法是周志華老師在2010年提出的一個異常值檢測算法,在工業界很實用,算法效果好,時間效率高,能有效處理高維數據和海量數據,也是本文主要介紹的一種算法。
算法起源於08年的一篇論文《Isolation Forest》,這論文由澳大利亞莫納什大學的兩位教授Fei Tony Liu, Kai Ming Ting和南京大學的周志華教授共同完成,而這三人在2011年又發表了《Isolation-based Anomaly Detection》,這兩篇論文算是確定了這個算法的基礎。

論文地址:
http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf
http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf

算法流程:
1.構建N棵iTree,爲每棵樹隨機做無放回採樣生成訓練集。iTree是一棵隨機二叉樹,給定數據集DataSet,假設數據集內所有屬性都是連續型變量,iTree構造過程可以描述爲:

    首先隨機選擇數據的一個屬性A,然後隨機選擇屬性A中的一個值V,按照屬性A的值對每條數據進行樹的分裂,將小於V的記錄放在左孩子上,把大於V的記錄放在右孩子上,然後按上述過程遞歸構建樹,直到滿足如下條件:
    1.傳入的數據集只有一條記錄或者多條一樣的記錄;
    2.樹的高度達到了限定高度

2.進行預測:預測的過程就是把測試數據在iTree樹上沿對應的分支往下走,走到達到葉子節點,並記錄着過程中經過的路徑長度h(x)。將h(x)帶入到異常值評分函數中,得到異常值分數,公式如下圖所示:
這裏寫圖片描述
 s(x,n)s(x,n)就是記錄x在由n個樣本的訓練數據構成的iTree的異常指數,s(x,n)s(x,n)取值範圍爲[0,1],越接近1表示是異常點的可能性高,越接近0表示是正常點的可能性比較高,如果大部分的訓練樣本的s(x,n)都接近於0.5,說明整個數據集都沒有明顯的異常值。

這裏寫圖片描述

關於這個算法我的理解:
相比較與基於密度和基於距離的異常值檢測算法,iForest 採用空間劃分的策略來查找異常值,在這個算法中,異常值存在於樹種較淺層的位置,可以理解爲,假設我們用一個隨機超平面來切割(split)數據空間(data space), 切一次可以生成兩個子空間(想象拿刀切蛋糕一分爲二)。之後我們再繼續用一個隨機超平面來切割每個子空間,循環下去,直到每子空間裏面只有一個數據點爲止。直觀上來講,我們可以發現那些密度很高的簇是可以被切很多次纔會停止切割,但是那些密度很低的點很容易很早的就停到一個子空間了。(這個例子引用自http://www.jianshu.com/p/5af3c66e0410
對於這個算法,我個人理解爲這是一種kd樹和隨機森林模型的思想融合的產物,其利用類似kd樹對空間檢索和劃分的理論,找到那些遊離於整體的異常值的點,然後通過對樹的集成思想,增強整個模型的泛化能力和對異常值鑑別的準確度,基於以上特性,iForest具有線性時間複雜度和對海量數據的處理能力,並且隨着樹的數量越多,算法越穩定。

sklearn示例
iForest 已經被集成在scikit-learn的0.19版本中,在Sk-learn中其評分函數越低,表示數據是越正常,越高則爲異常值的可能性越大。

http://scikit-learn.org/dev/modules/generated/sklearn.ensemble.IsolationForest.html

本文參考資料:

http://blog.163.com/zhoulili1987619@126/blog/static/353082012015211114642546/
http://www.jianshu.com/p/1b020e2605e2
http://www.cnblogs.com/fengfenggirl/p/iForest.html
《Python數據挖掘分析與挖掘實戰》 張良均 王路等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章