【轉】R語言異常檢測處理

看到一篇乾貨,感謝作者以及分享者,現與大家分享,轉自http://youhaolin.blog.163.com/blog/static/224494120201422110628586/

本文結合R語言,展示了異常檢測的案例,主要內容如下:

(1)單變量的異常檢測

(2)使用LOF(local outlier factor,局部異常因子)進行異常檢測

(3)通過聚類進行異常檢測

(4)對時間序列進行異常檢測

單變量異常檢測

本部分展示了一個單變量異常檢測的例子,並且演示瞭如何將這種方法應用在多元數據上。在該例中,單變量異常檢測通過boxplot.stats()函數實現,並且返回產生箱線圖的統計量。在返回的結果中,有一個部分是out,它結出了異常值的列表。更明確點,它列出了位於極值之外的鬍鬚。參數coef可以控制鬍鬚延伸到箱線圖外的遠近。在R中,運行?boxplot.stats可獲取更詳細的信息。

如圖呈現了一個箱線圖,其中有四個圈是異常值。

如上的單變量異常檢測可以用來發現多元數據中的異常值,通過簡單搭配的方式。在下例中,我們首先產生一個數據框df,它有兩列x和y。之後,異常值分別從x和y檢測出來。然後,我們獲取兩列都是異常值的數據作爲異常數據。

在下圖中,異常值用紅色標記爲"+"

類似的,我們也可以將x或y爲異常值的數據標記爲異常值。下圖,異常值用'x'標記爲藍色。

當有三個以上的變量時,最終的異常值需要考慮單變量異常檢測結果的多數表決。當選擇最佳方式在真實應用中進行搭配時,需要涉及領域知識。

 

使用LOF(local outlier factor,局部異常因子)進行異常檢測

LOF(局部異常因子)是用於識別基於密度的局部異常值的算法。使用LOF,一個點的局部密度會與它的鄰居進行比較。如果前者明顯低於後者(有一個大於1 的LOF值),該點位於一個稀疏區域,對於它的鄰居而言,這就表明,該點是一個異常值。LOF的缺點就是它只對數值數據有效。

lofactor()函數使用LOF算法計算局部異常因子,並且它在DMwR和dprep包中是可用的。下面將介紹一個使用LOF進行異常檢測的例子,k是用於計算局部異常因子的鄰居數量。下圖呈現了一個異常值得分的密度圖。

 

接着,我們結合前兩個主成份的雙標圖呈現異常值。

在如上代碼中,prcomp()執行了一個主成分分析,並且biplot()使用前兩個主成分畫出了這些數據。在上圖中,x和y軸分別代表第一和第二個主成份,箭頭表示了變量,5個異常值用它們的行號標記出來了。

我們也可以如下使用pairsPlot顯示異常值,這裏的異常值用"+"標記爲紅色。

Rlof包,對LOF算法的並行實現。它的用法與lofactor()相似,但是lof()有兩個附加的特性,即支持k的多元值和距離度量的幾種選擇。如下是lof()的一個例子。在計算異常值得分後,異常值可以通過選擇前幾個檢測出來。注意,目前包Rlof的版本在MacOS X和Linux環境下工作,但並不在windows環境下工作,因爲它要依賴multicore包用於並行計算。

通過聚類進行異常檢測

 

另外一種異常檢測的方法是聚類。通過把數據聚成類,將那些不屬於任務一類的數據作爲異常值。比如,使用基於密度的聚類DBSCAN,如果對象在稠密區域緊密相連,它們將被分組到一類。因此,那些不會被分到任何一類的對象就是異常值。

 

我們也可以使用k-means算法來檢測異常。使用k-means算法,數據被分成k組,通過把它們分配到最近的聚類中心。然後,我們能夠計算每個對象到聚類中心的距離(或相似性),並且選擇最大的距離作爲異常值。

如下是一個基於k-means算法在iris數據上實現在異常檢測。

 

在上圖中,聚類中心被標記爲星號,異常值標記爲'+'

對時間序列進行異常檢測

本部分講述一個對時間序列數據進行異常檢測的例子。在本例中,時間序列數據首次使用stl()進行穩健迴歸分解,然後識別異常值。STL的介紹,請訪問 http://cs.wellesley.edu/~cs315/Papers/stl%20statistical%20model.pdf.

 

在上圖中,異常值用紅色標記爲'x'

討論

LOF算法擅長檢測局部異常值,但是它只對數值數據有效。Rlof包依賴multicore包,在Windows環境下失效。對於分類數據的一個快速穩定的異常檢測的策略是AVF(Attribute Value Frequency)算法。

一些用於異常檢測的R包包括:

extremevalues包:單變量異常檢測

mvoutlier包:基於穩定方法的多元變量異常檢測

outliers包:對異常值進行測驗

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