一文全面解決樣本不均衡(Python)

一、樣本不均衡的介紹

1.1 樣本不均衡現(xiàn)象

樣本(類別)樣本不平衡(class-imbalance)指的是分類任務中不同類別的訓練樣例數(shù)目差別很大的情況蓝翰,一般地女嘲,樣本類別比例(多數(shù)類vs少數(shù)類)明顯大于1:1(如4:1)就可以歸為樣本不均衡的問題。現(xiàn)實中爆雹,樣本不平衡是一種常見的現(xiàn)象,如:金融欺詐交易檢測慧起,欺詐交易的訂單樣本通常是占總交易數(shù)量的極少部分册倒,而且對于有些任務而言少數(shù)樣本更為重要。

注:本文主要探討分類任務的類別不均衡灿意,回歸任務的樣本不均衡詳見《Delving into Deep Imbalanced Regression

1.2 不均衡的根本影響

很多時候我們遇到樣本不均衡問題時缤剧,很直接的反應就是去“打破”這種不平衡域慷。但是樣本不均衡有什么影響?有必要去解決嗎兄纺?

先具體舉個例子估脆,在一個欺詐識別的案例中座云,好壞樣本的占比(Imbalance Ratio)是1000:1,而如果我們直接拿這個比例去學習模型的話圃阳,因為扔進去模型學習的樣本大部分都是好的璧帝,就很容易學出一個把所有樣本都預測為好的模型睬隶,而且這樣預測的概率準確率還是非常高的。而模型最終學習的并不是如何分辨好壞银萍,而是學習到了”好 遠比 壞的多“這樣的先驗信息恤左,憑著這個信息把所有樣本都判定為“好”就可以了搀绣。這樣就背離了模型學習去分辨好壞的初衷了链患。

所以锣险,樣本不均衡帶來的根本影響是:模型會學習到訓練集中樣本比例的這種先驗性信息览闰,以致于實際預測時就會對多數(shù)類別有側(cè)重(可能導致多數(shù)類精度更好,而少數(shù)類比較差)崖咨。如下圖(示例代碼請見github.com/aialgorithm)油吭,類別不均衡情況下的分類邊界會“侵占”少數(shù)類的區(qū)域。更重要的一點歌豺,這會影響模型學習更本質(zhì)的特征类咧,影響模型的魯棒性蟹腾。

總結(jié)一下也就是娃殖,我們通過解決樣本不均衡,可以減少模型學習樣本比例的先驗信息堕虹,以獲得能學習到辨別好壞本質(zhì)特征的模型芬首。

1.3 判斷解決不均衡的必要性

從分類效果出發(fā),通過上面的例子可知,不均衡對于分類結(jié)果的影響不一定是不好的波附,那什么時候需要解決樣本不均衡昼钻?

  • 學習任務的復雜度與樣本不平衡的敏感度是成正比的(參見《Survey on deep learning with class imbalance》)然评,對于簡單線性可分任務碗淌,樣本是否均衡影響不大抖锥。需要注意的是,學習任務的復雜度是相對意義上的纳像,得從特征強弱拯勉、數(shù)據(jù)噪音情況以及模型容量等方面綜合評估判哥。

  • 判斷訓練樣本的分布與真實樣本分布是否一致且穩(wěn)定退渗,如果分布是一致的犀勒,帶著這種正確點的先驗對預測結(jié)果影響不大账蓉。但是逾一,還需要考慮到,如果后面真實樣本分布變了箱玷,這個樣本比例的先驗就有副作用了锡足。

  • 出現(xiàn)某一類別樣本數(shù)目非常稀少的情況(樣本不足)壳坪,模型很有可能學習不好。這時類別不均衡是需要解決的沐批,如選擇一些數(shù)據(jù)增強的方法,或者嘗試如異常檢測的單分類模型九孩。

二、樣本不均衡解決方法

基本上煤墙,在學習任務有些難度的前提下仿野,不均衡解決方法可以歸結(jié)為:通過某種方法使得不同類別的樣本對于模型學習中的Loss(或梯度)貢獻是比較均衡的江解。以消除模型對不同類別的偏向性,學習到更為本質(zhì)的特征鳖枕。本文從數(shù)據(jù)樣本桨螺、模型算法、目標函數(shù)魏烫、評估指標等方面哄褒,對個中的解決方法進行探討煌张。

