解決類別不平衡問題的方法綜述

一、數據不平衡

1.1 什麼是數據不平衡

在學術研究與教學中,很多算法都有一個基本假設,那就是數據分佈是均勻的。當我們把這些算法直接應用於實際數據時,大多數情況下都無法取得理想的結果。因爲實際數據往往分佈得很不均勻,都會存在“長尾現象”,也就是所謂的“二八原理”。

以二分類問題爲例,假設正類的樣本數量遠大於負類的樣本數量,通常情況下把樣本類別比例超過4:1(也有說3:1)的數據就可以稱爲不平衡數據。

不平衡程度相同(即正負樣本比例類似)的兩個問題,解決的難易程度也可能不同,因爲問題難易程度還取決於數據量。可以把問題根據難度從小到大排個序:大數據+分佈均衡<大數據+分佈不均衡<小數據+數據均衡<小數據+數據不均衡

1.2 數據不平衡會產生什麼問題

樣本不平衡會使得我們的分類模型存在很嚴重的偏向性,但是從一些常用的指標上又無法看出來。舉一個極端一點的例子,如果正負樣本比例爲100:1,那豈不是把全部樣本都判定爲正樣本就有99%+的分類準確率了。從測試結果上來看,就表現爲有太多的False Positive。

二、解決方法

在機器學習中,處理樣本不平衡問題,主要有3種策略:從數據角度、從算法層面和模型評價層面。
從數據角度出發,通常的方法包括了:

2.1 採樣

採樣方法是通過對訓練集進行處理使其從不平衡的數據集變成平衡的數據集,在大部分情況下會對最終的結果帶來提升。採樣分爲過採樣和欠採樣。這種方法最大的優點是簡單。

過採樣

過採樣是把小衆類複製多份。

過採樣後的數據集中會反覆出現一些樣本,訓練出來的模型會有一定的過擬合。

過採樣會把小衆樣本複製多份,一個點會在高維空間中反覆出現,這會導致一個問題,那就是運氣好就能分對很多點,否則分錯很多點。爲了解決這一問題,可以在每次生成新數據點時加入輕微的隨機擾動,經驗表明這種做法非常有效。

欠採樣

欠採樣是從大衆類中剔除一些樣本,或者說只從大衆類中選取部分樣本。

欠採樣的缺點是最終的訓練集丟失了數據,模型只學到了總體模式的一部分。丟棄大量數據,和過採樣一樣會存在過擬合的問題。

因爲欠採樣會丟失信息,如何減少信息的損失呢?

