資料預處理(Data Preprocessing)的工作之一,是要找出資料集裡頭的離群值,因為離群值(Outliers)對於一些資料分析演算法,具有重大的影響。本次文章要來探討關於尋找離群值的注意事項。
一、離群值
離群值是指跟大部份資料差異很大的樣本。比如,在國民收入的資料當中,少數富豪的資料就很像離群值。離群值對於一些資料分析方法會有很大的影響,圖一是 2 個線性模型的分析結果,可以發現右圖只是增加一個離群值,分析出來的結果就差很多。
因此,沒有好好處理離群值,對資料分析的結果,有可能影響會很大。
二、直方圖跟散佈圖能看出離群值?
查看資料中是否有離群值,常見的方法是使用直方圖(Histogram)畫出特徵的分佈。圖二是 1 個特徵分佈,看起來確實存在離群值。
接下來我們來看另一個含有 2 個特徵的資料集,圖三是將特徵的分佈畫出來的結果。各位讀者覺得此資料集有沒有離群值?
看起來好像沒有離群值...很不幸地這次錯了,此資料集很明顯地含有離群值,只是用直方圖看不出來。有些時候,離群值是要同時比對數個特徵,才有辦法觀察出來。因此,我們改用散佈圖(Scatter Plot)來呈現這個資料集,結果如圖四。
右上角有 2 筆資料,跟其他資料很不同,所以確定是離群值。同時觀察 2 個特徵,才有辦法看出離群值。但是,如果資料集含有 3 個特徵,難道要畫出立體散佈圖來觀察離群值嗎?那如果資料集含有 4 個特徵呢?這時候連圖都畫不出來了怎麼辦?
三、使用 DBSCAN 來找離群值
DBSCAN 是分群(Clustering)演算法,這個方法是透過比較資料之間的距離,來判定哪些資料是同一群。另一個常見的分群演算法是 K-Means,這是透過比較資料跟資料中心的距離,來判定哪些資料是同一群。由於我們是要找「是否有些資料跟其他資料很不同」,因此 DBSCAN 比較適合。
以下範例程式中,我們使用Python內建的 DBSCAN 函式,來嘗試抓出圖四右上角的 2 筆離群值。
colors = ['red','blue']
data = np.array([x, y]).T
model = DBSCAN(eps = 0.5,
min_samples = 1,
leaf_size = 1).fit(data)
plt.figure()
plt.scatter(x,
y,
c = model.labels_,
cmap = matplotlib.colors.ListedColormap(colors))
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Scatter Plot of Feature X and Y")
plt.show()
畫出來的結果如圖五,可以看見右上角的 2 筆資料,跟其他資料,被分在不同的群組中。透過 DBSCAN 演算法,我們就可以找出多特徵的資料集裡頭,是否含有離群值。
關於作者
Chia-Hao Li received the M.S. degree in computer science from Durham University, United Kingdom. He engages in computer algorithm, machine learning, and hardware/software codesign. He was former senior engineer in Mediatek, Taiwan. His currently research topic is the application of machine learning techniques for fault detection in the high-performance computing systems.