1. 程式人生 > >機器學習中不平衡資料的處理方式

機器學習中不平衡資料的處理方式

https://blog.csdn.net/pipisorry/article/details/78091626

不平衡資料的場景出現在網際網路應用的方方面面,如搜尋引擎的點選預測(點選的網頁往往佔據很小的比例),電子商務領域的商品推薦(推薦的商品被購買的比例很低),信用卡欺詐檢測,網路攻擊識別等等。

問題定義

那麼什麼是不平衡資料呢?顧名思義即我們的資料集樣本類別極不均衡,以二分類問題為例,假設我們的資料集是$S$,資料集中的多數類為$S_maj$,少數類為$S_min$,通常情況下把多數類樣本的比例為$100:1$,$1000:1$,甚至是$10000:1$這種情況下為不平衡資料,不平衡資料的學習即需要在如此分佈不均勻的資料集中學習到有用的資訊。

為什麼需要不平衡學習?

傳統的學習方法以降低總體分類精度為目標,將所有樣本一視同仁,同等對待,如下圖1所示,造成了分類器在多數類的分類精度較高而在少數類的分類精度很低。機器學習模型都有一個待優化的損失函式,以我們最常用最簡單的二元分類器邏輯迴歸為例,其損失函式如下公式1所示,邏輯迴歸以優化總體的精度為目標,不同類別的誤分類情況產生的誤差是相同的,考慮一個$500:1$的資料集,即使把所有樣本都預測為多數類其精度也能達到$500/501$之高,很顯然這並不是一個很好的學習效果,因此傳統的學習演算法在不平衡資料集中具有較大的侷限性。

   

圖1 傳統學習在不平衡資料下的缺點                                   公式1 邏輯迴歸的交叉熵損失函式

不平衡學習的方法

針對不平衡資料集解決方法主要分為兩個方面:

第一種方案主要從資料的角度出發,主要方法為抽樣,既然我們的樣本是不平衡的,那麼可以通過某種策略進行抽樣,從而讓我們的資料相對均衡一些;

第二種方案從演算法的角度出發,考慮不同誤分類情況代價的差異性對演算法進行優化,使得我們的演算法在不平衡資料下也能有較好的效果。

某小皮

 

 

 

取樣

這裡寫圖片描述

隨機取樣

取樣演算法通過某一種策略改變樣本的類別分佈,以達到將不平衡分佈的樣本轉化為相對平衡分佈的樣本的目的,而隨機取樣是取樣演算法中最簡單也最直觀易懂的一種方法。

隨機取樣主要分為兩種型別,分別為隨機欠取樣(下采樣)和隨機過取樣(上取樣)兩種。

隨機欠取樣顧名思義即從多數類$S_maj$中隨機選擇少量樣本$E$再合併原有少數類樣本作為新的訓練資料集,新資料集為$S_min+E$,隨機欠取樣有兩種型別分別為有放回和無放回兩種,無放回欠取樣在對多數類某樣本被取樣後不會再被重複取樣,有放回取樣則有可能。隨機過取樣則正好相反,即通過多次有放回隨機取樣從少數類$S_min$中抽取資料集$E$,取樣的數量要大於原有少數類的數量,最終的訓練集為$S_maj+E$。

存在的問題:

對於隨機欠取樣,由於取樣的樣本要少於原樣本集合,因此會造成一些資訊缺失,未被取樣的樣本往往帶有很重要的資訊,模型只學到了總體模式的一部分。

對於隨機過取樣,由於需要對少數類樣本進行復制因此擴大了資料集,造成模型訓練複雜度加大,另一方面也容易造成模型的過擬合問題。上取樣後的資料集中會反覆出現一些樣本,訓練出來的模型會有一定的過擬合;上取樣會把小眾樣本複製多份,一個點會在高維空間中反覆出現,這會導致一個問題,那就是運氣好就能分對很多點,否則分錯很多點。為了解決這一問題,可以在每次生成新資料點時加入輕微的隨機擾動,經驗表明這種做法非常有效。

