所謂的不平衡數據集指的是數據集各個類別的樣本量極不均衡。以二分類問題為例,假設正類的樣本數量遠大於負類的樣本數量,通常情況下通常情況下把多數類樣本的比例接近100:1這種情況下的數據稱為不平衡數據。不平衡數據的學習即需要在分布不均勻的數據集中學習到有用的信息。
本文主要介紹從數據角度出發的不平衡數據集的處理方法以及對應的python庫(imblearn)。
1.過采樣
從少數類的樣本中進行隨機采樣來增加新的樣本,對應Python庫中函數為RandomOverSampler:
from imblearn.over_sampling import RandomOverSampler
ROS = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ROS.fit_sample(X, y)
2.欠采樣
與過采樣相反,欠采樣是從多數類樣本中隨機選擇少量樣本,再合並原有少數類樣本作為新的訓練數據集。
隨機欠采樣有兩種類型分別為有放回和無放回兩種,無放回欠采樣在對多數類某樣本被采樣后不會再被重復采樣,有放回采樣則有可能。
對應Python庫中函數為RandomUnderSampler,通過設置RandomUnderSampler中的replacement=True參數, 可以實現自助法(boostrap)抽樣。
from imblearn.under_sampling import RandomUnderSampler
RUS = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = RUS.fit_sample(X, y)
3.SMOTE采樣
SMOTE算法的基本思想是對少數類樣本進行分析並根據少數類樣本人工合成新樣本添加到數據集中,具體下圖所示,算法流程如下:
1、對於少數類中每一個樣本x,計算該點與少數類中其他樣本點的距離,得到最近的k個近鄰(即對少數類點進行KNN算法)。
2、根據樣本不平衡比例設置一個采樣比例以確定采樣倍率,對於每一個少數類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為x'。
3、對於每一個隨機選出的近鄰x',分別與原樣本按照如下的公式構建新的樣本:
xnew=x+rand(0,1) ∗ (x′−x)
但是SMOTE算法缺點也十分明顯:一方面是增加了類之間重疊的可能性(由於對每個少數類樣本都生成新樣本,因此容易發生生成樣本重疊(Overlapping)的問題),
另一方面是生成一些沒有提供有益信息的樣本
對應Python庫中函數為SMOTE:
from imblearn.over_sampling import SMOTE
X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)