第一種方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次欠採樣(放回採樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。

第二種方法叫做BalanceCascade,利用增量訓練的思想(Boosting):先通過一次欠採樣產生訓練集,訓練一個分類器,對於那些分類正確的大衆樣本不放回,然後對這個更小的大衆樣本欠採樣產生訓練集,訓練第二個分類器,以此類推,最終組合所有分類器的結果得到最終結果。

第三種方法是利用KNN試圖挑選那些最具代表性的大衆樣本,叫做NearMiss,這類方法本質上是一種原型選擇(prototype selection)方法,即從多數類樣本中選取最具代表性的樣本用於訓練,計算量很大。

還可以採用聚類的方法,假設少數類樣本數量爲N,那就將多數類樣本分爲N個簇,取每個簇的中心點作爲多數類的新樣本,再加上少數類的所有樣本進行訓練。這樣就可以保證了多數類樣本在特徵空間的分佈特性。

還可以通過某種規則來清洗重疊的數據,從而達到欠採樣的目的,而這些規則往往也是啓發性的。如Tomek LinkEdited Nearest Neighbours(ENN)。這種數據清洗方法最大的缺點是無法控制欠採樣的數量。

2.2 數據合成

數據合成方法是利用已有樣本生成更多樣本,其實也可以歸類於過採樣方法,這類方法在小數據場景下有很多成功案例,比如醫學圖像分析等。

現在的主流過採樣方法就是通過某種方式人工合成一些少數類樣本,從而達到類別平衡的目的,而這其中的鼻祖就是SMOTE。

SMOTE (synthetic minority oversampling technique) 的思想概括起來就是在少數類樣本之間進行插值來產生額外的樣本。具體地,對於一個少數類樣本xix_i使用K近鄰法(k值需要提前指定),求出離xix_i距離最近的k個少數類樣本,其中距離定義爲樣本之間n維特徵空間的歐氏距離。然後從k個近鄰點中隨機選取一個,使用下列公式生成新樣本:
xnew=xi+(x^ixi)×δx_{new}=x_i+(\hat x_i−x_i)×δ
其中x^i\hat x_i爲選出的k近鄰點,δ[0,1]δ∈[0,1]是一個隨機數。下圖就是一個SMOTE生成樣本的例子,使用的是3-近鄰,可以看出SMOTE生成的樣本一般就在xix_ix^i\hat x_i相連的直線上:
在這裏插入圖片描述
SMOTE爲每個小衆樣本合成相同數量的新樣本,這帶來一些潛在的問題:一方面是增加了類之間重疊的可能性,另一方面是生成一些沒有提供有益信息的樣本。爲了解決這個問題,出現兩種方法:Borderline-SMOTE與ADASYN。

Borderline-SMOTE的解決思路是尋找那些應該爲之合成新樣本的小衆樣本。即爲每個小衆樣本計算K近鄰,只爲那些K近鄰中有一半以上大衆樣本的小衆樣本生成新樣本。直觀地講,只爲那些周圍大部分是大衆樣本的小衆樣本生成新樣本,因爲這些樣本往往是邊界樣本。確定了爲哪些小衆樣本生成新樣本後再利用SMOTE生成新樣本。

ADASYN名爲自適應合成抽樣(adaptive synthetic sampling),其最大的特點是根據數據分佈情況自動決定不同少數類樣本需要產生多少不同數量的合成樣本,而不是像SMOTE那樣對每個少數類樣本合成同數量的樣本。
其流程爲:首先計算需要合成的樣本總量G,然後對於每個少類別樣本xi,找出其K近鄰個點,並計算分佈比例ΓΓ,最後對每個少類別樣本xi計算需要合成的樣本數量gi,再用SMOTE算法合成新樣本。

2.2.1 文本數據的合成

後文中的focal loss 方法,針對像深度神經網絡這些複雜的模型,具有很好的使用價值,但是針對傳統分類器,小樣本集情況下,實施有一定的難度。而簡單過採樣和欠採樣對與文本分類問題效果幾乎爲0。

對於文本數據,可以採用文本生成的方式,解決文本樣本不均衡的問題。首先分析樣本數少的類別,通過文本句法依賴分析,文本詞性標記分析詞的相關屬性,然後採用同義詞替換的方式生成新的文本。實驗結果證明,方法簡單有效。

還可以進行一些句子順序打亂以及句內詞序打亂的操作進行小類的數據增強。 將數據增強結合過採樣是比較直觀有效的做法。

2.2.2 圖像數據的合成

屬於圖像數據增強範疇,包括圖像翻轉、平移、旋轉、縮放,分離單個r、g、b三個顏色通道以及添加噪聲等等。

2.3 加權

我們還可以通過加權的方式來解決數據不平衡的問題,即對不同類別分錯的代價不同,在訓練分類器時,爲少數類樣本賦予更大的權值,爲多數類樣本賦予較小的權值。

這種方法的難點在於設置合理的權重,實際應用中一般讓各個分類間的加權損失值近似相等。當然這並不是通用法則,還是需要具體問題具體分析。

2.4 改變模型評價

2.4.1 選擇合適的評估方式

準確度這個評價指標在類別不均衡的分類任務中並不能work,甚至進行誤導(分類器不work,但是從這個指標來看,該分類器有着很好的評價指標得分)。

對於極端的類別不平衡的評估問題,我們一般用的指標有(前面是全局評估,最後一個是點評估):

  • 混淆矩陣
  • Precision和Recall
  • F1得分
  • Kappa(Cohen kappa)
  • ROC曲線和AUC
  • mean Average Precesion(mAP),指的是在不同召回下的最大精確度的平均值
  • Precision@Rank k。假設共有n個點,假設其中k個點是少數樣本時的Precision。這個評估方法在推薦系統中也常常會用。

選擇哪個評估標準需要取決於具體問題。

2.4.2 調整閾值

大部分模型的默認閾值爲輸出值的中位數,如邏輯迴歸的輸出範圍爲[0,1],當某個樣本的輸出大於0.5就會被劃分爲正例,反之爲反例。當類別不平衡時,採用默認的分類閾值可能會導致輸出全部爲反例,產生虛高的準確度,導致分類失敗。因此,可以選擇調整閾值,使得模型對於較少的類別更爲敏感。

2.4.3 改變損失函數(OHEM和Focal loss)

以下兩個方法最開始適用於圖像上,但是NLP領域也可以借鑑。

OHEM

OHEM(online hard example miniing)算法的核心思想是根據輸入樣本的損失進行篩選,篩選出hard example,表示對分類和檢測影響較大的樣本,然後將篩選得到的這些樣本應用在隨機梯度下降中訓練。在實際操作中是將原來的一個ROI Network擴充爲兩個ROI Network,這兩個ROI Network共享參數。其中前面一個ROI Network只有前向操作,主要用於計算損失;後面一個ROI Network包括前向和後向操作,以hard example作爲輸入,計算損失並回傳梯度。

算法優點:1、對於數據的類別不平衡問題不需要採用設置正負樣本比例的方式來解決,這種在線選擇方式針對性更強。2、隨着數據集的增大,算法的提升更加明顯(作者是通過在COCO數據集上做實驗和VOC數據集做對比,因爲前者的數據集更大,而且提升更明顯,所以有這個結論)。

Focal loss

Focal loss主要是爲了解決one-stage目標檢測中正負樣本比例嚴重失衡的問題。主旨是:ssd按照ohem選出了loss較大的,但忽略了那些loss較小的easy的負樣本,雖然這些easy負樣本loss很小,但數量多,加起來的loss較大,對最終loss有一定貢獻。作者想把這些loss較小的也融入到loss計算中。但如果直接計算所有的loss,loss會被那些easy的負樣本主導,因爲數量太多,加起來的loss就大了。也就是說,作者是想融入一些easy example,希望他們能有助於訓練,但又不希望他們主導loss。這個時候就用了公式進行衰減那些easy example,讓他們對loss做貢獻,但又不至於主導loss,並且通過balanced crossentropy平衡類別。

OHEM是隻取3:1的負樣本去計算loss,之外的負樣本權重置零,而focal loss取了所有負樣本,根據難度給了不同的權重。

focal loss相比OHEM的提升點在於,3:1的比例比較粗暴,那些有些難度的負樣本可能遊離於3:1之外。之前實驗中曾經調整過OHEM這個比例,發現是有好處的,現在可以試試focal loss了。

可以參考本人的另一篇博文:論文筆記:Focal Loss for Dense Object Detection

2.5 一分類/無監督/半監督

對於正負樣本極不平衡的場景,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題或變化趨勢檢測問題。

一分類方法的重點不在於捕捉類間的差別,而是爲其中一類進行建模,經典的工作包括One-class SVM等。

異常檢測指的是從數據中找到那些異常值,比如你案例中的“廣告”。無監督的異常檢測一般依賴於對於數據的假設,比如廣告和正常的文章內容很不相同,那麼一種假設是廣告和正常文章間的歐式距離很大。無監督異常檢測最大優勢就是在於不需要數據標籤,如果在對數據假設正確時效果甚至可以比監督學習更好,尤其是當獲取標籤成本很高時。

變化趨勢檢測類似於異常點檢測,不同在於其通過檢測不尋常的變化趨勢來識別。如通過觀察用戶模式或銀行交易來檢測用戶行爲的不尋常改變。

此外還可以嘗試半監督異常集成學習,簡單而言,可以現在原始數據集上使用多個無監督異常方法來抽取數據的表示,並和原始的數據結合作爲新的特徵空間。在新的特徵空間上使用集成樹模型,比如xgboost,來進行監督學習。無監督異常檢測的目的是提高原始數據的表達,監督集成樹的目的是降低數據不平衡對於最終預測結果的影響。這個方法還可以和主動學習結合起來,進一步提升系統的性能。當然,這個方法最大的問題是運算開銷比較大,需要進行深度優化。具體做法可以參考:

Zhao, Y.; Hryniewicki, M.K. XGBOD: Improving Supervised Outlier Detection with Unsupervised Representation Learning. In Proceedings of the International Joint Conference on Neural Networks (IJCNN), Rio, Brazil, 8–13 July 2018.

2.5.1 不平衡文本數據的半監督

高維數據上的半監督異常檢測:考慮到文本文件在轉化後往往維度很高,可以嘗試一下最近的一篇KDD文章,主要是找到高維數據在低維空間上的表示,以幫助基於距離的異常檢測方法。文章如下:

Pang, G., Cao, L., Chen, L. and Liu, H., 2018. Learning Representations of Ultrahigh-dimensional Data for Random Distance-based Outlier Detection. arXiv preprint arXiv:1806.04808.

三、如何選擇

如何根據實際問題選擇合適的方法呢?接下來談談一些我的經驗。

1、在正負樣本都非常之少的情況下,應該採用數據合成的方式;

2、在負樣本足夠多,正樣本非常之少且比例及其懸殊的情況下,應該考慮一分類方法;

3、在正負樣本都足夠多且比例不是特別懸殊的情況下,應該考慮採樣或者加權的方法。

4、採樣和加權在數學上是等價的,但實際應用中效果卻有差別。尤其是採樣了諸如Random Forest等分類方法,訓練過程會對訓練集進行隨機採樣。在這種情況下,如果計算資源允許過採樣往往要比加權好一些。

5、另外,雖然過採樣和欠採樣都可以使數據集變得平衡,並且在數據足夠多的情況下等價,但兩者也是有區別的。實際應用中,我的經驗是如果計算資源足夠且小衆類樣本足夠多的情況下使用過採樣,否則使用欠採樣,因爲過採樣會增加訓練集的大小進而增加訓練時間,同時小的訓練集非常容易產生過擬合。

6、對於欠採樣,如果計算資源相對較多且有良好的並行環境,應該選擇Ensemble方法。

四、總結

1、怎樣解決樣本不平衡問題:

主要三個方面,數據,模型和評估方法

從數據的角度出發,通常的方法包括:

  • 擴充數據集
  • 過採樣
  • 欠採樣
  • 數據合成
  • 基於異常檢測的方式

從算法的角度出發,通常的方法包括:

  • 嘗試不同的分類算法

    決策樹往往在類別不均衡數據上表現不錯。它使用基於類變量的劃分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。

  • 對小類錯分進行加權懲罰

    如penalized-SVM和penalized-LDA算法。

  • 從重構分類器的角度出發

    仔細對你的問題進行分析與挖掘,是否可以將你的問題劃分成多個更小的問題,而這些小問題更容易解決。你可以從這篇文章In classification, how do you handle an unbalanced training set?中得到靈感。例如:

    • 將你的大類壓縮成小類
    • 使用One Class分類器(將小類作爲異常點)
    • 使用集成方式,訓練多個分類器,然後聯合這些分類器進行分類
    • 將二分類問題改成多分類問題

從評估的角度出發,通常的方法包括:

  • 選擇合適的評估指標
  • 選擇合適的損失函數
  • 選擇合適的閾值
  • 設置不同類別的權重

2、經驗:
在這裏插入圖片描述

參考網址:
【小夕精選】如何優雅而時髦的解決不均衡分類問題 - 夕小瑤的賣萌屋
怎樣解決樣本不平衡問題?(較全,有經驗總結)
聊一聊深度學習中的樣本不平衡問題
機器學習之類別不平衡問題 (3) —— 採樣方法(詳細講了多種過採樣和欠採樣的方法,並對比了效果)
欠採樣(undersampling)和過採樣(oversampling)會對模型帶來怎樣的影響? - 微調的回答 - 知乎(含部分方法在不同數據集上的實驗結果)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章