天天看點

異常值檢測(Outlier Detection)

什麼是異常值?

對于定性變量來說,異常值是出現次數非常少的類别;對于定量變量來說,異常值是明顯大于或小于其他觀測值的數值。

異常值産生的原因: a. 人為錯誤:在資料收集,記錄或輸入過程中導緻的錯誤。

                                 b. 測量誤差: 當使用的測量儀器出現故障時,會引起這種情況,這是異常值最常見的來源。

                                 c. 實驗誤差 

                                 d. 資料處理錯誤:某些操作或提取錯誤。

                                 e. 抽樣錯誤

                                 f. 自然異常值:不是人為的(由于錯誤)導緻的。

異常值的類型:

單變量(Univariate)

多變量(Multivariate)

異常值檢測:

單變量:

1. 使用pandas的 

describe()

 方法來檢視資料的描述統計量。

2. 使用各種可視化方法,如Box plot。

3. 用四分位數檢測。任何超出Q1-1.5 x IQR~Q3+1.5 x IQR範圍的數值都可以被認為是異常值。可以使用 

numpy

 的 

percentile()

 方法。

4. 用z值(标準差)檢測。如果資料服從正态分布,那麼距離平均數3個标準差及以上的數值被認為是異常值。

多變量:

1,基于模型的檢測

這種方法一般會建構一個機率分布模型 ,并計算對象符合該模型的機率,把具有低機率的對象視為異常點。如果模型是簇的集合,則異常是不顯著屬于任何簇的對象;如果模型是回歸時,異常是相對遠離預測值的對象。

2,基于近鄰的檢測

确定資料集的有意義的鄰近性度量比确定它的統計分布更容易。這種方法比統計學方法更一般、更容易使用,因為 一個對象的異常點得分由到它的k-最近鄰(KNN)的距離給定。

需要注意的是:異常點得分對k的取值高度敏感。如果k太小,則少量的鄰近異常點可能導緻較低的異常點得分;如果K太大,則點數少于k的簇中所有的對象可能都成了異常點。為了使該方案對于k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。

3,基于密度的檢測

從基于密度的觀點來說,異常點是在低密度區域中的對象。基于密度的離群點檢測與基于鄰近度的離群點檢測密切相關,因為密度通常用鄰近度定義。 一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。 另一種密度定義是 使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等于該對象指定距離d内對象的個數。

4,基于距離的檢測

原理:計算每個點與中心點的距離,距離較遠的可判斷為異常點。

計算距離的公式有很多,我們這裡采用馬氏距離。

Python實作:

from scipy.spatial import distance
def func_mahalanobis(df,n_outliers):
    #n_outliers:異常值的個數,df:Dataframe
    
    #計算出異常值所對應的索引,越靠前的越異常
    m_dist_order = pd.Series([float(distance.mahalanobis(df.iloc[i], df.mean(), np.mat(df.cov().as_matrix()).I) ** 2)
    for i in range(len(df))]).sort_values(ascending=False).index.tolist()
    
    #假設n_outliers =2,說明你認為有2個異常,然後篩選出來
    error_index = m_dist_order[:n_outliers]
    error = df.iloc[error_index]
    return error      

5. 專門的異常點檢測

有兩個專門用于檢測異常點的方法: 

One Class SVM

 和 

Isolation Forest

 。

異常值的處理:

1,删除含有異常值的記錄:适用于資料輸入錯誤,異常值資料非常少的情況。

2,變量轉換:比如取自然對數,進行分箱。

3,插值:用平均值,中位數或衆數替換。

4,封頂:對于那些取值超過1.5倍四分位距的數值,可以分别用該變量5%和95%的分位數替代原資料。

5,預測:将異常值先替換為缺失值,再将其視作被解釋變量進行預測。

6,不處理。異常值可能是欺詐檢測中有價值的資訊來源,某天某産品的銷售額異常高,這時通常需要把會把離群值拿出來,單獨做文字說明。用估值代替或删除不是一個好主意。