做者:無影隨想
時間:2016年1月。
出處:https://zhaokv.com/machine_learning/2016/01/learning-from-imbalanced-data.html
聲明:版權全部,轉載請註明出處html
這幾年來,機器學習和數據挖掘很是火熱,它們逐漸爲世界帶來實際價值。與此同時,愈來愈多的機器學習算法從學術界走向工業界,而在這個過程當中會有不少困難。數據不平衡問題雖然不是最難的,但絕對是最重要的問題之一。算法
在學術研究與教學中,不少算法都有一個基本假設,那就是數據分佈是均勻的。當咱們把這些算法直接應用於實際數據時,大多數狀況下都沒法取得理想的結果。由於實際數據每每分佈得很不均勻,都會存在「長尾現象」,也就是所謂的「二八原理」。下圖是新浪微博交互分佈狀況:dom
能夠看到大部分微博的總互動數(被轉發、評論與點贊數量)在0-5之間,交互數多的微博(多於100)很是之少。若是咱們去預測一條微博交互數所在檔位,預測器只須要把全部微博預測爲第一檔(0-5)就能得到很是高的準確率,而這樣的預測器沒有任何價值。那如何來解決機器學習中數據不平衡問題呢?這即是這篇文章要討論的主要內容。機器學習
嚴格地講,任何數據集上都有數據不平衡現象,這每每由問題自己決定的,但咱們只關注那些分佈差異比較懸殊的;另外,雖然不少數據集都包含多個類別,但這裏着重考慮二分類,由於解決了二分類中的數據不平衡問題後,推而廣之就能獲得多分類狀況下的解決方案。綜上,這篇文章主要討論如何解決二分類中正負樣本差兩個及以上數量級狀況下的數據不平衡問題。學習
不平衡程度相同(即正負樣本比例相似)的兩個問題,解決的難易程度也可能不一樣,由於問題難易程度還取決於咱們所擁有數據有多大。好比在預測微博互動數的問題中,雖然數據不平衡,但每一個檔位的數據量都很大——最少的類別也有幾萬個樣本,這樣的問題一般比較容易解決;而在癌症診斷的場景中,由於患癌症的人原本就不多,因此數據不但不平衡,樣本數還很是少,這樣的問題就很是棘手。綜上,能夠把問題根據難度從小到大排個序:大數據+分佈均衡<大數據+分佈不均衡<小數據+數據均衡<小數據+數據不均衡。對於須要解決的問題,拿到數據後,首先統計可用訓練數據有多大,而後再觀察數據分佈狀況。經驗代表,訓練數據中每一個類別有5000個以上樣本,數據量是足夠的,正負樣本差一個數量級之內是能夠接受的,不太須要考慮數據不平衡問題(徹底是經驗,沒有理論依據,僅供參考)。大數據
解決這一問題的基本思路是讓正負樣本在訓練過程當中擁有相同的話語權,好比利用採樣與加權等方法。爲了方便起見,咱們把數據集中樣本較多的那一類稱爲「大衆類」,樣本較少的那一類稱爲「小衆類」。rest
採樣方法是經過對訓練集進行處理使其從不平衡的數據集變成平衡的數據集,在大部分狀況下會對最終的結果帶來提高。htm
採樣分爲上採樣(Oversampling)和下采樣(Undersampling),上採樣是把小種類複製多份,下采樣是從大衆類中剔除一些樣本,或者說只從大衆類中選取部分樣本。圖片
隨機採樣最大的優勢是簡單,但缺點也很明顯。上採樣後的數據集中會反覆出現一些樣本,訓練出來的模型會有必定的過擬合;而下采樣的缺點顯而易見,那就是最終的訓練集丟失了數據,模型只學到了整體模式的一部分。資源
上採樣會把小衆樣本複製多份,一個點會在高維空間中反覆出現,這會致使一個問題,那就是運氣好就能分對不少點,不然分錯不少點。爲了解決這一問題,能夠在每次生成新數據點時加入輕微的隨機擾動,經驗代表這種作法很是有效。
由於下采樣會丟失信息,如何減小信息的損失呢?第一種方法叫作EasyEnsemble,利用模型融合的方法(Ensemble):屢次下采樣(放回採樣,這樣產生的訓練集才相互獨立)產生多個不一樣的訓練集,進而訓練多個不一樣的分類器,經過組合多個分類器的結果獲得最終的結果。第二種方法叫作BalanceCascade,利用增量訓練的思想(Boosting):先經過一次下采樣產生訓練集,訓練一個分類器,對於那些分類正確的大衆樣本不放回,而後對這個更小的大衆樣本下采樣產生訓練集,訓練第二個分類器,以此類推,最終組合全部分類器的結果獲得最終結果。第三種方法是利用KNN試圖挑選那些最具表明性的大衆樣本,叫作NearMiss,這類方法計算量很大,感興趣的能夠參考「Learning from Imbalanced Data」這篇綜述的3.2.1節。
數據合成方法是利用已有樣本生成更多樣本,這類方法在小數據場景下有不少成功案例,好比醫學圖像分析等。
其中最多見的一種方法叫作SMOTE,它利用小衆樣本在特徵空間的類似性來生成新樣本。對於小衆樣本$x_i\in S_{\min}$,從它屬於小衆類的K近鄰中隨機選取一個樣本點$\hat{x}_i$,生成一個新的小衆樣本$x_{new}$:$x_{new}=x_i+(\hat{x}-x_i)\times\delta$,其中$\delta\in[0,1]$是隨機數。
上圖是SMOTE方法在$K=6$近鄰下的示意圖,黑色方格是生成的新樣本。
SMOTE爲每一個小衆樣本合成相同數量的新樣本,這帶來一些潛在的問題:一方面是增長了類之間重疊的可能性,另外一方面是生成一些沒有提供有益信息的樣本。爲了解決這個問題,出現兩種方法:Borderline-SMOTE與ADASYN。
Borderline-SMOTE的解決思路是尋找那些應該爲之合成新樣本的小衆樣本。即爲每一個小衆樣本計算K近鄰,只爲那些K近鄰中有一半以上大衆樣本的小衆樣本生成新樣本。直觀地講,只爲那些周圍大部分是大衆樣本的小衆樣本生成新樣本,由於這些樣本每每是邊界樣本。肯定了爲哪些小衆樣本生成新樣本後再利用SMOTE生成新樣本。
ADASYN的解決思路是根據數據分佈狀況爲不一樣小衆樣本生成不一樣數量的新樣本。首先根據最終的平衡程度設定總共須要生成的新小衆樣本數量$G$,而後爲每一個小衆樣本$x_i$計算分佈比例$\Gamma_i$:$\Gamma_i=\frac{\Delta_i/K}{Z}$,其中$\Gamma_i$是$x_i$K近鄰中大衆樣本的數量,$Z$用來歸一化使得$\sum\Gamma_i=1$,最後爲小衆樣本$x_i$生成新樣本的個數爲$g_i=\Gamma_i\times G$,肯定個數後再利用SMOTE生成新樣本。
除了採樣和生成新數據等方法,咱們還能夠經過加權的方式來解決數據不平衡問題,即對不一樣類別分錯的代價不一樣,以下圖:
k | C(k,1) | C(k,2) | ... | 0 |
1 | 2 | ... | k | |
1 | 0 | C(1,2) | ... | C(1,k) |
2 | C(2,1) | 0 | ... | ... |
... | ... | ... | ... | ... |
橫向是真實分類狀況,縱向是預測分類狀況,C(i,j)是把真實類別爲j的樣本預測爲i時的損失,咱們須要根據實際狀況來設定它的值。
這種方法的難點在於設置合理的權重,實際應用中通常讓各個分類間的加權損失值近似相等。固然這並非通用法則,仍是須要具體問題具體分析。
對於正負樣本極不平衡的場景,咱們能夠換一個徹底不一樣的角度來看待問題:把它看作一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在於捕捉類間的差異,而是爲其中一類進行建模,經典的工做包括One-class SVM等。
解決數據不平衡問題的方法有不少,上面只是一些最經常使用的方法,而最經常使用的方法也有這麼多種,如何根據實際問題選擇合適的方法呢?接下來談談一些個人經驗。
在正負樣本都很是之少的狀況下,應該採用數據合成的方式;在負樣本足夠多,正樣本很是之少且比例及其懸殊的狀況下,應該考慮一分類方法;在正負樣本都足夠多且比例不是特別懸殊的狀況下,應該考慮採樣或者加權的方法。
採樣和加權在數學上是等價的,但實際應用中效果卻有差異。尤爲是採樣了諸如Random Forest等分類方法,訓練過程會對訓練集進行隨機採樣。在這種狀況下,若是計算資源容許上採樣每每要比加權好一些。
另外,雖然上採樣和下采樣均可以使數據集變得平衡,而且在數據足夠多的狀況下等價,但二者也是有區別的。實際應用中,個人經驗是若是計算資源足夠且小衆類樣本足夠多的狀況下使用上採樣,不然使用下采樣,由於上採樣會增長訓練集的大小進而增長訓練時間,同時小的訓練集很是容易產生過擬合。對於下采樣,若是計算資源相對較多且有良好的並行環境,應該選擇Ensemble方法。
更多細節與更多方法能夠參考TKDE上的這篇綜述:「Learning from Imbalanced Data」。