【Python數據分析基礎】: 異常值檢測和處理

做者:xiaoyuhtml

微信公衆號:Python數據科學python

知乎:python數據分析師算法



上一篇分享了關於數據缺失值處理的一些方法,連接以下:
【Python數據分析基礎】: 數據缺失值處理微信

本篇繼續分享數據清洗中的另外一個常見問題:異常值檢測和處理。網絡

1 什麼是異常值?

在機器學習中,異常檢測和處理是一個比較小的分支,或者說,是機器學習的一個副產物,由於在通常的預測問題中,模型一般是對總體樣本數據結構的一種表達方式,這種表達方式一般抓住的是總體樣本通常性的性質,而那些在這些性質上表現徹底與總體樣本不一致的點,咱們就稱其爲異常點,一般異常點在預測問題中是不受開發者歡迎的,由於預測問題通產關注的是總體樣本的性質,而異常點的生成機制與總體樣本徹底不一致,若是算法對異常點敏感,那麼生成的模型並不能對總體樣本有一個較好的表達,從而預測也會不許確。
從另外一方面來講,異常點在某些場景下反而令分析者感到極大興趣,如疾病預測,一般健康人的身體指標在某些維度上是類似,若是一我的的身體指標出現了異常,那麼他的身體狀況在某些方面確定發生了改變,固然這種改變並不必定是由疾病引發(一般被稱爲噪音點),但異常的發生和檢測是疾病預測一個重要起始點。類似的場景也能夠應用到信用欺詐,網絡攻擊等等。數據結構

2 異常值的檢測方法

通常異常值的檢測方法有基於統計的方法,基於聚類的方法,以及一些專門檢測異常值的方法等,下面對這些方法進行相關的介紹。機器學習

1. 簡單統計

若是使用pandas,咱們能夠直接使用describe()來觀察數據的統計性描述(只是粗略的觀察一些統計量),不過統計數據爲連續型的,以下:學習

df.describe()

或者簡單使用散點圖也能很清晰的觀察到異常值的存在。以下所示:大數據

2. 3∂原則

這個原則有個條件:數據須要服從正態分佈。在3∂原則下,異常值如超過3倍標準差,那麼能夠將其視爲異常值。正負3∂的機率是99.7%,那麼距離平均值3∂以外的值出現的機率爲P(|x-u| > 3∂) <= 0.003,屬於極個別的小几率事件。若是數據不服從正態分佈,也能夠用遠離平均值的多少倍標準差來描述。spa

紅色箭頭所指就是異常值。

3. 箱型圖

這種方法是利用箱型圖的四分位距(IQR)對異常值進行檢測,也叫Tukey‘s test。箱型圖的定義以下:

四分位距(IQR)就是上四分位與下四分位的差值。而咱們經過IQR的1.5倍爲標準,規定:超過上四分位+1.5倍IQR距離,或者下四分位-1.5倍IQR距離的點爲異常值。下面是Python中的代碼實現,主要使用了numpypercentile方法。

Percentile = np.percentile(df['length'],[0,25,50,75,100])
IQR = Percentile[3] - Percentile[1]
UpLimit = Percentile[3]+ageIQR*1.5
DownLimit = Percentile[1]-ageIQR*1.5

也可使用seaborn的可視化方法boxplot來實現:

f,ax=plt.subplots(figsize=(10,8))
sns.boxplot(y='length',data=df,ax=ax)
plt.show()

紅色箭頭所指就是異常值。

以上是經常使用到的判斷異常值的簡單方法。下面來介紹一些較爲複雜的檢測異常值算法,因爲涉及內容較多,僅介紹核心思想,感興趣的朋友可自行深刻研究。

4. 基於模型檢測

這種方法通常會構建一個機率分佈模型,並計算對象符合該模型的機率,把具備低機率的對象視爲異常點。若是模型是簇的集合,則異常是不顯著屬於任何簇的對象;若是模型是迴歸時,異常是相對遠離預測值的對象。

離羣點的機率定義:離羣點是一個對象,關於數據的機率分佈模型,它具備低機率。這種狀況的前提是必須知道數據集服從什麼分佈,若是估計錯誤就形成了重尾分佈。

好比特徵工程中的RobustScaler方法,在作數據特徵值縮放的時候,它會利用數據特徵的分位數分佈,將數據根據分位數劃分爲多段,只取中間段來作縮放,好比只取25%分位數到75%分位數的數據作縮放。這樣減少了異常數據的影響。

優缺點:(1)有堅實的統計學理論基礎,當存在充分的數據和所用的檢驗類型的知識時,這些檢驗可能很是有效;(2)對於多元數據,可用的選擇少一些,而且對於高維數據,這些檢測可能性不好。