Note: 值得注意的是,使用過取樣方法來解決不平衡問題時應適當地應用交叉驗證。這是因為過取樣會觀察到罕見的樣本,並根據分佈函式應用自舉生成新的隨機資料,如果在過取樣之後應用交叉驗證,那麼我們所做的就是將我們的模型過擬合於一個特定的人工引導結果。這就是為什麼在過度取樣資料之前應該始終進行交叉驗證,就像實現特徵選擇一樣。只有重複取樣資料可以將隨機性引入到資料集中,以確保不會出現過擬合問題。

[]

針對這些問題提出了幾種其它的取樣演算法。

過取樣的改進

SMOTE演算法:合成樣本

SMOTE全稱是Synthetic Minority Oversampling Technique即合成少數類過取樣技術,它是基於隨機過取樣演算法的一種改進方案,由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的資訊過於特別(Specific)而不夠泛化(General),SMOTE演算法的基本思想是對少數類樣本進行分析並根據少數類樣本人工合成新樣本新增到資料集中,具體如圖2所示,演算法流程如下。

  1. 對於少數類中每一個樣本$x$,以歐氏距離為標準計算它到少數類樣本集$S_min$中所有樣本的距離,得到其k近鄰。
  2. 根據樣本不平衡比例設定一個取樣比例以確定取樣倍率$N$,對於每一個少數類樣本$x$,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為$\hat{x}$。
  3. 對於每一個隨機選出的近鄰$\hat{x}$,分別與原樣本按照如下的公式構建新的樣本。


    圖2 SMOTE演算法


    SMOTE演算法摒棄了隨機過取樣複製樣本的做法,可以防止隨機過取樣易過擬合的問題,實踐證明此方法可以提高分類器的效能。

潛在的問題:一方面是增加了類之間重疊的可能性(由於對每個少數類樣本都生成新樣本,因此容易發生生成樣本重疊(Overlapping)的問題),另一方面是生成一些沒有提供有益資訊的樣本。

SMOTE改進演算法,Borderline-SMOTE與ADASYN。

Borderline-SMOTE

 

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

在Borderline-SMOTE中,若少數類樣本的每個樣本$x_i$求k近鄰,記作$S_i-knn$,且$S_i-knn$屬於整個樣本集合$S$而不再是少數類樣本,若滿足


則將樣本$x_i$加入DANGER集合,顯然DANGER集合代表了接近分類邊界的樣本,將DANGER當作SMOTE種子樣本的輸入生成新樣本。特別地,當上述條件取右邊界,即k近鄰中全部樣本都是多數類時,此樣本不會被選擇為種樣本生成新樣本,此情況下的樣本為噪音。

圖3 Borderline-SMOTE演算法

 

ADASYN

解決思路是根據資料分佈情況為不同小眾樣本生成不同數量的新樣本。首先根據最終的平衡程度設定總共需要生成的新小眾樣本數量 G,然後為每個小眾樣本 xi 計算分佈比例

基於聚類的重抽樣方法

(1)首先分別對正負例進行K-means聚類

(2)聚類之後進行Oversampling等系列方法

舉例說明,假設我們執行K-means方法分別對正負例進行了聚類: 正例三個簇,個數分別為:20 , 5, 12 負例兩個簇,個數分別為:4 ,6

可以看出,正負例簇中個數最大的為20,所以正例其他兩個簇通過oversampling都提高到20個例項,負例簇都提高到(20+20+20)/2=30 個例項。

最後變為,正例三個簇:20,20,20 負例兩個簇:30,30

基於聚類的抽樣演算法的優點:該演算法不僅可以解決類間不平衡問題,而且還能解決類內部不平衡問題。

Sergey Quora提出了一種優雅的方法,他建議不要依賴隨機樣本來覆蓋訓練樣本的種類,而是將r個群體中豐富類別進行聚類,其中r為r中的例數。每個組只保留叢集中心(medoid)。然後,基於稀有類和僅保留的類別對該模型進行訓練。

 

