前言
在利用機器學習或是深度學習去解決問題的過程中,資料前處理是極為重要的一步,常用的方法是 探索式資料分析 (Exploratory Data Analysis, EDA) 。
資料不平衡(類別不平衡)
在分類的問題中,類別不平衡是一個常見的問題。代表 資料集裏頭類別的不均勻分佈。
解決方法有以下幾種:
1. 重採樣
A. 欠採樣(Under-sampling): 剔除資料
隨機刪除一些多數量的類別資料,使多數類的資料數量和少數類的資料數量相符。
B. 過採樣(Over-sampling): 生成資料
是一個生成資料的過程,學習少數類的資料特徵來隨機的生成新的少數類資料。 在分類問題中,常會採用這個方法,最常用的技術是 SMOTE (Synthetic Minority Over-sampling Technique)。
在資料的特徵空間中,依據隨機選擇的一個最鄰近資料來隨機合成新資料。
詳細流程參考此篇,在Python裏頭,有一個套件叫imblearn
可以輔助完成這項需求。
1 | from imblearn.over_sampling import SMOTE |
2. 考量邊界樣本的採樣方法
前述方法其實有缺點,並不是全部的少數資料都是需要進行過採樣,那些落在多數樣本與少數樣本邊界地帶的邊界樣本,才是真正需要進行過採樣的對象。
白說來說,真正失去鑑別度的其實只有與多數樣本混在一起的少數樣本,姑且稱之為邊界樣本。
為了解決這項問題,有以下幾種方法修正:
A. Border Line SMOTE:
簡單敘述概念,第一步是從全部樣本點去找他們的鄰近點,再去計算每個鄰近點裏頭,少數樣本佔鄰近點的比例,並設定一個閥值(alpha)來決定哪些是真正的邊界樣本。
1 | X_res, Y_res = BorderlineSMOTE(random_state=87, kind='borderline').fit_resample(X_train, Y_train) |
因為需要調參,所以實務上仍然使用傳統的SMOTE就好。
B. Tomek Link:
簡單敘述概念,Tomek Link會針對所有樣本去遍歷一次,假設現在有兩個資料點,一個是多數樣本,一個是少數樣本,接著計算兩個樣本之間的距離d,此時如果找不到第三個點與這兩個資料點的距離都小於d,就稱他為Tomek Link。
概念上仍然是剔除邊界模稜兩可的樣本,剔除之後就可以更好的區分兩種樣本。
1 | from imblearn.under_sampling import TomekLinks |
C. ENN:
與Tomek Link相似的方法還有ENN 算法(Edited Nearest Neighbor)**,概念上與Tomek Link相同,僅差在他是對多數類**進行k鄰近法搜尋。
3. 集成方法(Ensemble)
機器學習中,透過類似民主投票的概念,將多種演算法集結起來,讓模型的表現比單靠一種演算法來的更好,就是集成方法的核心思維。
最常用的方法是
bagging
,概念是透過建立很多個classifier在隨機選擇的不同資料集上進行訓練。
sklearn裏頭有BaggingClassifier
的集成分類器,然而這個分類器不能訓練不平衡資料集。當訓練不平衡資料集時,這個分類器將會偏向多數類,從而創建一個有偏差的模型。
因此我們可以透過imblearn套件裏頭的BalancedBaggingClassifier
這個分類器。協助我們在訓練ensemble classifier中每個子分類器之前對每個子資料集進行重採樣。
1 | from imblearn.ensemble import BalancedBaggingClassifier |
4. 不平衡數據集分類建模流程
Step1. train/test資料集分割
確保train/test的分佈一致
Step2. 觀察資料
觀察資料是否有正負樣本不平均的問題
Step3. 重新抽樣(本文重點)
過採樣or欠採樣
Step4. 建模並交叉驗證
用cross-validation去檢查overfitting的程度,若嚴重則重新抽樣or換模型
注意:
- 不能先採樣再切分,否則採樣過程會產生很多錯誤的虛擬樣本,導致模型學壞
- 檢查模型好壞的時候,cross-validation是必要的,因為任何一種採樣方式都會增加overfitting的程度
- 當資料本身分佈有問題,就不要考慮過多的採樣問題,先檢查data