2.1 樣本層面

2.1.1欠采樣、過采樣

最直接的處理方式就是樣本數(shù)量的調(diào)整了链嘀,常用的可以:

  • 減少多數(shù)類的數(shù)量(即欠采樣档玻,如隨機欠采樣、NearMiss霹琼、ENN)枣申。
  • 盡量多地增加少數(shù)類的的樣本數(shù)量(即過采樣,如隨機過采樣、以及2.1.2數(shù)據(jù)增強方法)泊窘,以達到類別間數(shù)目。
  • 還可結(jié)合兩者做混合采樣如(Smote+ENN)瓜贾。
    具體可以參見【scikit-learn的imbalanced-learn.org/stable/user_guide.html以及github的awesome-imbalanced-learning】

2.1.2 數(shù)據(jù)增強

數(shù)據(jù)增強(Data Augmentation)是在不實質(zhì)性的增加數(shù)據(jù)的情況下祭芦,從原始數(shù)據(jù)加工出更多數(shù)據(jù)的表示憔鬼,提高原數(shù)據(jù)的數(shù)量及質(zhì)量,以接近于更多數(shù)據(jù)量產(chǎn)生的價值昌跌,從而提高模型的學習效果(具體介紹及代碼可見【數(shù)據(jù)增強】)照雁。如下列舉常用的方法:

  • 基于樣本變換的數(shù)據(jù)增強

樣本變換數(shù)據(jù)增強即采用預設(shè)的數(shù)據(jù)變換規(guī)則進行已有數(shù)據(jù)的擴增,包含單樣本數(shù)據(jù)增強和多樣本數(shù)據(jù)增強萍诱。

單樣本增強(主要用于圖像):主要有幾何操作裕坊、顏色變換曙求、隨機擦除、添加噪聲等方法產(chǎn)生新的樣本静浴,可參見imgaug開源庫挤渐。

多樣本增強:是通過組合及轉(zhuǎn)換多個樣本,主要有Smote類(可見imbalanced-learn.org/stable/references/over_sampling.html)囤攀、SamplePairing宫纬、Mixup等方法在特征空間內(nèi)構(gòu)造已知樣本的鄰域值樣本。

  • 基于深度學習的數(shù)據(jù)增強

生成模型如變分自編碼網(wǎng)絡(Variational Auto-Encoding network, VAE)和生成對抗網(wǎng)絡(Generative Adversarial Network, GAN)蝌衔,其生成樣本的方法也可以用于數(shù)據(jù)增強噩斟。這種基于網(wǎng)絡合成的方法相比于傳統(tǒng)的數(shù)據(jù)增強技術(shù)雖然過程更加復雜, 但是生成的樣本更加多樣孤个。


數(shù)據(jù)樣本層面的處理齐鲤,需要關(guān)注的是:

  • 隨機欠采樣可能會導致丟棄含有重要信息的樣本。在計算性能足夠下营袜,可以考慮數(shù)據(jù)的分布信息(通常是基于距離的鄰域關(guān)系)的采樣方法丑罪,如ENN、NearMiss等跪另。
  • 隨機過采樣或數(shù)據(jù)增強樣本也有可能是強調(diào)(或引入)片面噪聲免绿,導致過擬合擦盾。也可能是引入信息量不大的樣本。此時需要考慮的是調(diào)整數(shù)據(jù)增強方法辽故,或者通過半監(jiān)督算法(可借鑒Pu-Learning思路)選擇增強數(shù)據(jù)的較優(yōu)子集腐碱,以提高模型的泛化能力。

2.2 loss層面

loss層面的主流也就是常用的代價敏感學習方法(cost-sensitive)喂走,為不同的分類錯誤給予不同懲罰力度(權(quán)重),在調(diào)節(jié)類別平衡的同時乎芳,也不會增加計算復雜度帖池。

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可以為不同類別的樣本提供不同的權(quán)重(少數(shù)類有更高的權(quán)重)帮孔,從而模型可以平衡各類別的學習不撑。 如下圖(具體代碼請見github.com/aialgorithm)通過為少數(shù)類做更高的權(quán)重(類別權(quán)重除了設(shè)定為balanced,還可以作為一個超參搜索)姆坚,避免決策邊界偏重多數(shù)類的現(xiàn)象:

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