下采樣的改進:Informed Undersampling

既然SMOTE可以解決隨機過取樣容易發生的模型過擬合問題,對應地也有一些取樣方法可以解決隨機欠取樣造成的資料資訊丟失問題,答案是Informed undersampling取樣技術,informed undersampling取樣技術主要有兩種方法分別是EasyEnsemble演算法和BalanceCascade演算法。

 

EasyEnsemble

 

利用模型融合的方法(Ensemble):多次下采樣(放回取樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。簡單的最佳實踐是建立n個模型,每個模型使用稀有類別的所有樣本和豐富類別的n個不同樣本。假設想要合併10個模型,那麼將保留例如1000例稀有類別,並隨機抽取10000例豐富類別。然後,只需將10000個案例分成10塊,並訓練10個不同的模型。

EasyEnsemble演算法如下圖4所示,此演算法類似於隨機森林的Bagging方法,它把資料劃分為兩部分,分別是多數類樣本和少數類樣本,對於多數類樣本$S_maj$,通過n次有放回抽樣生成n份子集,少數類樣本分別和這n份樣本合併訓練一個模型,這樣可以得到n個模型,最終的模型是這n個模型預測結果的平均值。BalanceCascade演算法是一種級聯演算法,BalanceCascade從多數類$S_maj$中有效地選擇N且滿足$\midN\mid=\midS_min\mid$,將N和$\S_min$合併為新的資料集進行訓練,新訓練集對每個多數類樣本$x_i$進行預測若預測對則$S_maj=S_maj-x_i$。依次迭代直到滿足某一停止條件,最終的模型是多次迭代模型的組合。

 

圖4 EasyEsemble演算法

 

 

BalanceCascade

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

NearMiss

利用KNN試圖挑選那些最具代表性的大眾樣本,這類方法計算量很大。 綜述“Learning from Imbalanced Data”的3.2.1節。

某小皮

代價敏感學習

代價矩陣

取樣演算法從資料層面解決不平衡資料的學習問題,在演算法層面上解決不平衡資料學習的方法主要是基於代價敏感學習演算法(Cost-Sensitive Learning),代價敏感學習方法的核心要素是代價矩陣。

我們注意到在實際的應用中不同型別的誤分類情況導致的代價是不一樣的,例如在醫療中,“將病人誤疹為健康人”和“將健康人誤疹為病人”的代價不同;在信用卡盜用檢測中,“將盜用誤認為正常使用”與“將正常使用識破認為盜用”的代價也不相同,因此我們定義代價矩陣如下圖5所示。標記$C_ij$為將類別j誤分類為類別i的代價,顯然$C_00=C_11=0$,$C_01,C_10$為兩種不同的誤分類代價,當兩者相等時為代價不敏感的學習問題。

圖5 代價矩陣

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

代價敏感學習的3種方法

基於以上代價矩陣的分析,代價敏感學習方法主要有以下三種實現方式,分別是:

  1. 從學習模型出發,著眼於對某一具體學習方法的改造,使之能適應不平衡資料下的學習,研究者們針對不同的學習模型如感知機,支援向量機,決策樹,神經網路等分別提出了其代價敏感的版本。以代價敏感的決策樹為例,可從三個方面對其進行改進以適應不平衡資料的學習,這三個方面分別是決策閾值的選擇方面、分裂標準的選擇方面、剪枝方面,這三個方面中都可以將代價矩陣引入,具體實現演算法可參考參考文獻中的相關文章。
  2. 從貝葉斯風險理論出發,把代價敏感學習看成是分類結果的一種後處理,按照傳統方法學習到一個模型,以實現損失最小為目標對結果進行調整,優化公式如下所示。此方法的優點在於它可以不依賴所用具體的分類器,但是缺點也很明顯它要求分類器輸出值為概率。

  3. 從預處理的角度出發,將代價用於權重的調整,使得分類器滿足代價敏感的特性,如基於Adaboost的權重更新策略。

貝葉斯風險理論

再次考慮醫療診斷的問題。我們注意到,如果已給沒有患癌症的病人被錯誤地診斷為患病,結果可能給病人帶來一些壓力,並且病人可能需要進一步確診。相反,如果患癌症的病人被診斷為健康,結果可能會因為缺少治療而使病人過早死亡。因此這兩種錯誤的結果是相當不同的。很明顯,對於第二種錯誤,我們最好少犯,甚至由於少犯第二種錯誤會導致第一種錯誤增加也沒關係。

我們可以通過損失函式( loss function )來形式化地描述這個問題。損失函式也被稱為代價函式( cost function ),是對於所有可能的決策或者動作可能產生的損失的一種整體的度量。我們的目標是最小化整體的損失。注意,有些學者不考慮損失函式,而是考慮效用函式( utility function ),並且要最大化這個函式。如果我們讓效用函式等於損失函式的相反數的話,那麼這些概念是等價的,因此整本書中我們都將使用損失函式這個概念。

假設對於新的 x 的值,真實的類別為 C k ,我們把 x 分類為 C j (其中 j 可能與 k 相等,也可能不相等)。這樣做的結果是,我們會造成某種程度的損失,記作 Lkj ,它可以看成損失矩陣( loss matrix )的第 k, j 個元素。例如,在癌症的例子中,我們可能有圖1.25所示的損失矩陣。這個特別的損失矩陣表明,如果我們做出了正確的決策,那麼不會造成損失。如果健康人被診斷為患有癌症,那麼損失為1。但是如果一個患有癌症的病人被診斷為健康,那麼損失為1000。
最優解是使損失函式最小的解。但是,損失函式依賴於真實的類別,這是未知的(所以需要對所有的ck進行求和或者積分)。對於一個給定的輸入向量 x ,我們對於真實類別的不確定性通過聯合概率分佈 p(x, C k ) 表示。因此,我們轉而去最小化平均損失。平均損失根據這個聯合概率分佈計算,定義為

每一個 x 可以被獨立地分到決策區域 R j 中。我們的目標是選擇區域R j ,來最小化期望損失。這表明,對於每個 x ,我們要最小化 ∑k L kj p(x, C k ) 。和之前一樣,我們可以使用乘積規則 p(x, C k ) = p(C k | x)p(x) 來消除共同因子 p(x) 。因此,最小化期望損失的決策規則是對於每個新的 x ,把它分到能使下式取得最小值的第 j 類:

一旦我們知道了類的後驗概率 p(C k | x) 之後,這件事就很容易做了。

AdaCost演算法

讓我們先來簡單回顧一下Adaboost演算法,如下圖6所示。Adaboost演算法通過反覆迭代,每一輪迭代學習到一個分類器,並根據當前分類器的表現更新樣本的權重,如圖中紅框所示,其更新策略為正確分類樣本權重降低,錯誤分類樣本權重加大,最終的模型是多次迭代模型的一個加權線性組合,分類越準確的分類器將會獲得越大的權重。

圖6 Adaboost演算法


AdaCost演算法修改了Adaboost演算法的權重更新策略,其基本思想是對於代價高的誤分類樣本大大地提高其權重,而對於代價高的正確分類樣本適當地降低其權重,使其權重降低相對較小。總體思想是代價高樣本權重增加得大降低得慢。其樣本權重按照如下公式進行更新。其中$\beta_+$和$\beta_-$分別表示樣本被正確和錯誤分類情況下$\beta$的取值。

其它方法

一分類(One Class Learning)或異常檢測(Novelty Detection)

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

XGBoost

[]

某小皮

 

 

 

不同方法的選擇經驗

選擇合適的方法:

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

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

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

 

某小皮

 

 

 

不平衡學習的評價方法

正確率和F值,G-Mean和ROC曲線和AUC。

[機器學習模型的評價指標和方法 ]

from:

ref: [綜述論文“Learning from Imbalanced Data”]

[不平衡資料下的機器學習方法簡介]*

[機器學習︱非平衡資料處理方式與評估]*

[不平衡資料處理]