机器学习数据不平衡问题及其解决方法
數據不平衡是機器學習任務中的一個常見問題。真實世界中的分類任務中,各個類別的樣本數量往往不是完全平衡的,某一或某些類別的樣本數量遠少于其他類別的情況經常發生,我們稱這些樣本數量較少的類別為少數類,與之相對應的數量較多的類別則被稱為多數類。在很多存在數據不平衡問題的任務中,我們往往更關注機器學習模型在少數類上的表現,一個典型的例子是制造業等領域的缺陷產品檢測任務,在這個任務中,我們希望使用機器學習方法從大量的正常產品中檢測出其中少數幾個存在缺陷的產品,有缺陷產品在所有產品中的占比可能只有十分之一或者百分之一甚至更低。在這個例子里,我們只關心機器學習模型對少數類(有缺陷產品)的查準率和查全率,并不在意模型在多數類(正常產品)上的表現。
1、為什么需要解決數據不平衡問題
1.1 分類器性能下降
在數據不平衡的情況下,少數類樣本的數量遠少于多數類樣本,會產生更多的稀疏樣本(那些樣本數很少的子類中的樣本)。由于缺乏足夠的數據,分類器對稀疏樣本的刻畫能力不足,難以有效的對這些稀疏樣本進行分類。數據不均衡導致的分類器決策邊界偏移也會影響到最終的分類效果。這里以SVM為例,少數類和多數類的每個樣本對優化目標的貢獻都是相同的,但由于多數類樣本的樣本數量遠多于少數類,最終學習到的分類邊界往往更傾向于多數類,導致分類邊界偏移的問題。下圖給出了在一個三分類問題中,不同的數據不平衡程度對應的分類器分類效果示意。從圖中可以看出,隨著數據不平衡程度的增加,分類器分類邊界偏移也逐漸增加,導致最終分類性能下降明顯。
像邏輯回歸或隨機森林這樣開箱即用的分類器,傾向于通過舍去稀有類來泛化模型。
在一個二分類問題中,訓練集中class 1的樣本數比class 2的樣本數是60:1。使用邏輯回歸進行分類,最后結果是其忽略了class 2,即其將所有的訓練樣本都分類為class 1。
在分類任務的數據集中,有三個類別,分別為A,B,C。在訓練集中,A類的樣本占70%,B類的樣本占25%,C類的樣本占5%。最后我的分類器對類A的樣本過擬合了,而對其它兩個類別的樣本欠擬合。
1.2 評價指標不適用
當你在對一個類別不均衡的數據集進行分類時得到了90%的準確度(Accuracy)。當你進一步分析發現,數據集的90%的樣本是屬于同一個類,并且分類器將所有的樣本都分類為該類。在這種情況下,顯然該分類器是無效的。并且這種無效是由于訓練集中類別不均衡而導致的。
可以看到,在計算accuracy時,TP和TN是完全等價的,即每個類別的樣本對accuracy的貢獻是相同的,在數據不均衡的情況下,accuracy難以體現模型對少數類的分類效果,不適合直接使用。
相對于accuracy來說,在數據不平衡的情況下,precision, recall、F、 ROC曲線和ROC AUC值不會受到數據分布的影響,可以更有效的反應分類模型在特定類別上,尤其是少數類上的分類性能。
2、 解決數據不平衡問題的方法
2.1 從數據上解決
2.1.1 數據采樣
采樣(Sampling)方法通過特定的對數據采樣的方式(例如過采樣、降采樣和合成采樣等)改變數據集的數據分布,使得數據集中不同類別的數據分布較為均衡,從而改善數據不平衡問題。可以通過交叉驗證的方式對采樣的效果進行評估。采樣方法中的常見算法可以分為3類:
(1)隨機采樣算法:包括隨機過采樣(Oversampling)和隨機降采樣(Undersampling)等;
(2)合成采樣算法:其中包括SMOTE,Border-line-SMOTE, ADASYN, SMOTE+Tomek, oss等;
(3)基于聚類的采樣算法:例如CBO等。
隨機過采樣算法首先對數據集中的少數類樣本做隨機采樣,然后將采樣出的樣本加入數據集,并多次重復以上流程,得到數據分布更加平衡的數據集。
隨機降采樣算法首先對數據集中的多數類樣本做隨機采樣,然后將采樣出的樣本移出數據集,并多次重復以上流程,得到數據分布更加平衡的數據集。
隨機過采樣和隨機降采樣都可以平衡數據集樣本類別分布,有利于緩解數據不平衡問題。但過采樣會將數據集中的少數類樣本重復多次,易導致模型出現過擬合;降采樣則會去除數據集中部分樣本,導致信息損失問題。
合成采樣方法是對隨機采樣方法的改進,最經典的合成采樣算法是NV Chawla等人在2002年提出的SMOTE(Synthetic Minority Oversampling Technique)算法,對該算法的描述下圖所示。
SMOTE算法是通過從少數類中隨機選取2個樣本,然后使用這2個樣本作為基樣本合成新的樣本,一定程度上可以彌補隨機過采樣的缺陷,但在合成過程中可能會生成大量無效或者低價值樣本。已經有很多基于SMOTE的改進算法,例如Border-line-SMOTE, ADASYN, SMOTE+Tomek, oss等。以Border-line-SMOTE為例,其算法描述如下圖所示。
Border-line SMOTE對原始SMOTE算法的改進主要體現在對基樣本的選擇上,通過優先選擇分類邊界附近樣本作為基樣本的方法來提升合成樣本的價值。
除了合成采樣,還可以加入聚類的方法來改進隨機采樣算法,一種CBO(Cluster-based Oversampling)算法如下圖所示。
CBO算法流程主要包含以下3個步驟:
1)使用聚類算法分別對每個類別的樣本做聚類,獲得多個聚類cluster
2)對多數類的每個cluster做隨機過采樣或合成采樣,使得每個cluster的樣本數滿足:表示多數類中最大cluster的樣本數。
3)對少數類的每個cluster做隨機過采樣或合成采樣,使得每個cluster的樣本數滿足:表示多數類在過采樣之后的樣本數,m_min為少數類聚類之后的聚類數目。
2.2 問題轉化
2.2.1 轉化為異常檢測問題(一分類問題)
對于二分類問題,如果正負樣本分布比例極不平衡,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在于捕捉類間的差別,而是為其中一類進行建模,經典的工作包括One-class SVM等,如下圖所示:
One Class SVM 是指你的訓練數據只有一類正(或者負)樣本的數據, 而沒有另外的一類。在這時,你需要學習的實際上你訓練數據的邊界。而這時不能使用最大化軟邊緣了,因為你沒有兩類的數據。 所以假設最好的邊緣要遠離特征空間中的原點。左邊是在原始空間中的邊界,可以看到有很多的邊界都符合要求,但是比較靠譜的是找一個比較緊的邊界(紅色的)。這個目標轉換到特征空間就是找一個離原點比較遠的邊界,同樣是紅色的直線。當然這些約束條件都是人為加上去的,你可以按照你自己的需要采取相應的約束條件。比如讓你data 的中心離原點最遠。對于正負樣本極不均勻的問題,使用異常檢測,或者一分類問題,也是一個思路。
2.3 從模型上解決
2.3.1代價敏感型方法(調整模型訓練目標函數)
代價敏感型(Cost-Sensitive)方法通過改變在模型訓練過程中,不同類別樣本分類錯誤時候的代價值來獲得具有一定數據傾向性的分類模型。常見的代價敏感型方法有MetaCost, AdaCost, Adaptive Scaling等。
Adaptive Scaling
檢測任務是信息抽取領域非常常見的任務,典型的任務如命名實體識別、關系抽取和事件檢測等。在做檢測任務時,我們可以把待檢測的標簽作為正例,其他標簽作為反例,從而將檢測任務轉換為標準的分類任務。在這種分類任務中,一般使用交叉熵作為損失函數,正例的F值作為評價指標。由于正例(待檢測的標簽)往往非常稀疏,因此這是一個數據不平衡的分類任務。
最小化交叉熵損失等價于最大化Accuracy,而在計算Accuracy時,正負例的每個樣本都是等價的。在計算F值時,正例和反例并非是等價的,這導致評估指標和優化目標出現了背離。因此在設計模型訓練方法時,需要考慮到這種差異,盡量保證訓練目標與評估指標的一致性。
Adaptive Scaling算法借鑒了經濟學中的邊際效用理論:指每新增(或減少)一個單位的商品或服務,它對商品或服務的收益增加(或減少)的效用。在分類任務中,將邊際效用理論中的“商品或服務”替換為分類樣本,收益即為評估指標(F值),此時的邊際效用定義為:每新增(或減少)一個分類正確(錯誤)的樣本,它對評估指標F值增加(或減少)的效用。由此,可以使用每個類別對F值的邊際效用作為其重要程度的衡量。
實際計算時,可以將評估指標對TP和TN的偏導值作為正例和反例的邊際效用值。如果是把Accuracy作為目標,計算正例和反例的邊際效用可以得到:
可以看到,當把Accuracy作為目標時,正例和反例的邊際效用始終是恒定而且相等的,如果是將F值作為目標,可以得到:
正例和反例的邊際效用不再相等,而且在訓練過程中會隨著模型分類能力的變化而動態變化。調整之后的交叉熵損失:
這樣就得到了能夠自動在訓練過程中調整樣本權重的Adaptive Scaling算法,而且該算法不需要引入任何額外的超參數。相比于傳統的cost-sensitive方法,其特點在于:
1)正例和反例的相對重要程度既與正反例的比例有關,也會受到當前模型的分類能力影響
2)反例的重要性會隨著正例分類準確率的提升而增加
3)反例的重要性也會隨著反例分類準確率的提升而增加
4)當precision比recall更重要時,反例的重要性也會增加
2.3.2 集成學習方法
集成學習(Ensemble)是一種通過多分類器融合來獲取更強分類性能的方法,將上兩小節所述采樣方法和代價敏感方法與之結合可以獲得多種基于集成學習的數據不平衡下的學習算法,按照集成學習方法的不同,可以分為以下三類:
1)基于Bagging的方法。主要思想是將采樣方法應用到Bagging算法的抽樣過程中,具體操作時一般是首先從不均衡數據中抽取多個均衡子數據集,分別訓練多個分類器,然后做Bagging模型集成。主要算法包括OverBagging, UnderBagging, UnderOverBagging, IIVotes等。
2)基于Boosting的方法。主要思想是將Boosting方法與采樣方法或代價敏感型方法結合使用,因此又可以分為2小類:
a)代價敏感+Boosting: Boosting過程中更改類別權重,迭代時更關注少數類樣本。主要算法包括AdaCost, CSB1, CSB2, RareBoost, AdaC1等。
b)采樣方法+Boosting: Boosting過程中更改樣本分布,迭代時更關注少數類樣本。主要算法包括SMOTEBoost, MSMOTEBoost, RUSBoost, DataBoost-IM等。
3)Hybrid方法,即將基于Bagging的方法和基于Boosting的方法結合使用,主要算法包括EsayEnsemble和BalanceCascade等。
2.3.3 選擇適用于不平衡數據的算法
某些算法支持不平衡樣本處理,可以通過參數進行配置
參考鏈接
https://cloud.tencent.com/developer/news/300118
https://cloud.tencent.com/developer/news/302617
https://www.cnblogs.com/DjangoBlog/p/7903619.html
https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html
總結
以上是生活随笔為你收集整理的机器学习数据不平衡问题及其解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 下tar打包举例,Linux
- 下一篇: 机器学习中的数据预处理方法与步骤