什么是類別不平衡問題。其實(shí),在現(xiàn)實(shí)環(huán)境中,采集的數(shù)據(jù)(建模樣本)往往是比例失衡的。比如網(wǎng)貸數(shù)據(jù),逾期人數(shù)的比例是極低的(千分之幾的比例);奢侈品消費(fèi)人群鑒定等。
1、類別不平衡數(shù)據(jù)集基本介紹
在這一節(jié)中,我們一起看一下,當(dāng)遇到數(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特征的隨機(jī)線性組合
n_repeated=0, # 重復(fù)信息,隨機(jī)提取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)
查看各個標(biāo)簽的樣本
#查看各個標(biāo)簽的樣本量
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()
可以看出樣本的三個標(biāo)簽中,1,2的樣本量極少,樣本失衡。下面使用imblearn進(jìn)行過采樣。
接下來,我們就要基于以上數(shù)據(jù),進(jìn)行相應(yīng)的處理。
關(guān)于類別不平衡的問題,主要有兩種處理方式:
過采樣方法
增加數(shù)量較少那一類樣本的數(shù)量,使得正負(fù)樣本比例均衡。
欠采樣方法
減少數(shù)量較多那一類樣本的數(shù)量,使得正負(fù)樣本比例均衡。
2、解決類別不平衡數(shù)據(jù)方法介紹
2.1 過采樣方法
2.1.1 什么是過采樣方法
對訓(xùn)練集里的少數(shù)類進(jìn)行“過采樣”(oversampling),即增加一些少數(shù)類樣本使得正、反例數(shù)目接近,然后再進(jìn)行學(xué)習(xí)。
2.1.2 隨機(jī)過采樣方法
通過代碼實(shí)現(xiàn)隨機(jī)過采樣方法:
# 使用imblearn進(jìn)行隨機(jī)過采樣
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()
缺點(diǎn):
·對于隨機(jī)過采樣,由于需要對少數(shù)類樣本進(jìn)行復(fù)制來擴(kuò)大數(shù)據(jù)集,造成模型訓(xùn)練復(fù)雜度加大。
·另一方面也容易造成模型的過擬合問題,因?yàn)殡S機(jī)過采樣是簡單的對初始樣本進(jìn)行復(fù)制采樣,這就使得學(xué)習(xí)器學(xué)得的規(guī)則過于具體化,不利于學(xué)習(xí)器的泛化性能,造成過擬合問題。
為了解決隨機(jī)過采樣中造成模型過擬合問題,又能保證實(shí)現(xiàn)數(shù)據(jù)集均衡的目的,出現(xiàn)了過采樣法代表性的算法SMOTE算法。
2.1.3 過采樣代表性算法-SMOTE
SMOTE全稱是Synthetic Minority Oversampling即合成少數(shù)類過采樣技術(shù)。
SMOTE算法是對隨機(jī)過采樣方法的一個改進(jìn)算法,由于隨機(jī)過采樣方法是直接對少數(shù)類進(jìn)行重采用,會使訓(xùn)練集中有很多重復(fù)的樣本,容易造成產(chǎn)生的模型過擬合問題。而SMOTE算法的基本思想:
代碼實(shí)現(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ù)類樣本進(jìn)行“欠采樣”(undersampling),即去除一些多數(shù)類中的樣本使得正例、反例數(shù)目接近,然后再進(jìn)行學(xué)習(xí)。
# 隨機(jī)欠采樣
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()
缺點(diǎn):
隨機(jī)欠采樣方法通過改變多數(shù)類樣本比例以達(dá)到修改樣本分布的目的,從而使樣本分布較為均衡,但是這也存在一些問題。對于隨機(jī)欠采樣,由于采樣的樣本集合要少于原來的樣本集合,因此會造成一些信息缺失,即將多數(shù)類樣本刪除有可能會導(dǎo)致分類器丟失有關(guān)多數(shù)類的重要信息。
官網(wǎng)鏈接:https://imbalanced-learn.readthedocs.io/en/stable/ensemble.html
猜你喜歡:
python人工智能之人臉識別綜合應(yīng)用與實(shí)踐
傳智播客與百度云智學(xué)院達(dá)成人工智能&大數(shù)據(jù)課程共建合作
人工智能之如何使用Python集合