如何處理分類中的訓練資料集不均衡問題

2021-09-23 14:17:25 字數 2801 閱讀 9451

在分類中,訓練資料不均衡是指不同類別下的樣本數目相差巨大。舉兩個例子:

在乙個二分類問題中,訓練集中class 1的樣本數比上class 2的樣本數的比值為60:1。使用邏輯回歸進行分類,最後結果是其忽略了class 2,將所有的訓練樣本都分類為class 1。

在三分類問題中,三個類別分別為a,b,c,訓練集中a類的樣本佔70%,b類的樣本佔25%,c類的樣本佔5%。最後我的分類器對類a的樣本過擬合了,而對其它兩個類別的樣本欠擬合。

實際上,訓練資料不均衡是常見並且合理的情況。舉兩個例子:

在欺詐交易識別中,絕大部分交易是正常的,只有極少部分的交易屬於欺詐交易。

在客戶流失問題中,絕大部分的客戶是會繼續享受其服務的(非流失物件),只有極少數部分的客戶不會再繼續享受其服務(流失物件)。

那麼訓練資料不均衡會導致什麼問題呢?

如果訓練集的90%的樣本是屬於同乙個類的,而我們的分類器將所有的樣本都分類為該類,在這種情況下,該分類器是無效的,儘管最後的分類準確度為90%。所以在資料不均衡時,準確度(accuracy)這個評價指標參考意義就不大了。實際上,如果不均衡比例超過4:1,分類器就會偏向於大的類別。

首先想到能否獲得更多資料,尤其是小類(該類樣本資料極少)的資料,更多的資料往往能得到更多的分布資訊。

過取樣(over-sampling),對小類的資料樣本進行過取樣來增加小類的資料樣本個數,即取樣的個數大於該類樣本的個數。

欠取樣(under-sampling),對大類的資料樣本進行欠取樣來減少大類的資料樣本個數,即取樣的個數少於該類樣本的個數。

取樣演算法容易實現,效果也不錯,但可能增大模型的偏差(bias),因為放大或者縮小某些樣本的影響相當於改變了原資料集的分布。對不同的類別也要採取不同的取樣比例,但一般不會是1:1,因為與現實情況相差甚遠,壓縮大類的資料是個不錯的選擇。

一種簡單的產生人造資料的方法是:在該類下所有樣本的每個屬性特徵的取值空間中隨機選取乙個組成新的樣本,即屬性值隨機取樣。此方法多用於小類中的樣本,不過它可能破壞原屬性的線性關係。如在影象中,對一幅影象進行扭曲得到另一幅影象,即改變了原影象的某些特徵值,但是該方法可能會產生現實中不存在的樣本。

有一種人造資料的方法叫做smote(synthetic minority over-sampling technique)。smote是一種過取樣演算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本。它基於距離度量選擇小類別下兩個或者更多的相似樣本,然後選擇其中乙個樣本,並隨機選擇一定數量的鄰居樣本對選擇的那個樣本的乙個屬性增加雜訊,每次處理乙個屬性。這樣就構造了許多新資料。

smote演算法的多個不同語言的實現版本: 

1、python: unbalanceddataset模組提供了smote演算法的多種不同實現版本,以及多種重取樣演算法。

2、r: dmwr package。

3、weka: smote supervised filter。

1、使用代價函式時,可以增加小類樣本的權值,降低大類樣本的權值(這種方法其實是產生了新的資料分布,即產生了新的資料集),從而使得分類器將重點集中在小類樣本身上。剛開始,可以設定每個類別的權值與樣本個數比例的倒數,然後可以使用過取樣進行調優。

2、可以把小類樣本作為異常點(outliers),把問題轉化為異常點檢測問題(anomaly detection)。此時分類器需要學習到大類的決策分介面,即分類器是乙個單個類分類器(one class classifier)。

3、由robert e. schapire提出的」the strength of weak learnability」方法,該方法是乙個boosting演算法,它遞迴地訓練三個弱學習器,然後將這三個弱學習器結合起形成乙個強的學習器。演算法流程如下:

•  首先使用原始資料集訓練第乙個學習器l1。 

•  然後使用50%在l1學習正確和50%學習錯誤的那些樣本訓練得到學習器l2,即從l1中學習錯誤的樣本集與學習正確的樣本集中,迴圈取樣一邊乙個。 

•  接著,使用l1與l2不一致的那些樣本去訓練得到學習器l3。 

•  最後,使用投票方式作為最後輸出。 

那麼如何使用該演算法來解決資料不均衡問題呢? 假設是乙個二分類問題,大部分的樣本都是true類。

•  讓l1輸出始終為true。

•  使用50%在l1分類正確的與50%分類錯誤的樣本訓練得到l2,即從l1中學習錯誤的樣本集與學習正確的樣本集中,迴圈取樣一邊乙個。因此,l2的訓練樣本是平衡的。

•  接著使用l1與l2分類不一致的那些樣本訓練得到l3,即在l2中分類為false的那些樣本。

•  最後,結合這三個分類器,採用投票的方式來決定分類結果,因此只有當l2與l3都分類為false時,最終結果才為false,否    則true。

以下方法同樣會破壞某些類的樣本的分布:

•  設超大類中樣本的個數是極小類中樣本個數的l倍,那麼在隨機梯度下降(sgd,stochastic gradient descent)演算法中,每次遇到乙個極小類中樣本進行訓練時,訓練l次。

•  將大類中樣本劃分到l個聚類中,然後訓練l個分類器,每個分類器使用大類中的乙個簇與所有的小類樣本進行訓練得到。最後對這l個分類器採取少數服從多數對未知類別資料進行分類,如果是連續值(**),那麼採用平均值。

•  設小類中有n個樣本。將大類聚類成n個簇,然後使用每個簇的中心組成大類中的n個樣本,加上小類中所有的樣本進行訓練。

如果不想破壞樣本分佈,可以使用全部的訓練集採用多種分類方法分別建立分類器而得到多個分類器,投票產生**結果。

我們已經知道了「準確度(accuracy)」這個評價指標在資料不均衡的情況下有時是無效的。因此在類別不均衡分類任務中,需要使用更有說服力的評價指標來對分類器進行評價。

詳見:參考:類間樣本數量不平衡對分類模型效能的影響問題

在分類中如何處理訓練集中不平衡問題

在很多機器學習任務中,訓練集中可能會存在某個或某些類別下的樣本數遠大於另一些類別下的樣本數目。即類別不平衡,為了使得學習達到更好的效果,因此需要解決該類別不平衡問題。什麼是類別不均衡問題 類別資料不均衡是分類任務中乙個典型的存在的問題。簡而言之,即資料集中,每個類別下的樣本數目相差很大。例如,在乙個...

在分類中如何處理訓練集中不平衡問題

在很多機器學習任務中,訓練集中可能會存在某個或某些類別下的樣本數遠大於另一些類別下的樣本數目。即類別不平衡,為了使得學習達到更好的效果,因此需要解決該類別不平衡問題。什麼是類別不均衡問題 類別資料不均衡是分類任務中乙個典型的存在的問題。簡而言之,即資料集中,每個類別下的樣本數目相差很大。例如,在乙個...

如何處理svhn資料集的mat檔案

碰到的問題 參考文件 mat格式的檔案是matlab的資料儲存標準格式。根據網上的教程,我首先用scipy庫處理mat檔案 import scipy.io as scio data scio.loadmat r d datasets svt train digitstruct.mat data.ke...