類別的不平衡可以歸結(jié)為難易樣本的不平衡兼呵,而難易樣本的不平衡可以歸結(jié)為梯度的不平衡腊敲。按照這個思路,OHEM和Focal loss都做了兩件事:難樣本挖掘以及類別的平衡懂昂。(另外的有 GHM没宾、 PISA等方法,可以自行了解)

  • OHEM(Online Hard Example Mining)算法的核心是選擇一些hard examples(多樣性和高損失的樣本)作為訓練的樣本铲敛,針對性地改善模型學習效果会钝。對于數(shù)據(jù)的類別不平衡問題,OHEM的針對性更強咽弦。

  • Focal loss的核心思想是在交叉熵損失函數(shù)(CE)的基礎(chǔ)上增加了類別的不同權(quán)重以及困難(高損失)樣本的權(quán)重(如下公式)型型,以改善模型學習效果。

2.3 模型層面

模型方面主要是選擇一些對不均衡比較不敏感的模型寺枉,比如绷落,對比邏輯回歸模型,決策樹在不平衡數(shù)據(jù)上面表現(xiàn)相對好一些(樹模型是按照增益遞歸地劃分數(shù)據(jù)筐喳,劃分過程考慮的是局部的增益函喉,全局樣本是不均衡,局部空間就不一定梳毙,所以比較不敏感一些些捐下。相關(guān)實驗可見arxiv.org/abs/2104.02240)。


解決不均衡問題牌废,更為優(yōu)秀的是基于采樣+集成樹模型等方法鸟缕,可以在類別不均衡數(shù)據(jù)上表現(xiàn)良好排抬。

2.3.1采樣+集成學習

這類方法簡單來說,通過重復組合少數(shù)類樣本與抽樣的同樣數(shù)量的多數(shù)類樣本番甩,訓練若干的分類器進行集成學習届搁。


  • BalanceCascade
    BalanceCascade基于Adaboost作為基分類器,核心思路是在每一輪訓練時都使用多數(shù)類與少數(shù)類數(shù)量上相等的訓練集宴胧,然后使用該分類器對全體多數(shù)類進行預測,通過控制分類閾值來控制FP(False Positive)率乞娄,將所有判斷正確的類刪除显歧,然后進入下一輪迭代繼續(xù)降低多數(shù)類數(shù)量。

  • EasyEnsemble
    EasyEnsemble也是基于Adaboost作為基分類器范删,就是將多數(shù)類樣本集隨機分成 N 個子集拷肌,且每一個子集樣本與少數(shù)類樣本相同,然后分別將各個多數(shù)類樣本子集與少數(shù)類樣本進行組合,使用AdaBoost基分類模型進行訓練契沫,最后bagging集成各基分類器,得到最終模型拴清。示例代碼可見:www.kaggle.com/orange90/ensemble-test-credit-score-model-example

通常会通,在數(shù)據(jù)集噪聲較小的情況下,可以用BalanceCascade沪停,可以用較少的基分類器數(shù)量得到較好的表現(xiàn)(基于串行的集成學習方法裳涛,對噪聲敏感容易過擬合)。噪聲大的情況下舷礼,可以用EasyEnsemble郊闯,基于串行+并行的集成學習方法蛛株,bagging多個Adaboost過程可以抵消一些噪聲影響谨履。此外還有RUSB至朗、SmoteBoost、balanced RF等其他集成方法可以自行了解锹引。

2.3.2 異常檢測

類別不平衡很極端的情況下(比如少數(shù)類只有幾十個樣本)嫌变,將分類問題考慮成異常檢測(anomaly detection)問題可能會更好。

