在前段時間做本科畢業設計的時候,遇到了各個類別的樣本量分布不均的問題——某些類別的樣本數量極多,而有些類別的樣本數量極少,也就是所謂的類不平衡(class-imbalance)問題。
本篇簡述了以下內容:
什么是類不平衡問題
為什么類不平衡是不好的
幾種解決方案
SMOTE過采樣算法
進一步閱讀
什么是類不平衡問題
類不平衡(class-imbalance)是指在訓練分類器中所使用的訓練集的類別分布不均。比如說一個二分類問題,1000個訓練樣本,比較理想的情況是正類、負類樣本的數量相差不多;而如果正類樣本有995個、負類樣本僅5個,就意味着存在類不平衡。
在后文中,把樣本數量過少的類別稱為“少數類”。
但實際上,數據集上的類不平衡到底有沒有達到需要特殊處理的程度,還要看不處理時訓練出來的模型在驗證集上的效果。有些時候是沒必要處理的。
從模型的訓練過程來看
從訓練模型的角度來說,如果某類的樣本數量很少,那么這個類別所提供的“信息”就太少。
使用經驗風險(模型在訓練集上的平均損失)最小化作為模型的學習准則。設損失函數為0-1 loss(這是一種典型的均等代價的損失函數),那么優化目標就等價於錯誤率最小化(也就是accuracy最大化)。考慮極端情況:1000個訓練樣本中,正類樣本999個,負類樣本1個。訓練過程中在某次迭代結束后,模型把所有的樣本都分為正類,雖然分錯了這個負類,但是所帶來的損失實在微不足道,accuracy已經是99.9%,於是滿足停機條件或者達到最大迭代次數之后自然沒必要再優化下去,ok,到此為止,訓練結束!於是這個模型……
模型沒有學習到如何去判別出少數類。
從模型的預測過程來看
考慮二項Logistic回歸模型。輸入一個樣本 $\textbf x$ ,模型輸出的是其屬於正類的概率 $\hat y$ 。當 $\hat y>0.5$ 時,模型判定該樣本屬於正類,否則就是屬於反類。
為什么是0.5呢?可以認為模型是出於最大后驗概率決策的角度考慮的,選擇了0.5意味着當模型估計的樣本屬於正類的后驗概率要大於樣本屬於負類的后驗概率時就將樣本判為正類。但實際上,這個后驗概率的估計值是否准確呢?
從幾率(odds)的角度考慮:幾率表達的是樣本屬於正類的可能性與屬於負類的可能性的比值。模型對於樣本的預測幾率為 $\dfrac{\hat y}{1-\hat y}$ 。
模型在做出決策時,當然希望能夠遵循真實樣本總體的正負類樣本分布:設 $\theta$ 等於正類樣本數除以全部樣本數,那么樣本的真實幾率為 $\dfrac{\theta}{1-\theta}$ 。當觀測幾率大於真實幾率時,也就是 $\hat y>\theta$ 時,那么就判定這個樣本屬於正類。
雖然我們無法獲悉真實樣本總體,但之於訓練集,存在這樣一個假設:訓練集是真實樣本總體的無偏采樣。正是因為這個假設,所以認為訓練集的觀測幾率 $\dfrac{\hat\theta}{1-\hat\theta}$ 就代表了真實幾率 $\dfrac{\theta}{1-\theta}$ 。
所以,在這個假設下,當一個樣本的預測幾率大於觀測幾率時,就應該將樣本判斷為正類。
目前主要有三種辦法:
1. 調整 $\theta$ 值
根據訓練集的正負樣本比例,調整 $\theta$ 值。
這樣做的依據是上面所述的對訓練集的假設。但在給定任務中,這個假設是否成立,還有待討論。
2. 過采樣
對訓練集里面樣本數量較少的類別(少數類)進行過采樣,合成新的樣本來緩解類不平衡。
下面將介紹一種經典的過采樣算法:SMOTE。
3. 欠采樣
對訓練集里面樣本數量較多的類別(多數類)進行欠采樣,拋棄一些樣本來緩解類不平衡。
SMOTE過采樣算法
JAIR'2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》提出了一種過采樣算法SMOTE。概括來說,本算法基於“插值”來為少數類合成新的樣本。下面介紹如何合成新的樣本。
設訓練集的一個少數類的樣本數為 $T$ ,那么SMOTE算法將為這個少數類合成 $NT$ 個新樣本。這里要求 $N$ 必須是正整數,如果給定的 $N<1$ 那么算法將“認為”少數類的樣本數 $T=NT$ ,並將強制 $N=1$ 。
考慮該少數類的一個樣本 $i$ ,其特征向量為 $\boldsymbol x_i,i\in\{1,...,T\}$ :
1. 首先從該少數類的全部 $T$ 個樣本中找到樣本 $\boldsymbol x_i$ 的 $k$ 個近鄰(例如用歐氏距離),記為 $\boldsymbol x_{i(near)},near\in\{1,...,k\}$ ;
2. 然后從這 $k$ 個近鄰中隨機選擇一個樣本 $\boldsymbol x_{i(nn)}$ ,再生成一個 $0$ 到 $1$ 之間的隨機數 $\zeta_1$ ,從而合成一個新樣本 $\boldsymbol x_{i1}$ :
$$\boldsymbol x_{i1}=\boldsymbol x_i+\zeta_1\cdot (\boldsymbol x_{i(nn)}−\boldsymbol x_i)$$
3. 將步驟2重復進行 $N$ 次,從而可以合成 $N$ 個新樣本:$\boldsymbol x_{inew},new\in{1,...,N}$。
那么,對全部的 $T$ 個少數類樣本進行上述操作,便可為該少數類合成 $NT$ 個新樣本。

如果樣本的特征維數是 $2$ 維,那么每個樣本都可以用二維平面上的一個點來表示。SMOTE算法所合成出的一個新樣本 $\boldsymbol x_{i1}$ 相當於是表示樣本 $\boldsymbol x_i$ 的點和表示樣本 $\boldsymbol x_{i(nn)}$ 的點之間所連線段上的一個點。所以說該算法是基於“插值”來合成新樣本。
進一步閱讀
有兩篇翻譯自國外博客的文章:
可以先讀中文的了解一下說了哪些事情,如果感興趣的話就去看英文原文來深入學習。
參考:
《機器學習》,周志華
SMOTE: Synthetic Minority Over-sampling Technique,JAIR'2002
