MaDi's Blog

一個紀錄自己在轉職軟體工程師路上的學習小空間

0%

ML/DL 資料前處理

前言

在利用機器學習或是深度學習去解決問題的過程中,資料前處理是極為重要的一步,常用的方法是 探索式資料分析 (Exploratory Data Analysis, EDA)

資料不平衡(類別不平衡)

在分類的問題中,類別不平衡是一個常見的問題。代表 資料集裏頭類別的不均勻分佈。

解決方法有以下幾種:

1. 重採樣

A. 欠採樣(Under-sampling): 剔除資料

隨機刪除一些多數量的類別資料,使多數類的資料數量和少數類的資料數量相符。

B. 過採樣(Over-sampling): 生成資料

是一個生成資料的過程,學習少數類的資料特徵來隨機的生成新的少數類資料。 在分類問題中,常會採用這個方法,最常用的技術是 SMOTE (Synthetic Minority Over-sampling Technique)

在資料的特徵空間中,依據隨機選擇的一個最鄰近資料來隨機合成新資料。

詳細流程參考此篇,在Python裏頭,有一個套件叫imblearn可以輔助完成這項需求。

官方imblearn用法

1
2
3
4
from imblearn.over_sampling import SMOTE

sm = SMOTE(sampling_strategy='minority', random_state=87)
X_res, Y_res = sm.fit_sample(X_train, Y_train)

2. 考量邊界樣本的採樣方法

前述方法其實有缺點,並不是全部的少數資料都是需要進行過採樣,那些落在多數樣本與少數樣本邊界地帶的邊界樣本,才是真正需要進行過採樣的對象。

白說來說,真正失去鑑別度的其實只有與多數樣本混在一起的少數樣本,姑且稱之為邊界樣本。

為了解決這項問題,有以下幾種方法修正:

A. Border Line SMOTE:

簡單敘述概念,第一步是從全部樣本點去找他們的鄰近點,再去計算每個鄰近點裏頭,少數樣本佔鄰近點的比例,並設定一個閥值(alpha)來決定哪些是真正的邊界樣本。

1
X_res, Y_res = BorderlineSMOTE(random_state=87, kind='borderline').fit_resample(X_train, Y_train)

因為需要調參,所以實務上仍然使用傳統的SMOTE就好。

簡單敘述概念,Tomek Link會針對所有樣本去遍歷一次,假設現在有兩個資料點,一個是多數樣本,一個是少數樣本,接著計算兩個樣本之間的距離d,此時如果找不到第三個點與這兩個資料點的距離都小於d,就稱他為Tomek Link。

概念上仍然是剔除邊界模稜兩可的樣本,剔除之後就可以更好的區分兩種樣本。

1
2
3
from imblearn.under_sampling import TomekLinks

X_res, Y_res = TomekLinks().fit_resample(X_train, Y_train)

C. ENN:

與Tomek Link相似的方法還有ENN 算法(Edited Nearest Neighbor)**,概念上與Tomek Link相同,僅差在他是對多數類**進行k鄰近法搜尋。

3. 集成方法(Ensemble)

機器學習中,透過類似民主投票的概念,將多種演算法集結起來,讓模型的表現比單靠一種演算法來的更好,就是集成方法的核心思維。

最常用的方法是bagging,概念是透過建立很多個classifier在隨機選擇的不同資料集上進行訓練。

sklearn裏頭有BaggingClassifier的集成分類器,然而這個分類器不能訓練不平衡資料集。當訓練不平衡資料集時,這個分類器將會偏向多數類,從而創建一個有偏差的模型。

因此我們可以透過imblearn套件裏頭的BalancedBaggingClassifier這個分類器。協助我們在訓練ensemble classifier中每個子分類器之前對每個子資料集進行重採樣。

1
2
3
4
5
6
7
8
9
from imblearn.ensemble import BalancedBaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bbc = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(),
sampling_strategy='auto',
replacement=False,
random_state=0)
bbc.fit(X_train, y_train)
preds = bbc.predict(X_train)

4. 不平衡數據集分類建模流程

Step1. train/test資料集分割

確保train/test的分佈一致

Step2. 觀察資料

觀察資料是否有正負樣本不平均的問題

Step3. 重新抽樣(本文重點)

過採樣or欠採樣

Step4. 建模並交叉驗證

用cross-validation去檢查overfitting的程度,若嚴重則重新抽樣or換模型

注意:

  1. 不能先採樣再切分,否則採樣過程會產生很多錯誤的虛擬樣本,導致模型學壞
  2. 檢查模型好壞的時候,cross-validation是必要的,因為任何一種採樣方式都會增加overfitting的程度
  3. 當資料本身分佈有問題,就不要考慮過多的採樣問題,先檢查data

參考