如何解決機器學習中數據不平衡問題

這幾年來,機器學習和數據挖掘非常火熱,它們逐漸爲世界帶來實際價值。與此同時,越來越多的機器學習算法從學術界走向工業界,而在這個過程中會有很多困難。數據不平衡問題雖然不是最難的,但絕對是最重要的問題之一。

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

可以看到大部分微博的總互動數(被轉發、評論與點贊數量)在0-5之間,交互數多的微博(多於100)非常之少。如果我們去預測一條微博交互數所在檔位,預測器只需要把所有微博預測爲第一檔(0-5)就能獲得非常高的準確率,而這樣的預測器沒有任何價值。那如何來解決機器學習中數據不平衡問題呢?這便是這篇文章要討論的主要內容。

嚴格地講,任何數據集上都有數據不平衡現象,這往往由問題本身決定的,但我們只關注那些分佈差別比較懸殊的;另外,雖然很多數據集都包含多個類別,但這裏着重考慮二分類,因爲解決了二分類中的數據不平衡問題後,推而廣之就能得到多分類情況下的解決方案。綜上,這篇文章主要討論如何解決二分類中正負樣本差兩個及以上數量級情況下的數據不平衡問題。

不平衡程度相同(即正負樣本比例類似)的兩個問題,解決的難易程度也可能不同,因爲問題難易程度還取決於我們所擁有數據有多大。比如在預測微博互動數的問題中,雖然數據不平衡,但每個檔位的數據量都很大——最少的類別也有幾萬個樣本,這樣的問題通常比較容易解決;而在癌症診斷的場景中,因爲患癌症的人本來就很少,所以數據不但不平衡,樣本數還非常少,這樣的問題就非常棘手。綜上,可以把問題根據難度從小到大排個序:大數據+分佈均衡<大數據+分佈不均衡<小數據+數據均衡<小數據+數據不均衡。說明:對於小數據集,機器學習的方法是比較棘手的。對於需要解決的問題,拿到數據後,首先統計可用訓練數據有多大,然後再觀察數據分佈情況。經驗表明,訓練數據中每個類別有5000個以上樣本,其實也要相對於特徵而言,來判斷樣本數目是不是足夠,數據量是足夠的,正負樣本差一個數量級以內是可以接受的,不太需要考慮數據不平衡問題(完全是經驗,沒有理論依據,僅供參考)。

二、如何解決
解決這一問題的基本思路是讓正負樣本在訓練過程中擁有相同的話語權,比如利用採樣與加權等方法。爲了方便起見,我們把數據集中樣本較多的那一類稱爲“大衆類”,樣本較少的那一類稱爲“小衆類”。

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

採樣分爲上採樣(Oversampling)和下采樣(Undersampling),上採樣是把小衆類複製多份,下采樣是從大衆類中剔除一些樣本,或者說只從大衆類中選取部分樣本。

隨機採樣最大的優點是簡單,但缺點也很明顯。上採樣後的數據集中會反覆出現一些樣本,訓練出來的模型會有一定的過擬合;而下采樣的缺點顯而易見,那就是最終的訓練集丟失了數據,模型只學到了總體模式的一部分。

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

因爲下采樣會丟失信息,如何減少信息的損失呢?第一種方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采樣(放回採樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。第二種方法叫做BalanceCascade,利用增量訓練的思想(Boosting):先通過一次下采樣產生訓練集,訓練一個分類器,對於那些分類正確的大衆樣本不放回,然後對這個更小的大衆樣本下采樣產生訓練集,訓練第二個分類器,以此類推,最終組合所有分類器的結果得到最終結果。第三種方法是利用KNN試圖挑選那些最具代表性的大衆樣本,叫做NearMiss,這類方法計算量很大,感興趣的可以參考“Learning from Imbalanced Data”這篇綜述的3.2.1節。

2. 數據合成
數據合成方法是利用已有樣本生成更多樣本,這類方法在小數據場景下有很多成功案例,比如醫學圖像分析等。


SMOTE爲每個小衆樣本合成相同數量的新樣本,這帶來一些潛在的問題:一方面是增加了類之間重疊的可能性,另一方面是生成一些沒有提供有益信息的樣本。爲了解決這個問題,出現兩種方法:Borderline-SMOTE與ADASYN。

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


橫向是真實分類情況,縱向是預測分類情況,C(i,j)是把真實類別爲j的樣本預測爲i時的損失,我們需要根據實際情況來設定它的值。

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

4. 一分類
對於正負樣本極不平衡的場景,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在於捕捉類間的差別,而是爲其中一類進行建模,經典的工作包括One-class SVM等。

說明:對於正負樣本極不均勻的問題,使用異常檢測,或者一分類問題,也是一個思路。

三、如何選擇
解決數據不平衡問題的方法有很多,上面只是一些最常用的方法,而最常用的方法也有這麼多種,如何根據實際問題選擇合適的方法呢?接下來談談一些我的經驗。

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

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

分類方法;

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

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

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

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

四、更進一步
更多細節與更多方法可以參考TKDE上的這篇綜述:“Learning from Imbalanced Data”。

 

--------------------- 
作者:BYR_jiandong 
來源:CSDN 
原文:https://blog.csdn.net/lujiandong1/article/details/52658675 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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