5種方法讓資料中的異常值統統現形(附Python程式碼)

數據分析那些事
11 min readFeb 6, 2023

--

下文選自towardsdatacience,作者:Will Badr,翻譯:顧偉嵩

無論是透過識別錯誤還是主動預防,檢測異常值對任何業務都是重要的。本文將討論五種檢測異常值的方法。

圖來源於Will Myers在Unsplash上的拍攝

什麼是異常值?

在統計學中,異常值是指不屬於某一特定群體的資料點。它是一個與其他數值大不相同的異常觀測值,與良好構成的資料組相背離。

例如,你可以清楚地看到這個列表裡的異常值:[20, 24, 22, 19, 29, 18, 4300, 30, 18].

當觀測值僅僅是一堆數字並且是一維時,很容易識別出異常值。但是,當你有成千上萬的觀測值或者是多維度時,你將需要更多巧妙的辦法來檢測出那些異常值。這就是本文要討論的內容。

為什麼我們要關注異常值?

檢測異常值是資料探勘中的核心問題之一。資料的不斷擴增和持續增長,以及物聯網裝置的普及,讓我們重新思考處理異常值的方法和觀測異常值構建出的用例。

現在,我們擁有可以檢測我們每分鐘心跳的智慧手錶和腕帶。檢測心跳資料的異常值有助於預防與心臟有關的疾病。交通模式中的異常值有助於預防交通事故。異常值檢測還可以用來識別伺服器之間的網路基礎設施和通訊的障礙。因此,建立在檢測異常值之上的用例和解決方案是無窮無盡的。

另一個我們需要檢測異常值的理由是,當為機器學習模型準備資料集時,檢測出所有的異常值,並且要麼移除它們、要麼分析它們來了解它們最初存在的原因是非常重要的。

現在,讓我們從最簡單的方法開始探索5種常用的檢測異常值的方法。

方法1 — — 標準差:

在統計學中,如果一個數據分散式近似正態分佈,那麼大約68%的資料值在平均值的前後一個標準差範圍內,大約95%的資料值在平均值的前後兩個標準差範圍內,大約99.7%的資料值在前後三個標準差的範圍內。

因此,如果你有任何出現在三個標準差範圍外的資料點,那麼那些點就極有可能是異常值。

讓我們看看程式碼。

import numpy as np
import matplotlib.pyplot as plt
seed(1)


# multiply and add by random numbers to get some real values
data = np.random.randn(50000) * 20 + 20

# Function to Detection Outlier on one-dimentional datasets.
def find_anomalies(data):
#define a list to accumlate anomalies
anomalies = []

# Set upper and lower limit to 3 standard deviation
random_data_std = std(random_data)
random_data_mean = mean(random_data)
anomaly_cut_off = random_data_std * 3

lower_limit = random_data_mean - anomaly_cut_off
upper_limit = random_data_mean + anomaly_cut_off
print(lower_limit)
# Generate outliers
for outlier in random_data:
if outlier > upper_limit or outlier < lower_limit:
anomalies.append(outlier)
return anomalies

find_anomalies(data)

這段程式碼的輸出結果是一個大於80或小於-40的資料列表。請注意,我傳入的資料集是一個一維資料集。現在,讓我們探索對於多維資料集的更高階的方法。

方法2 — — 箱線圖:

箱線圖是指透過分位數對數值型資料的圖形化描述。這是一種非常簡單但有效的異常值視覺化方法。把上下須觸線看作資料分佈的上下邊界。任何出現在下須觸線下面或上須觸線上面的資料點可以被看作異常值。下面是繪製箱線圖的程式碼:

import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(data=random_data)

上面的程式碼輸出如下的箱線圖。如你所見,它把大於75或小於-35的值看作異常值。這個結果非常接近上述的方法1得到的結果。

箱線圖分解:

四分位差的概念是被用來繪製詳細圖的。四分位差是統計學中透過將資料集劃分為四分位數來衡量統計離散度和資料可變性的概念。

簡而言之,任何資料集或任何觀察值的集合被劃分為四個基於資料值和它們與整個資料集比較後而定義的區間。四分位數是指將資料分為三個點和四個區間的資料點。

四分位差是重要的,因為它用於定義異常值。它是第三個四分位數和第一個四分位數的差(IQR=Q3-Q1). 這種情況下的異常值被定義為低於(Q1–1.5IQR)或低於箱線圖下須觸線或高於(Q3+1.5IQR)或高於箱線圖上須觸線的觀測值。

Source Wikipedia

方法3 — — DBScan叢集:

