(定義,舉例,實例,問題,擴充,采樣,人造,改變)
一、不平衡數據集
1)定義
不平衡數據集指的是數據集各個類別的樣本數目相差巨大。以二分類問題為例,假設正類的樣本數量遠大於負類的樣本數量,這種情況下的數據稱為不平衡數據
2)舉例
在二分類問題中,訓練集中class 1的樣本數比上class 2的樣本數的比值為60:1。使用邏輯回歸進行分類,最后結果是其忽略了class 2,將所有的訓練樣本都分類為class 1
在三分類問題中,三個類別分別為A,B,C,訓練集中A類的樣本占70%,B類的樣本占25%,C類的樣本占5%。最后我的分類器對類A的樣本過擬合了,而對其它兩個類別的樣本欠擬合
3)實例
訓練數據不均衡是常見並且合理的情況,比如:
a)在欺詐交易識別中,絕大部分交易是正常的,只有極少部分的交易屬於欺詐交易
b)在客戶流失問題中,絕大部分的客戶是會繼續享受其服務的(非流失對象),只有極少數部分的客戶不會再繼續享受其服務(流失對象)
4)導致的問題
如果訓練集的90%的樣本是屬於同一個類的,而我們的分類器將所有的樣本都分類為該類,在這種情況下,該分類器是無效的,盡管最后的分類准確度為90%。所以在數據不均衡時,准確度(Accuracy)這個評價指標參考意義就不大了
實際上,如果不均衡比例超過4:1,分類器就會偏向於大的類別
二、不平衡數據集常用的處理方法
(1)擴充數據集
首先想到能否獲得更多數據,尤其是小類(該類樣本數據極少)的數據
(2)對數據集進行重采樣
a)過采樣(over-sampling):對小類的數據樣本進行過采樣來增加小類的數據樣本個數
from imblearn.over_sampling import RandomOverSampler ros=RandomOverSampler(random_state=0) #采用隨機過采樣(上采樣) x_resample,y_resample=ros.fit_sample(trainset,labels)
b)欠采樣(under-sampling):對大類的數據樣本進行欠采樣來減少大類的數據樣本個數
from imblearn.under_sampling import RandomUnderSampler #通過設置RandomUnderSampler中的replacement=True參數, 可以實現自助法(boostrap)抽樣 #通過設置RandomUnderSampler中的ratio參數,可以設置數據采樣比例 rus=RandomUnderSampler(ratio=0.4,random_state=0,replacement=True) #采用隨機欠采樣(下采樣) x_resample,y_resample=rus.fit_sample(trainset,labels)
(3)人造數據
a)屬性值隨機采樣
在該類下所有樣本的每個屬性特征的取值空間中隨機選取一個組成新的樣本,即屬性值隨機采樣。此方法多用於小類中的樣本,但是該方法可能會產生現實中不存在的樣本
b)SMOTE(Synthetic Minority Over-sampling Technique)
SMOTE是一種過采樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本
原理簡單來說:
原始數據分布(需要增加紅色樣本來平衡數據集)
Smote算法的思想其實很簡單,先隨機選定n個少類的樣本,如下圖:
再找出最靠近它的m個少類樣本,如下圖:
再任選最臨近的m個少類樣本中的任意一點:
在這兩點連線上任選一點(對二維數據來說),這點就是新增的數據樣本:
對於高維數據來說,從m個最鄰近樣本點中隨機選出一個點后(即上面圖中的虛框中的點),求出兩個方框中點的距離(如歐式距離),再從\([0, 1]\)中隨機選擇一個數,乘以距離差得到新的數據點:
(4)改變分類算法
a)使用代價函數時,可以增加小類樣本的權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集),從而使得分類器將重點集中在小類樣本身上。剛開始,可以設置每個類別的權值與樣本個數比例的倒數
b)可以把小類樣本作為異常點(outliers),把問題轉化為異常點檢測問題(anomaly detection)。此時分類器需要學習到大類的決策分界面,即分類器是一個單個類分類器(One Class Classifier)
三、參考
本文參考:https://blog.csdn.net/asialee_bird/article/details/83714612
感謝!