5. 基於近鄰度的離羣點檢測

統計方法是利用數據的分佈來觀察異常值,一些方法甚至須要一些分佈條件,而在實際中數據的分佈很難達到一些假設條件,在使用上有必定的侷限性。

肯定數據集的有意義的鄰近性度量比肯定它的統計分佈更容易。這種方法比統計學方法更通常、更容易使用,由於一個對象的離羣點得分由到它的k-最近鄰(KNN)的距離給定。

須要注意的是:離羣點得分對k的取值高度敏感。若是k過小,則少許的鄰近離羣點可能致使較低的離羣點得分;若是K太大,則點數少於k的簇中全部的對象可能都成了離羣點。爲了使該方案對於k的選取更具備魯棒性,可使用k個最近鄰的平均距離。

優缺點:(1)簡單;(2)缺點:基於鄰近度的方法須要O(m2)時間,大數據集不適用;(3)該方法對參數的選擇也是敏感的;(4)不能處理具備不一樣密度區域的數據集,由於它使用全局閾值,不能考慮這種密度的變化。

5. 基於密度的離羣點檢測

從基於密度的觀點來講,離羣點是在低密度區域中的對象。基於密度的離羣點檢測與基於鄰近度的離羣點檢測密切相關,由於密度一般用鄰近度定義。一種經常使用的定義密度的方法是,定義密度爲到k個最近鄰的平均距離的倒數。若是該距離小,則密度高,反之亦然。另外一種密度定義是使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等於該對象指定距離d內對象的個數。

優缺點:(1)給出了對象是離羣點的定量度量,而且即便數據具備不一樣的區域也可以很好的處理;(2)與基於距離的方法同樣,這些方法必然具備O(m2)的時間複雜度。對於低維數據使用特定的數據結構能夠達到O(mlogm);(3)參數選擇是困難的。雖然LOF算法經過觀察不一樣的k值,而後取得最大離羣點得分來處理該問題,可是,仍然須要選擇這些值的上下界。

6. 基於聚類的方法來作異常點檢測

基於聚類的離羣點:一個對象是基於聚類的離羣點,若是該對象不強屬於任何簇,那麼該對象屬於離羣點。

離羣點對初始聚類的影響:若是經過聚類檢測離羣點,則因爲離羣點影響聚類,存在一個問題:結構是否有效。這也是k-means算法的缺點,對離羣點敏感。爲了處理該問題,可使用以下方法:對象聚類,刪除離羣點,對象再次聚類(這個不能保證產生最優結果)。

優缺點:(1)基於線性和接近線性複雜度(k均值)的聚類技術來發現離羣點多是高度有效的;(2)簇的定義一般是離羣點的補,所以可能同時發現簇和離羣點;(3)產生的離羣點集和它們的得分可能很是依賴所用的簇的個數和數據中離羣點的存在性;(4)聚類算法產生的簇的質量對該算法產生的離羣點的質量影響很是大。

7. 專門的離羣點檢測

其實以上說到聚類方法的本意是是無監督分類,並非爲了尋找離羣點的,只是剛好它的功能能夠實現離羣點的檢測,算是一個衍生的功能。

除了以上說起的方法,還有兩個專門用於檢測異常點的方法比較經常使用:One Class SVMIsolation Forest,詳細內容不進行深刻研究。

3 異常值的處理方法

檢測到了異常值,咱們須要對其進行必定的處理。而通常異常值的處理方法可大體分爲如下幾種:

  • 刪除含有異常值的記錄:直接將含有異常值的記錄刪除;
  • 視爲缺失值:將異常值視爲缺失值,利用缺失值處理的方法進行處理;
  • 平均值修正:可用先後兩個觀測值的平均值修正該異常值;
  • 不處理:直接在具備異常值的數據集上進行數據挖掘;

是否要刪除異常值可根據實際狀況考慮。由於一些模型對異常值不很敏感,即便有異常值也不影響模型效果,可是一些模型好比邏輯迴歸LR對異常值很敏感,若是不進行處理,可能會出現過擬合等很是差的效果。

4 異常值總結

以上是對異常值檢測和處理方法的彙總。

經過一些檢測方法咱們能夠找到異常值,但所得結果並非絕對正確的,具體狀況還需本身根據業務的理解加以判斷。一樣,對於異常值如何處理,是該刪除,修正,仍是不處理也需結合實際狀況考慮,沒有固定的。

參考:

https://zhuanlan.zhihu.com/p/...
http://www.cnblogs.com/pinard...
https://blog.csdn.net/u013719...
http://www.cnblogs.com/charlo...

《Python數據分析與挖掘實戰》

關注微信公衆號:Python數據科學,發現更多精彩內容。

相關文章
相關標籤/搜索