【机器学习】一文解决样本不均衡(全)
一、樣本不均衡的介紹
1.1 樣本不均衡現象
樣本(類別)樣本不平衡(class-imbalance)指的是分類任務中不同類別的訓練樣例數目差別很大的情況,一般地,樣本類別比例(Imbalance Ratio)(多數類vs少數類)明顯大于1:1(如4:1)就可以歸為樣本不均衡的問題?,F實中,樣本不平衡是一種常見的現象,如:金融欺詐交易檢測,欺詐交易的訂單樣本通常是占總交易數量的極少部分,而且對于有些任務而言少數樣本更為重要。
注:本文主要探討分類任務的類別不均衡,回歸任務的樣本不均衡詳見《Delving into Deep Imbalanced Regression》
1.2 不均衡的根本影響
很多時候我們遇到樣本不均衡問題時,很直接的反應就是去“打破”這種不平衡。但是樣本不均衡有什么影響?有必要去解決嗎?
具體舉個例子,在一個欺詐識別的案例中,好壞樣本的占比是1000:1,而如果我們直接拿這個比例去學習模型的話,因為扔進去模型學習的樣本大部分都是好的,就很容易學出一個把所有樣本都預測為好的模型,而且這樣預測的概率準確率還是非常高的。而模型最終學習的并不是如何分辨好壞,而是學習到了”好 遠比 壞的多“這樣的先驗信息,憑著這個信息把所有樣本都判定為“好”就可以了。這樣就背離了模型學習去分辨好壞的初衷了。
所以,樣本不均衡帶來的根本影響是:模型會學習到訓練集中樣本比例的這種先驗性信息,以致于實際預測時就會對多數類別有側重(可能導致多數類精度更好,而少數類比較差)。如下圖(示例代碼請見:github.com/aialgorithm),類別不均衡情況下的分類邊界會偏向“侵占”少數類的區域。更重要的一點,這會影響模型學習更本質的特征,影響模型的魯棒性。
總結一下也就是,我們通過解決樣本不均衡,可以減少模型學習樣本比例的先驗信息,以獲得能學習到辨別好壞本質特征的模型。
1.3 判斷解決不均衡的必要性
從分類效果出發,通過上面的例子可知,不均衡對于分類結果的影響不一定是不好的,那什么時候需要解決樣本不均衡?
判斷任務是否復雜:復雜度學習任務的復雜度與樣本不平衡的敏感度是成正比的(參見《Survey on deep learning with class imbalance》),對于簡單線性可分任務,樣本是否均衡影響不大。需要注意的是,學習任務的復雜度是相對意義上的,得從特征強弱、數據噪音情況以及模型容量等方面綜合評估。
判斷訓練樣本的分布與真實樣本分布是否一致且穩定,如果分布是一致的,帶著這種正確點的先驗對預測結果影響不大。但是,還需要考慮到,如果后面真實樣本分布變了,這個樣本比例的先驗就有副作用了。
判斷是否出現某一類別樣本數目非常稀少的情況,這時模型很有可能學習不好,類別不均衡是需要解決的,如選擇一些數據增強的方法,或者嘗試如異常檢測的單分類模型。
二、樣本不均衡解決方法
基本上,在學習任務有些難度的前提下,不均衡解決方法可以歸結為:通過某種方法使得不同類別的樣本對于模型學習中的Loss(或梯度)貢獻是比較均衡的。以消除模型對不同類別的偏向性,學習到更為本質的特征。本文從數據樣本、模型算法、目標(損失)函數、評估指標等方面,對個中的解決方法進行探討。
2.1 樣本層面
2.1.1欠采樣、過采樣
最直接的處理方式就是樣本數量的調整了,常用的可以:
欠采樣:減少多數類的數量(如隨機欠采樣、NearMiss、ENN)。
過采樣:盡量多地增加少數類的的樣本數量(如隨機過采樣、以及2.1.2數據增強方法),以達到類別間數目均衡。
還可結合兩者做混合采樣(如Smote+ENN)。
具體還可以參見【scikit-learn的imbalanced-learn.org/stable/user_guide.html以及github的awesome-imbalanced-learning】
2.1.2 數據增強
數據增強(Data Augmentation)是在不實質性的增加數據的情況下,從原始數據加工出更多數據的表示,提高原數據的數量及質量,以接近于更多數據量產生的價值,從而提高模型的學習效果(其實也是過采樣的方法的一種。具體介紹及代碼可見【數據增強】)。如下列舉常用的方法:
基于樣本變換的數據增強
樣本變換數據增強即采用預設的數據變換規則進行已有數據的擴增,包含單樣本數據增強和多樣本數據增強。
單樣本增強(主要用于圖像):主要有幾何操作、顏色變換、隨機擦除、添加噪聲等方法產生新的樣本,可參見imgaug開源庫。
多樣本增強:是通過組合及轉換多個樣本,主要有Smote類(可見imbalanced-learn.org/stable/references/over_sampling.html)、SamplePairing、Mixup等方法在特征空間內構造已知樣本的鄰域值樣本。
基于深度學習的數據增強
生成模型如變分自編碼網絡(Variational Auto-Encoding network, VAE)和生成對抗網絡(Generative Adversarial Network, GAN),其生成樣本的方法也可以用于數據增強。這種基于網絡合成的方法相比于傳統的數據增強技術雖然過程更加復雜, 但是生成的樣本更加多樣。
數據樣本層面解決不均衡的方法,需要關注的是:
隨機欠采樣可能會導致丟棄含有重要信息的樣本。在計算性能足夠下,可以考慮數據的分布信息(通常是基于距離的鄰域關系)的采樣方法,如ENN、NearMiss等。
隨機過采樣或數據增強樣本也有可能是強調(或引入)片面噪聲,導致過擬合。也可能是引入信息量不大的樣本。此時需要考慮的是調整采樣方法,或者通過半監督算法(可借鑒Pu-Learning思路)選擇增強數據的較優子集,以提高模型的泛化能力。
2.2 損失函數的層面
損失函數層面主流的方法也就是常用的代價敏感學習(cost-sensitive),為不同的分類錯誤給予不同懲罰力度(權重),在調節類別平衡的同時,也不會增加計算復雜度。如下常用方法:
2.2.1 class weight
這最常用也就是scikit模型的’class weight‘方法,If ‘balanced’, class weights will be given by n_samples / (n_classes * np.bincount(y)). If a dictionary is given, keys are classes and values are corresponding class weights. If None is given, the class weights will be uniform.,class weight可以為不同類別的樣本提供不同的權重(少數類有更高的權重),從而模型可以平衡各類別的學習。如下圖通過為少數類做更高的權重,以避免決策偏重多數類的現象(類別權重除了設定為balanced,還可以作為一個超參搜索。示例代碼請見github.com/aialgorithm):
clf2?=?LogisticRegression(class_weight={0:1,1:10})??#?代價敏感學習2.2.2 OHEM 和 Focal Loss
In this work, we first point out that the class imbalance can be summarized to the imbalance in difficulty and the imbalance in difficulty can be summarized to the imbalance in gradient norm distribution.?
--原文可見《Gradient Harmonized Single-stage Detector》
上文的大意是,類別的不平衡可以歸結為難易樣本的不平衡,而難易樣本的不平衡可以歸結為梯度的不平衡。按照這個思路,OHEM和Focal loss都做了兩件事:難樣本挖掘以及類別的平衡。(另外的有 GHM、 PISA等方法,可以自行了解)
OHEM(Online Hard Example Mining)算法的核心是選擇一些hard examples(多樣性和高損失的樣本)作為訓練的樣本,針對性地改善模型學習效果。對于數據的類別不平衡問題,OHEM的針對性更強。
Focal loss的核心思想是在交叉熵損失函數(CE)的基礎上增加了類別的不同權重以及困難(高損失)樣本的權重(如下公式),以改善模型學習效果。
2.3 模型層面
模型方面主要是選擇一些對不均衡比較不敏感的模型,比如,對比邏輯回歸模型(lr學習的是全量訓練樣本的最小損失,自然會比較偏向去減少多數類樣本造成的損失),決策樹在不平衡數據上面表現相對好一些,樹模型是按照增益遞歸地劃分數據(如下圖),劃分過程考慮的是局部的增益,全局樣本是不均衡,局部空間就不一定,所以比較不敏感一些(但還是會有偏向性)。相關實驗可見arxiv.org/abs/2104.02240。
解決不均衡問題,更為優秀的是基于采樣+集成樹模型等方法,可以在類別不均衡數據上表現良好。
2.3.1采樣+集成學習
這類方法簡單來說,通過重復組合少數類樣本與抽樣的同樣數量的多數類樣本,訓練若干的分類器進行集成學習。
BalanceCascade BalanceCascade基于Adaboost作為基分類器,核心思路是在每一輪訓練時都使用多數類與少數類數量上相等的訓練集,然后使用該分類器對全體多數類進行預測,通過控制分類閾值來控制FP(False Positive)率,將所有判斷正確的類刪除,然后進入下一輪迭代繼續降低多數類數量。
EasyEnsemble EasyEnsemble也是基于Adaboost作為基分類器,就是將多數類樣本集隨機分成 N 個子集,且每一個子集樣本與少數類樣本相同,然后分別將各個多數類樣本子集與少數類樣本進行組合,使用AdaBoost基分類模型進行訓練,最后bagging集成各基分類器,得到最終模型。示例代碼可見:www.kaggle.com/orange90/ensemble-test-credit-score-model-example
通常,在數據集噪聲較小的情況下,可以用BalanceCascade,可以用較少的基分類器數量得到較好的表現(基于串行的集成學習方法,對噪聲敏感容易過擬合)。噪聲大的情況下,可以用EasyEnsemble,基于串行+并行的集成學習方法,bagging多個Adaboost過程可以抵消一些噪聲影響。此外還有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。
2.3.2 異常檢測
類別不平衡很極端的情況下(比如少數類只有幾十個樣本),將分類問題考慮成異常檢測(anomaly detection)問題可能會更好。
異常檢測是通過數據挖掘方法發現與數據集分布不一致的異常數據,也被稱為離群點、異常值檢測等等。無監督異常檢測按其算法思想大致可分為幾類:基于聚類的方法、基于統計的方法、基于深度的方法(孤立森林)、基于分類模型(one-class SVM)以及基于神經網絡的方法(自編碼器AE)等等。具體方法介紹及代碼可見【異常檢測方法速覽】
2.4 決策及評估指標
本節關注的重點是,當我們采用不平衡數據訓練模型,如何更好決策以及客觀地評估不平衡數據下的模型表現。對于分類常用的precision、recall、F1、混淆矩陣,樣本不均衡的不同程度,都會明顯改變這些指標的表現。
對于類別不均衡下模型的預測,我們可以做分類閾值移動,以調整模型對于不同類別偏好的情況(如模型偏好預測負樣本,偏向0,對應的我們的分類閾值也往下調整),達到決策時類別平衡的目的。這里,通??梢酝ㄟ^P-R曲線,選擇到較優表現的閾值。
對于類別不均衡下的模型評估,可以采用AUC、AUPRC(更優)評估模型表現。AUC的含義是ROC曲線的面積,其數值的物理意義是:隨機給定一正一負兩個樣本,將正樣本預測分值大于負樣本的概率大小。AUC對樣本的正負樣本比例情況是不敏感,即使正例與負例的比例發生了很大變化,ROC曲線面積也不會產生大的變化。具體可見 【 評估指標】
小結:
我們通過解決樣本不均衡,可以減少模型學習樣本比例的先驗信息,以獲得能學習到辨別好壞本質特征的模型。
可以將不均衡解決方法歸結為:通過某種方法使得不同類別的樣本對于模型學習中的Loss(或梯度)貢獻是比較均衡的。具體可以從數據樣本、模型算法、目標函數、評估指標等方面進行優化,其中數據增強、代價敏感學習及采樣+集成學習是比較常用的,效果也是比較明顯的。其實,不均衡問題解決也是結合實際再做方法選擇、組合及調整,在驗證中調優的過程。
- END -文章首發公眾號“算法進階”,文末閱讀原文可訪問文章相關代碼
本站qq群955171419,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【机器学习】一文解决样本不均衡(全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CV】相对位姿估计的进展和新方法
- 下一篇: JeeCG - <t:choose/>