1. 程式人生 > >處理不均衡資料

處理不均衡資料

一、什麼是資料不平衡

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

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

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

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

二、如何解決

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

1.可以擴大資料樣本嗎?

2.試著改變你的績效標準

度是一個不適用於不平衡的資料集的績效指標。正如我們已經看到的,這是一種誤導。

在處理不平衡類時,有些更加理想的指標可以給你更加具有說服力的結果。

在這篇文章裡我主要著重於講述如何對乳腺癌患者復發這個不均衡資料集進行分類。

這篇文章中我推薦了以下幾個績效標準,相比於傳統的精確度,這些績效標準可以更加深入地洞察模型的準確率:

  • 混淆矩陣:將要預測的資料分到表裡來顯示正確的預測(對角線),並瞭解其不正確的預測的型別(哪些類被分配了不正確的預測);
  • 精度:一種分類準確性的處理方法;
  • 召回率:一種分類完整性的處理方法;
  • F1分數(或F-分):精度和召回率的加權平均。

同時,我還推薦你關注一下以下幾點:

  • Kappa(或者Cohen’s kappa):根據資料中集合資料的不平衡點來標準化分類精度;
  • ROC曲線:類似於精度和召回率,準確性被分為敏感性和特異性,並且可以基於這些值的平衡閾值來選擇模型。

你是不是仍然無法確定呢?試著運用Kappa,他會告訴你一些究竟如何處理分類準確度的建議和方法。

3. 重新取樣

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

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

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

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

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

4. 資料合成

資料合成方法是利用已有樣本生成更多樣本,這類方法在小資料場景下有很多成功案例,比如醫學影象分析等。

其中最常見的一種方法叫做SMOTE,它利用小眾樣本在特徵空間的相似性來生成新樣本。對於小眾樣本xi∈Sminxi∈Smin,從它屬於小眾類的K近鄰中隨機選取一個樣本點x^ix^i,生成一個新的小眾樣本xnewxnew:xnew=xi+(x^−xi)×δxnew=xi+(x^−xi)×δ,其中δ∈[0,1]δ∈[0,1]是隨機數。

上圖是SMOTE方法在K=6K=6近鄰下的示意圖,黑色方格是生成的新樣本。

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

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

ADASYN的解決思路是根據資料分佈情況為不同小眾樣本生成不同數量的新樣本。首先根據最終的平衡程度設定總共需要生成的新小眾樣本數量GG,然後為每個小眾樣本xixi計算分佈比例ΓiΓi:Γi=Δi/KZΓi=Δi/KZ,其中ΓiΓi是xixiK近鄰中大眾樣本的數量,ZZ用來歸一化使得∑Γi=1∑Γi=1,最後為小眾樣本xixi生成新樣本的個數為gi=Γi×Ggi=Γi×G,確定個數後再利用SMOTE生成新樣本。

5. 加權

除了取樣和生成新資料等方法,我們還可以通過加權的方式來解決資料不平衡問題,即對不同類別分錯的代價不同,如下圖:

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時的損失,我們需要根據實際情況來設定它的值。

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

6. 一分類

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

7. Try Different Algorithms

通常來說,我會強烈建議你對於所有問題不要總是使用自己最喜歡的模型。對於所給的問題你至少應該用不同型別的演算法對其進行抽查。

欲瞭解更多關於抽查的方法,請參閱我的文章“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。

話雖這麼說,決策樹往往在處理不平衡類資料集表現不錯。在建立樹的過程中使用類變數的分裂規則,可以強制地將兩個類很好的進行處理。

如果有疑問,請嘗試一些流行的決策樹演算法,如C4.5,C5.0,CART和隨機森林。

8. 嘗試名義變數模型

您可以使用相同的演算法,但是在不同問題中他們可能會給出不同的觀點。

因為在訓練過程中,對於小類資料會產生分類錯誤,因此名義變數分類會產生額外費用。這些名義變數會使模型偏向於更加註重少數類資料。

通常來說掌握一類名義變數或者權重是為了學習方法。例如一些方法的名義變數penalized-SVM和penalized-LDA。

另外,對於名義變數模型也具有通用框架。例如,Weka中有一個CostSensitiveClassifier,它可以封裝任何分類和自定義分類應用中錯過的名義變數矩陣。

如果你鎖定到一個特定的演算法並且無法重新取樣或是你得到的結果不好時,使用名義變數是可取的。它提供了另一種方法來“平衡”類。建立名義變數矩陣是很複雜的,也許您將不得不嘗試各種設定名義變數的方法,看看什麼方法是最適合用來解決你的問題。

9.  嘗試從不同的觀點進行思考

對於研究不平衡資料集的鄰域。他們有自己的演算法,措施和術語。

從這些觀點處罰,縱觀和思考你的問題,有時一些想法會有所改變。

兩個你可能想要考慮的是異常檢測和變化檢測。

異常檢測是罕見事件的檢測。這可能是根據一系列的系統呼叫,通過它的振動或一個由程式指示的惡意活動而產生的機器故障。這樣的事件相比正常操作是罕見的。

這種思維的轉變在於考慮以小類作為異常值類,它可以幫助你獲得一種新方法來分離和分類的樣本。

除了變化檢測是找尋找它的變化而不是差異以外,變化檢測類似於異常檢測。這可能是在觀察使用模式或銀行交易過程中使用者的行為變化。

對於分類的問題,這兩個轉變具有更加實時的角度,它可能會給你一些新的方式去思考你的問題以及讓你嘗試更多新的技術。

10 . 嘗試一些新的創意

在你的問題裡面挖掘並思考如何把它分解成更小的問題,這些問題更容易處理。

三、如何選擇

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

在正負樣本都非常之少的情況下,應該採用資料合成的方式;在負樣本足夠多,正樣本非常之少且比例及其懸殊的情況下,應該考慮一分類方法;在正負樣本都足夠多且比例不是特別懸殊的情況下,應該考慮取樣或者加權的方法。

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

另外,雖然上取樣和下采樣都可以使資料集變得平衡,並且在資料足夠多的情況下等價,但兩者也是有區別的。實際應用中,我的經驗是如果計算資源足夠且小眾類樣本足夠多的情況下使用上取樣,否則使用下采樣,因為上取樣會增加訓練集的大小進而增加訓練時間,同時小的訓練集非常容易產生過擬合。對於下采樣,如果計算資源相對較多且有良好的並行環境,應該選擇Ensemble方法。

四、更進一步

什麼樣的模型需要 均衡的資料?