異常檢測是通過數(shù)據(jù)挖掘方法發(fā)現(xiàn)與數(shù)據(jù)集分布不一致的異常數(shù)據(jù)东涡,也被稱為離群點倘待、異常值檢測等等。無監(jiān)督異常檢測按其算法思想大致可分為幾類:基于聚類的方法凸舵、基于統(tǒng)計的方法、基于深度的方法(孤立森林)渐苏、基于分類模型(one-class SVM)以及基于神經(jīng)網(wǎng)絡的方法(自編碼器AE)等等琼富。具體方法介紹及代碼可見【異常檢測方法速覽】

2.4 決策及評估指標

本節(jié)關(guān)注的重點是庄新,當我們采用不平衡數(shù)據(jù)訓練模型,如何更好決策以及客觀地評估不平衡數(shù)據(jù)下的模型表現(xiàn)凡蚜。對于分類常用的precision吭从、recall、F1谱醇、混淆矩陣,樣本不均衡的不同程度副渴,都會明顯改變這些指標的表現(xiàn)。

對于類別不均衡下模型的預測斥滤,我們可以做分類閾值移動勉盅,以調(diào)整模型對于不同類別偏好的情況(如模型偏好預測負樣本,偏向0挑胸,對應的我們的分類閾值也往下調(diào)整)宰闰,達到?jīng)Q策時類別平衡的目的。這里解藻,通称系粒可以通過P-R曲線,選擇到較優(yōu)表現(xiàn)的閾值戳粒。


對于類別不均衡下的模型評估蔚约,可以采用AUC涂籽、AUPRC(更優(yōu))評估模型表現(xiàn)。AUC的含義是ROC曲線的面積树枫,其數(shù)值的物理意義是:隨機給定一正一負兩個樣本景东,將正樣本預測分值大于負樣本的概率大小。AUC對樣本的正負樣本比例情況是不敏感搔涝,即使正例與負例的比例發(fā)生了很大變化,ROC曲線面積也不會產(chǎn)生大的變化庄呈。具體可見 【 評估指標】

小結(jié):我們通過解決樣本不均衡,可以減少模型學習樣本比例的先驗信息斜纪,以獲得能學習到辨別好壞本質(zhì)特征的模型文兑。不均衡解決方法可以歸結(jié)為:通過某種方法使得不同類別的樣本對于模型學習中的Loss(或梯度)貢獻是比較均衡的。具體可以從數(shù)據(jù)樣本伪冰、模型算法樟蠕、目標函數(shù)、評估指標等方面進行優(yōu)化寨辩,其中數(shù)據(jù)采樣、代價敏感學習及抽樣+集成學習都是比較常用的耻警,效果也是比較明顯的甸怕。其實,不均衡問題解決也是個根據(jù)實際任務再做方法選擇温兼、組合及調(diào)整武契,在驗證中擇優(yōu)的過程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末届垫,一起剝皮案震驚了整個濱河市全释,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妄迁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件判族,死亡現(xiàn)場離奇詭異,居然都是意外死亡槽惫,警方通過查閱死者的電腦和手機辩撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門合冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峭判,你說我怎么就攤上這事×煮Γ” “怎么了俺泣?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵伏钠,是天一觀的道長。 經(jīng)常有香客問我缎浇,道長,這世上最難降的妖魔是什么华畏? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任尊蚁,我火速辦了婚禮横朋,結(jié)果婚禮上百拓,老公的妹妹穿的比我還像新娘晰甚。我一直安慰自己决帖,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布扁远。 她就那樣靜靜地躺著刻像,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谷羞。 梳的紋絲不亂的頭發(fā)上溜徙,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音雁歌,去河邊找鬼知残。 笑死,一個胖子當著我的面吹牛乏盐,可吹牛的內(nèi)容都是我干的制恍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼何吝,長吁一口氣:“原來是場噩夢啊……” “哼鹃唯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黔酥,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棵帽,沒想到半個月后渣玲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡仗谆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年隶垮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狸吞。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋偏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出威始,到底是詐尸還是另有隱情像街,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布脓斩,位于F島的核電站畴栖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吗讶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一重绷、第九天 我趴在偏房一處隱蔽的房頂上張望纵寝。 院中可真熱鬧,春花似錦葬凳、人聲如沸室奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绒怨。三九已至,卻和暖如春南蹂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晚顷。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工疗疟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策彤。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓店诗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親必搞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容