樣本不平衡問題如何解決
1. 什么是樣本不平衡問題?
所謂的類別不平衡問題指的是數據集中各個類別的樣本數量極不均衡。以二分類問題為例,假設正類的樣本數量遠大於負類的樣本數量,通常情況下把樣本類別比例超過4:1(也有說3:1)的數據就可以稱為不平衡數據。
樣本不平衡實際上是一種非常常見的現象。比如:在欺詐交易檢測,欺詐交易的訂單應該是占總交易數量極少部分;工廠中產品質量檢測問題,合格產品的數量應該是遠大於不合格產品的;信用卡的征信問題中往往就是正樣本居多。
2. 樣本不平衡會對我們模型的訓練帶來哪些影響呢?
簡單來講,樣本不平衡會使得我們的分類模型存在很嚴重的偏向性,但是從一些常用的指標上又無法看出來。舉一個極端一點的例子,如果正負樣本比例為100:1,那豈不是把全部樣本都判定為正樣本就有99%+的分類准確率了。從測試結果上來看,就表現為有太多的False Positive。
在來看一個“恐怖”的例子,直觀的感受一下樣本不平衡問題:
你根據1000個正樣本和1000個負樣本正確訓練出了一個准確率90%召回率90%的分類器,且通過實驗驗證沒有欠采樣過采樣的問題哦完美的樣本,完美的模型,破費,你心里暗自得意。然后模型上線,正式預測每天的未知樣本。
開始一切都很美好,准確率召回率都很好。直到有一天,數據發生了一點變化,還是原來的數據類型和特征,只是每天新數據中正負樣本變成了100個正樣本,10000個負樣本。注意,先前准確率90%的另一種表達是負樣本有10%的概率被誤檢為正樣本。好了,模型不變,現在誤檢的負樣本數是100000.1=1000個,正樣本被檢出1000.9(召回)=90個,好了,這個時候召回率不變仍為90%,但是新的准確率=90/(1000+90)=8.26% 。震驚嗎!?恐怖嗎!?
結論: 同一個模型僅僅是改變了驗證集的正負樣本比例,模型已經從可用退化成不可用了!!樣本不平衡問題可怕就可怕在這,往往你的模型參數,訓練,數據,特征都是對的!能做的都做了,但你的准確率就是上不去!!絕望吧。。。。。。
—————摘自《解決樣本不平衡問題的奇技淫巧 匯總》 作者: songhk0209
3. 在機器學習中解決樣本不平衡問題有哪些通用的解決策略?
在機器學習中,處理樣本不平衡問題,主要有2中策略:從數據角度和從算法層面。
從數據角度出發,通常的方法包括了:
-
擴大數據集
-
- 當遇到類別不均衡問題時,首先應該想到,是否可能再增加數據(一定要有小類樣本數據),更多的數據往往戰勝更好的算法。因為機器學習是使用現有的數據多整個數據的分布進行估計,因此更多的數據往往能夠得到更多的分布信息,以及更好分布估計。即使再增加小類樣本數據時,又增加了大類樣本數據,也可以使用放棄一部分大類數據(即對大類數據進行欠采樣)來解決。
-
數據集重采樣
-
-
可以使用一些策略該減輕數據的不平衡程度。該策略便是采樣(sampling),主要有兩種采樣方法來降低數據的不平衡性。
-
對小類的數據樣本進行采樣來增加小類的數據樣本個數,即過采樣(over-sampling ,采樣的個數大於該類樣本的個數)。
-
對大類的數據樣本進行采樣來減少該類數據樣本的個數,即欠采樣(under-sampling,采樣的次數少於該類樣本的個素)。
-
- 考慮對大類下的樣本(超過1萬、十萬甚至更多)進行欠采樣,即刪除部分樣本;
- 考慮對小類下的樣本(不足1為甚至更少)進行過采樣,即添加部分樣本的副本;
- 考慮嘗試隨機采樣與非隨機采樣兩種采樣方法;
- 考慮對各類別嘗試不同的采樣比例,比一定是1:1,有時候1:1反而不好,因為與現實情況相差甚遠;
- 考慮同時使用過采樣與欠采樣。
-
-
人工產生數據樣本
-
-
一種簡單的人工樣本數據產生的方法便是,對該類下的所有樣本每個屬性特征的取值空間中隨機選取一個組成新的樣本,即屬性值隨機采樣。你可以使用基於經驗對屬性值進行隨機采樣而構造新的人工樣本,或者使用類似朴素貝葉斯方法假設各屬性之間互相獨立進行采樣,這樣便可得到更多的數據,但是無法保證屬性之前的線性關系(如果本身是存在的)。
-
有一個系統的構造人工數據樣本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一種過采樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本,即該算法構造的數據是新樣本,原數據集中不存在的。該基於距離度量選擇小類別下兩個或者更多的相似樣本,然后選擇其中一個樣本,並隨機選擇一定數量的鄰居樣本對選擇的那個樣本的一個屬性增加噪聲,每次處理一個屬性。這樣就構造了更多的新生數據。具體可以參見原始論文。 這里有SMOTE算法的多個不同語言的實現版本:
-
- Python: UnbalancedDataset模塊提供了SMOTE算法的多種不同實現版本,以及多種重采樣算法。
- R: DMwR package。
- Weka: SMOTE supervised filter。
-
-
基於異常檢測的方式
-
- 我們可以從不同於分類的角度去解決數據不均衡性問題,我們可以把那些小類的樣本作為異常點(outliers),因此該問題便轉化為異常點檢測(anomaly detection)與變化趨勢檢測問題(change detection)。
- 異常點檢測即是對那些罕見事件進行識別。如通過機器的部件的振動識別機器故障,又如通過系統調用序列識別惡意程序。這些事件相對於正常情況是很少見的。
- 變化趨勢檢測類似於異常點檢測,不同在於其通過檢測不尋常的變化趨勢來識別。如通過觀察用戶模式或銀行交易來檢測用戶行為的不尋常改變。
- 將小類樣本作為異常點這種思維的轉變,可以幫助考慮新的方法去分離或分類樣本。這兩種方法從不同的角度去思考,讓你嘗試新的方法去解決問題。
從算法角度出發,通常的方法包括了:
-
嘗試不同的分類算法
-
- 強烈建議不要對待每一個分類都使用自己喜歡而熟悉的分類算法。應該使用不同的算法對其進行比較,因為不同的算法使用於不同的任務與數據。具體可以參見“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
- 決策樹往往在類別不均衡數據上表現不錯。它使用基於類變量的划分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。目前流行的決策樹算法有:C4.5、C5.0、CART和Random Forest等。
-
對小類錯分進行加權懲罰
-
- 對分類器的小類樣本數據增加權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集,譯者注),從而使得分類器將重點集中在小類樣本身上。一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加“關心”小類樣本。如penalized-SVM和penalized-LDA算法。
- 對小樣本進行過采樣(例如含L倍的重復數據),其實在計算小樣本錯分cost functions時會累加L倍的懲罰分數。
-
從重構分類器的角度出發
-
-
仔細對你的問題進行分析與挖掘,是否可以將你的問題划分成多個更小的問題,而這些小問題更容易解決。你可以從這篇文章In classification, how do you handle an unbalanced training set?中得到靈感。例如:
-
- 將你的大類壓縮成小類;
- 使用One Class分類器(將小類作為異常點);
- 使用集成方式,訓練多個分類器,然后聯合這些分類器進行分類;
- 將二分類問題改成多分類問題
-
參考:https://blog.csdn.net/heyongluoyao8/article/details/49408131, 作者:一只鳥的天空
4. 在深度學習中,有哪些解決樣本不平衡的方法?
深度學習同樣屬於機器學習中的一種典型方法,所以在機器學習中適用的方法在深度學習中同樣適用。比如說:擴大數據集、類別均衡采樣、人工產生數據樣本,添加少類別樣本的來loss懲罰項等。
對於數據的方法,這里我們重點介紹:類別均衡采樣
把樣本按類別分組,每個類別生成一個樣本列表,訓練過程中先隨機選擇1個或幾個類別,然后從各個類別所對應的樣本列表里選擇隨機樣本。這樣可以保證每個類別參與訓練的機會比較均等。
上述方法需要對於樣本類別較多任務首先定義與類別相等數量的列表,對於海量類別任務如ImageNet數據集等此舉極其繁瑣。海康威視研究院提出類別重組的平衡方法。
類別重組法只需要原始圖像列表即可完成同樣的均勻采樣任務,步驟如下:
\1. 首先按照類別順序對原始樣本進行排序,之后計算每個類別的樣本數目,並記錄樣本最多那個類的樣本數目。之后,根據這個最多樣本數對每類樣本產生一個隨機排列的列表, 然后用此列表中的隨機數對各自類別的樣本數取余,得到對應的索引值。接着,根據索引從該類的圖像中提取圖像,生成該類的圖像隨機列表。之后將所有類的隨機列表連在一起隨機打亂次序,即可得到最終的圖像列表,可以發現最終列表中每類樣本數目均等。根據此列表訓練模型,在訓練時列表遍歷完畢,則重頭再做一遍上述操作即可進行第二輪訓練,如此往復。 類別重組法的優點在於,只需要原始圖像列表,且所有操作均在內存中在線完成,易於實現。
從圖像和文本數據的角度出發,我們來看一下有哪些方法?
對於圖像數據,解決樣本不平衡問題,在深度學習中會用到的方法包括了:類別均衡采樣(上已經描述),可以用來解決分類問題。
另外,在筆者看來還值得介紹的方法包括了:OHEM和focal loss。
-
OHEM
OHEM(online hard example miniing)算法的核心思想是根據輸入樣本的損失進行篩選,篩選出hard example,表示對分類和檢測影響較大的樣本,然后將篩選得到的這些樣本應用在隨機梯度下降中訓練。在實際操作中是將原來的一個ROI Network擴充為兩個ROI Network,這兩個ROI Network共享參數。其中前面一個ROI Network只有前向操作,主要用於計算損失;后面一個ROI Network包括前向和后向操作,以hard example作為輸入,計算損失並回傳梯度。作者將該算法應用在Fast RCNN中,網絡結構還是采用VGG16和VGG_CNN_M_1024,數據集主要采用VOC2007,VOC2012和COCO數據集。
算法優點:1、對於數據的類別不平衡問題不需要采用設置正負樣本比例的方式來解決,這種在線選擇方式針對性更強。2、隨着數據集的增大,算法的提升更加明顯(作者是通過在COCO數據集上做實驗和VOC數據集做對比,因為前者的數據集更大,而且提升更明顯,所以有這個結論)。算法的測試結果:在pascal VOC2007上的mAP為78.9%,在pascal VOC2012上的mAP為76.3%。注意,這些結果的得到包含了一些小tricks,比如multi-scale test(測試時候采用多尺度輸入),bounding box的不斷迭代回歸。
代碼的github地址:https://github.com/abhi2610/ohem
-
Focal Loss
Focal loss主要是為了解決one-stage目標檢測中正負樣本比例嚴重失衡的問題。主旨是:ssd按照ohem選出了loss較大的,但忽略了那些loss較小的easy的負樣本,雖然這些easy負樣本loss很小,但數量多,加起來的loss較大,對最終loss有一定貢獻。作者想把這些loss較小的也融入到loss計算中。但如果直接計算所有的loss,loss會被那些easy的負樣本主導,因為數量太多,加起來的loss就大了。也就是說,作者是想融入一些easy example,希望他們能有助於訓練,但又不希望他們主導loss。這個時候就用了公式進行衰減那些easy example,讓他們對loss做貢獻,但又不至於主導loss,並且通過balanced crossentropy平衡類別。OHEM是只取3:1的負樣本去計算loss,之外的負樣本權重置零,而focal loss取了所有負樣本,根據難度給了不同的權重。
focal loss相比OHEM的提升點在於,3:1的比例比較粗暴,那些有些難度的負樣本可能游離於3:1之外。之前實驗中曾經調整過OHEM這個比例,發現是有好處的,現在可以試試focal loss了。對於文本數據而言,怎樣解決樣本不平衡問題?
這里推薦閱讀知乎相關問題(我就不胡扯了~~~手動捂臉):嚴重數據傾斜文本分類,比如正反比1:20~100,適合什么model,查准一般要做到多少可以上線?
比如新聞的廣告色情低俗識別,這些小類別在實際分布中一定是占比極小1:20甚至不到百分之一。傳統的詞表權重組合規則,只能預防一小部分(召回會非常低,但是准確率不會特別低)。而模型如果訓練時候用1:1配平(個人覺得不能超過1:3,也做過大量實驗),即使使用了加權懲罰,或者類似smote或者組合的上下采樣方法,模型在1:1測試時即使達到90%的查准,放到1:20的環境查准也會大幅度降低到30%(試過xgboost,libsvm,libliner,fasttext等,近乎線性成比例降低,cnn目前效果和前面類似,加了earlystop,dropout最合適的還是原始論文參數)。
像這種正反比嚴重數據傾斜的分類識別問題,有沒有更合適的方法呢?還是我忽略了哪些地方?鏈接地址: https://www.zhihu.com/question/59236897/answer/164500508
推薦閱讀:【小夕精選】如何優雅而時髦的解決不均衡分類問題
在文本分類任務中,有哪些論文中很少提及卻對性能有重要影響的tricks?5. 從模型評價指標的角度,重新審視訓練好的模型性能。
從前面的分析可以看出,准確度這個評價指標在類別不均衡的分類任務中並不能work,甚至進行誤導(分類器不work,但是從這個指標來看,該分類器有着很好的評價指標得分)。因此在類別不均衡分類任務中,需要使用更有說服力的評價指標來對分類器進行評價。這里推薦指標:
-
混淆矩陣(Confusion Matrix):使用一個表格對分類器所預測的類別與其真實的類別的樣本統計,分別為:TP、FN、FP與TN。
-
精確度(Precision)
-
召回率(Recall)
-
F1得分(F1 Score):精確度與找召回率的加權平均。
-
Kappa (Cohen kappa)
-
ROC曲線(ROC Curves):見Assessing and Comparing Classifier Performance with ROC Curves