什么是類別不平衡問題。其實,在現(xiàn)實環(huán)境中,采集的數(shù)據(jù)(建模樣本)往往是比例失衡的。比如網(wǎng)貸數(shù)據(jù),逾期人數(shù)的比例是極低的(千分之幾的比例);奢侈品消費人群鑒定等。
1、類別不平衡數(shù)據(jù)集基本介紹
在這一節(jié)中,我們一起看一下,當遇到數(shù)據(jù)類別不平衡的時候,我們該如何處理。在Python中,有Imblearn包,它就是為處理數(shù)據(jù)比例失衡而生的。
pip3 install imbalanced-learn
第三方包鏈接:https://pypi.org/project/imbalanced-learn/
創(chuàng)造數(shù)據(jù)集
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
#使用make_classification生成樣本數(shù)據(jù)
X, y = make_classification(n_samples=5000,
n_features=2, # 特征個數(shù)= n_informative() + n_redundant + n_repeated
n_informative=2, # 多信息特征的個數(shù)
n_redundant=0, # 冗余信息,informative特征的隨機線性組合
n_repeated=0, # 重復(fù)信息,隨機提取n_informative和n_redundant 特征
n_classes=3, # 分類類別
n_clusters_per_class=1, # 某一個類別是由幾個cluster構(gòu)成的
weights=[0.01, 0.05, 0.94], # 列表類型,權(quán)重比
random_state=0)
查看各個標簽的樣本
#查看各個標簽的樣本量
from collections import Counter
Counter(y)
# Counter({2: 4674, 1: 262, 0: 64})
數(shù)據(jù)集可視化
# 數(shù)據(jù)集可視化
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
可以看出樣本的三個標簽中,1,2的樣本量極少,樣本失衡。下面使用imblearn進行過采樣。
接下來,我們就要基于以上數(shù)據(jù),進行相應(yīng)的處理。
關(guān)于類別不平衡的問題,主要有兩種處理方式:
過采樣方法
增加數(shù)量較少那一類樣本的數(shù)量,使得正負樣本比例均衡。
欠采樣方法
減少數(shù)量較多那一類樣本的數(shù)量,使得正負樣本比例均衡。
2、解決類別不平衡數(shù)據(jù)方法介紹
2.1 過采樣方法
2.1.1 什么是過采樣方法
對訓(xùn)練集里的少數(shù)類進行“過采樣”(oversampling),即增加一些少數(shù)類樣本使得正、反例數(shù)目接近,然后再進行學(xué)習(xí)。
2.1.2 隨機過采樣方法
通過代碼實現(xiàn)隨機過采樣方法:
# 使用imblearn進行隨機過采樣
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)
#查看結(jié)果
Counter(y_resampled)
#過采樣后樣本結(jié)果
# Counter({2: 4674, 1: 4674, 0: 4674})
# 數(shù)據(jù)集可視化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
缺點:
·對于隨機過采樣,由于需要對少數(shù)類樣本進行復(fù)制來擴大數(shù)據(jù)集,造成模型訓(xùn)練復(fù)雜度加大。
·另一方面也容易造成模型的過擬合問題,因為隨機過采樣是簡單的對初始樣本進行復(fù)制采樣,這就使得學(xué)習(xí)器學(xué)得的規(guī)則過于具體化,不利于學(xué)習(xí)器的泛化性能,造成過擬合問題。
為了解決隨機過采樣中造成模型過擬合問題,又能保證實現(xiàn)數(shù)據(jù)集均衡的目的,出現(xiàn)了過采樣法代表性的算法SMOTE算法。
2.1.3 過采樣代表性算法-SMOTE
SMOTE全稱是Synthetic Minority Oversampling即合成少數(shù)類過采樣技術(shù)。
SMOTE算法是對隨機過采樣方法的一個改進算法,由于隨機過采樣方法是直接對少數(shù)類進行重采用,會使訓(xùn)練集中有很多重復(fù)的樣本,容易造成產(chǎn)生的模型過擬合問題。而SMOTE算法的基本思想:
代碼實現(xiàn):
# SMOTE過采樣
from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = SMOTE().fit_resample(X, y)
Counter(y_resampled)
# 采樣后樣本結(jié)果
# [(0, 4674), (1, 4674), (2, 4674)]
# 數(shù)據(jù)集可視化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
2.2 欠采樣方法
2.2.1 什么是欠采樣方法
直接對訓(xùn)練集中多數(shù)類樣本進行“欠采樣”(undersampling),即去除一些多數(shù)類中的樣本使得正例、反例數(shù)目接近,然后再進行學(xué)習(xí)。
# 隨機欠采樣
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X, y)
Counter(y_resampled)
# 采樣后結(jié)果
[(0, 64), (1, 64), (2, 64)]
# 數(shù)據(jù)集可視化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
缺點:
隨機欠采樣方法通過改變多數(shù)類樣本比例以達到修改樣本分布的目的,從而使樣本分布較為均衡,但是這也存在一些問題。對于隨機欠采樣,由于采樣的樣本集合要少于原來的樣本集合,因此會造成一些信息缺失,即將多數(shù)類樣本刪除有可能會導(dǎo)致分類器丟失有關(guān)多數(shù)類的重要信息。
官網(wǎng)鏈接:https://imbalanced-learn.readthedocs.io/en/stable/ensemble.html
猜你喜歡:
語言模型-BERT:bert算法介紹
如何成為頂級開源項目的貢獻者
美國限制中國人工智能發(fā)展?被限技術(shù)傳智播客早已有相關(guān)課程在授