類別不平衡問題
類別不平衡問題,顧名思義,即數據集中存在某一類樣本,其數量遠多於或遠少於其他類樣本,從而導致一些機器學習模型失效的問題。例如邏輯回歸即不適合處理類別不平衡問題,例如邏輯回歸在欺詐檢測問題中,因為絕大多數樣本都為正常樣本,欺詐樣本很少,邏輯回歸算法會傾向於把大多數樣本判定為正常樣本,這樣能達到很高的准確率,但是達不到很高的召回率。
類別不平衡問題在很多場景中存在,例如欺詐檢測,風控識別,在這些樣本中,黑樣本(一般為存在問題的樣本)的數量一般遠少於白樣本(正常樣本)。
上采樣(過采樣)
和下采樣(負采樣)策略是解決類別不平衡問題的基本方法之一。上采樣即增加少數類樣本的數量,下采樣即減少多數類樣本以獲取相對平衡的數據集。
最簡單的上采樣方法可以直接將少數類樣本復制幾份后添加到樣本集中,最簡單的下采樣則可以直接只取一定百分比的多數類樣本作為訓練集。
SMOTE算法是用的比較多的一種上采樣算法,SMOTE算法的原理並不是太復雜,用python從頭實現也只有幾十行代碼,但是python的imblearn包提供了更方便的接口,在需要快速實現代碼的時候可直接調用imblearn。
imblearn類別不平衡包提供了上采樣和下采樣策略中的多種接口,基本調用方式一致,主要介紹一下對應的SMOTE方法和下采樣中的RandomUnderSampler方法。imblearn可使用pip
install
imblearn直接安裝。
代碼示例
生成類別不平衡數據
# 使用sklearn的make_classification生成不平衡數據樣本
from sklearn.datasets import make_classification
# 生成一組0和1比例為9比1的樣本,X為特征,y為對應的標簽
X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.9, 0.1], n_informative=3,
n_redundant=1, flip_y=0
n_features = 20, n_clusters_per_class = 1,
n_samples = 1000, random_state = 10)
查看數據分布
from collections import Counter
# 查看所生成的樣本類別分布,0和1樣本比例9比1,屬於類別不平衡數據
print(Counter(y))
# Counter({0: 900, 1: 100})
SMOTE算法核心語句
# 使用imlbearn庫中上采樣方法中的SMOTE接口
from imblearn.over_sampling import SMOTE
# 定義SMOTE模型,random_state相當於隨機數種子的作用
smo = SMOTE(random_state=42)
X_smo, y_smo = smo.fit_sample(X, y)
查看經過SMOTE之后的數據分布
print(Counter(y_smo))
# Counter({0: 900, 1: 900})
從上述代碼中可以看出,SMOTE模型默認生成一比一的數據,如果想生成其他比例的數據,可以使用radio參數。不僅可以處理二分類問題,同樣適用於多分類問題
# 可通過radio參數指定對應類別要生成的數據的數量
smo = SMOTE(ratio={1: 300}, random_state=42)
# 生成0和1比例為3比1的數據樣本
X_smo, y_smo = smo.fit_sample(X, y)
print(Counter(y_smo))
# Counter({0: 900, 1: 300})
imblearn中上采樣接口提供了隨機上采樣RandomOverSampler,SMOTE,ADASYN三種方式,調用方式和主要參數基本一樣。下采樣接口中也提供了多種方法,以RandomUnderSampler為例。
from imblearn.under_sampling import RandomUnderSampler
# 同理,也可使用ratio來指定下采樣的比例
rus = RandomUnderSampler(ratio={0: 500}, random_state=0)
X_rus, y_rus = rus.fit_sample(X, y)
print(Counter(y_smo))
# Counter({0: 500, 1: 300})