現實中,樣本(類別)樣本不平衡(class-imbalance)是一種常見的現象,如:金融欺詐交易檢測,欺詐交易的訂單樣本通常是占總交易數量的極少部分,而且對于有些任務而言少數樣本更為重要。一般地,樣本類別比例(Imbalance Ratio)(多數類vs少數類)嚴重不平衡時,分類算法將開始做出有利于多數類的預測。
一文解決樣本不均衡(全)
數據抽樣
隨機抽樣(random sampling)在機器學習領域,是很常見的做法。例如,將原始數據集隨機分為訓練集和測試集。常用的抽樣方法有無放回抽樣和有放回抽樣。
針對非平衡的數據集,為了使得模型在這個數據集上學習的效果更加好,通過減少分類中多數類樣本的數量(欠采樣)或者增加分類中少數類樣本的數量(過采樣),來實現樣本均衡。
過采樣(over sampling)和欠采樣(under sampling)也叫做上采樣和下采樣。
SMOTE是一種合成少數類過采樣技術,主要策略為
- 首先,對每個少數類樣本 x i \mathbf x_i xi?,從它的最近鄰中隨機選 k k k 個樣本;
- 然后,在 x i \mathbf x_i xi?和近鄰樣本之間的連線上隨機選一點作為新合成的少數類樣本。
除了常用的smote之外,還有自適應合成采樣,比如Borderline-SMOTE、Adaptive Synthetic Sampling(ADA-SYN)等,都包含在 imblearn Python 庫中。
數據增強
數據增強(Data Augmentation)是指從原始數據中加工出更多的數據表示,提高原數據的數量和質量,從而提高模型的學習效果。
基于樣本變換的數據增強
- 單樣本增強:主要用于圖像,比如幾何操作、顏色變換、隨機查出、剪切旋轉等等,可參見imgaug開源庫。
- 多樣本增強:是指通過組合及轉換多個樣本的方式,比如剛剛提到的smote,還有SamplePairing、Mixup等方法在特征空間內構造已知樣本的鄰域值樣本。
基于深度學習的數據增強
生成模型,如變分自編碼網絡(VAE)和生成生成對抗網絡(GAN),其生成樣本的方法也可以用于數據增強,這種基于網絡合成的方法相比于傳統的數據增強技術雖然過程復雜,但是生成的樣本更加多樣。
損失函數
損失函數層面的主流就是常用的代價敏感(cost-sensitive)學習,為不同的分類錯誤給予不同懲罰力度(權重),在調解類別平衡的同時,也不會增加計算復雜度。即對少數類樣本給更大的權重系數,對多數類樣本給更小的權重系數,通過這種方式可以在一定程度上解決樣本不均衡的問題。
class weight 可以為不同類別的樣本提供不同的權重,少數類的樣本有更高的權重,從而模型可以平衡各類別的學習。如sklearn提供的class_weight參數,可以作為超參調試,避免決策邊界偏重多數類的現象。
OHEM(Online Hard Example Mining)算法的核心是選擇一些難樣本(多樣性和高損失的樣本)作為訓練的樣本,針對性地改善模型學習效果。對于數據的類別不平衡問題,OHEM的針對性更強。
Focal loss的核心思想是在交叉熵損失函數(CE)的基礎上增加了類別的不同權重以及困難(高損失)樣本的權重(如下公式),以改善模型學習效果。
Focal Loss的核心思想是在交叉熵損失函數(CE)的基礎上增加了類別的不同權重以及困難(高損失)樣本的權重,以改善模型學習效果。
對于二元分類問題,交叉熵(cross entropy)損失函數定義為
CE ( p t ) = ? log ? p t \text{CE}(p_t)=-\log p_t CE(pt?)=?logpt?
其中 P t P_t Pt? 為正樣本概率函數,用來簡化公式:
p t = { p if? y = 1 1 ? p otherwise p_t=\begin{cases} p & \text{if } y=1 \\ 1-p & \text{otherwise} \end{cases} pt?={p1?p?if?y=1otherwise?
Focal Loss 函數定義如下:
FL ( p t ) = ? a t ( 1 ? p t ) γ log ? p t \text{FL}(p_t)=-a_t(1-p_t)^{\gamma}\log p_t FL(pt?)=?at?(1?pt?)γlogpt?
其中權重因子 a t a_t at? 根據正負樣本的分布設置,用來平衡損失函數分布
a t = { a if? y = 1 1 ? a otherwise a_t=\begin{cases} a & \text{if } y=1 \\ 1-a & \text{otherwise} \end{cases} at?={a1?a?if?y=1otherwise?
( 1 ? p t ) γ (1-p_t)^{\gamma} (1?pt?)γ 稱為調制因子(modulating factor),
分解開來
FL ( p t ) = a t ( 1 ? p t ) γ CE ( p t ) = { ? a ( 1 ? p ) γ log ? p if? y = 1 ? ( 1 ? a ) p γ log ? ( 1 ? p ) otherwise \text{FL}(p_t)=a_t(1-p_t)^{\gamma}\text{CE}(p_t) =\begin{cases} -a(1-p)^{\gamma}\log p & \text{if }y=1 \\ -(1-a)p^{\gamma}\log(1-p) & \text{otherwise} \end{cases} FL(pt?)=at?(1?pt?)γCE(pt?)={?a(1?p)γlogp?(1?a)pγlog(1?p)?if?y=1otherwise?
調制因子減少了易于分類(概率高)的樣本的貢獻。
- 當 p t → 0 p_t\to 0 pt?→0 的時候,調制因子趨于1,對于總的loss的貢獻很大。當 p t → 1 p_t\to 1 pt?→1的時候,調制因子趨于0,也就是對于總的loss的貢獻很小。
- 當 γ = 0 \gamma=0 γ=0 的時候,focal loss就是傳統的交叉熵損失,可以通過調整 γ \gamma γ 實現調制因子的改變。
引用作者的話:當 γ = 2 \gamma=2 γ=2 時,與 CE 相比,分類為 p t = 0.9 p_t = 0.9 pt?=0.9 的示例的損失將降低 100 倍,而當 p t ≈ 0.968 p_t ≈ 0.968 pt?≈0.968 時,其損失將降低 1000 倍。減少易于分類的示例的損失,可以讓訓練更多地關注難以分類的示例。

模型層面
解決不均衡問題,更為優秀的是基于采樣+集成樹模型等方法,可以在類別不均衡數據上表現良好。采樣+集成學習這類方法簡單來說,通過重復組合少數類樣本與抽樣的同樣數量的多數類樣本,訓練若干的分類器進行集成學習。
EasyEnsemble 是利用模型集成(Ensemble)的方法多次欠采樣。核心思路就是將多數類樣本集隨機分成 N 個子集,且每一個子集樣本與少數類樣本相同,然后分別將各個多數類樣本子集與少數類樣本進行組合,產生多個不同的訓練集,進而訓練多個不同的基分類器,最后bagging集成各基分類器,得到最終模型。
BalanceCascade 是利用增量訓練的思想(Boosting)。核心思路就是在每一輪訓練時都使用多數類與少數類數量上相等的訓練集,然后使用該分類器對全體多數類進行預測,對于那些分類正確的多數類樣本不放回,然后對這個更小的多數類樣本欠采樣產生訓練集,然后進入下一輪迭代繼續降低多數類數量。
通常,在數據集噪聲較小的情況下,可以用BalanceCascade,可以用較少的基分類器數量得到較好的表現(基于串行的集成學習方法,對噪聲敏感容易過擬合)。噪聲大的情況下,可以用EasyEnsemble,基于串行+并行的集成學習方法,bagging多個Adaboost過程可以抵消一些噪聲影響。
評估指標
分類常用的指標precision、recall、F1、混淆矩陣,對于樣本不均衡的不同程度,都會明顯改變這些指標的表現。可以采用AUC、AUPRC(更優)評估模型表現,AUC對樣本的正負樣本比例情況是不敏感。