DBScan是一種用於將資料分組的叢集演算法。它也是一種被用於基於密度的對於一維或多維資料的異常檢測方法。其他的像k-均值和層次聚類的叢集演算法也可以用於檢測異常值。在本例中,我將向您展示一個使用DBScan的案例。但是在開始前,我們先介紹一些重要概念。DBScan有三個重要概念:

👉核心點:為了理解核心點,我們需要訪問一些用於定義DBScan工作的超引數。第一個超引數是最小值樣本(min_samples)。這只是形成集聚的核心點的最小數量。第二重要的超引數eps,它是兩個被視為在同一個簇中的樣本之間的最大距離。

👉邊界點:是與核心點在同一叢集的點,但是要離叢集中心遠得多。

Source:https://stackoverflow.com/questions/34394641/dbscan-clustering-what-happens-when-border-point-of-one-cluster-is-considered

👉其他的點被稱為噪聲點,那些資料點不屬於任何叢集。它們可能是異常點,可能是非異常點,需要進一步調查。現在讓我們看看程式碼。

from sklearn.cluster import DBSCAN
seed(1)
random_data = np.random.randn(50000,2) * 20 + 20

outlier_detection = DBSCAN(min_samples = 2, eps = 3)
clusters = outlier_detection.fit_predict(random_data)
list(clusters).count(-1)

上述程式碼的輸出值是94。這是噪聲點的總數。SKLearn將噪聲點標記為(-1)。這種方法的缺陷就是維數越高,精度越低。你還需要做出一些假設,比如估計eps的正確值,而這可能是有挑戰性的。

方法4 — — 孤立森林

孤立森林是一種無監督學習的演算法,屬於整合決策樹族。這種方法與前面的方法都不同。所有前面的方法是試圖找到資料的正常區域,然後將所定義區域外的任何值視為異常值。

這種方法的工作原理不同。它是明確的孤立異常值,而不是透過給每個點分配一個分數來構造正常的點和區域。它充分利用了這樣一個事實:異常值只佔資料的小部分,並且它們有與正常值大不相同的屬性。該演算法適用於高維資料集,並且被證實是一種非常有效的檢測異常值的方法。由於本文關注的是實現而不是專門知識,我將不深入探討演算法的工作原理。但是,這篇文章中涵蓋了它的所有工作原理細節。

https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf

現在,讓我們探索程式碼:

from sklearn.ensemble import IsolationForest
import numpy as np
np.random.seed(1)
random_data = np.random.randn(50000,2) * 20 + 20

clf = IsolationForest( behaviour = 'new', max_samples=100, random_state = 1, contamination= 'auto')
preds = clf.fit_predict(random_data)
preds

該程式碼將輸出陣列中每個資料點的預測值。如果結果是-1,那意味著這個特定的資料點是一個異常值。如果結果是1,那麼意味著該資料點不是異常值。

方法5 — — Robust Random Cut Forest

Robust Random Cut Forest演算法是亞馬遜用於檢測異常值的無監督演算法。它也透過關聯異常分數來工作。低的分數值表示資料點是“正常的”,高的值表示資料中存在異常。“低”和“高”的定義取決於應用,但是一般實踐表明,超過平均值三個標準差的分數被認為是異常的。演算法的細節可以在這篇文章中找到。

這個演算法的最大優勢是它可以處理非常高維的資料。它還可以處理實時資料流(內建AWS Kinesis Analytics)和離線資料。

如下的影片裡更加詳細的解釋了這個概念:

該演算法的論文給出了一些與孤立森林相比較的效能標準。論文結果表明,RCF比孤立森林更加準確和快速。

完整的案例程式碼可以在這裡找到。

結論

我們生活在一個數據每分每秒都在劇增的世界裡。資料如果使用不當便會隨著時間貶值。於線上資料流或離線資料集中發現異常值,對於識別商業中的問題或主動構建解決方案以在問題發生之前發現潛在的問題,或者甚至在探索性資料分析(EDA)階段為ML準備資料集都是至關重要的。

文章來源:數據派THU
文章連結:https://mp.weixin.qq.com/s/1sZZgHK9nvs6-ejkRUnsqg

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

餅圖變形記,肝了3000字,收藏就是學會!

MySQL必須掌握4種語言!

太實用了!4種方法教你輕鬆製作互動式儀表板!

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

妙呀!一行Python程式碼

回顧十週入門數據分析系列文:

關注數據君的臉書:

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!

--

--

數據分析那些事
數據分析那些事

Written by 數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

No responses yet