教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

如何解決分類中解決類別不平衡問題?

更新時(shí)間:2020年09月14日11時(shí)29分 來源:傳智播客 瀏覽次數(shù):

什么是類別不平衡問題。其實(shí),在現(xiàn)實(shí)環(huán)境中,采集的數(shù)據(jù)(建模樣本)往往是比例失衡的。比如網(wǎng)貸數(shù)據(jù),逾期人數(shù)的比例是極低的(千分之幾的比例);奢侈品消費(fèi)人群鑒定等。

1、類別不平衡數(shù)據(jù)集基本介紹

在這一節(jié)中,我們一起看一下,當(dāng)遇到數(shù)據(jù)類別不平衡的時(shí)候,我們該如何處理。在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.010.050.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()

不平衡02


缺點(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算法的基本思想:

不平衡03

不平衡04
不平衡05

代碼實(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()
不均衡問題6

2.2 欠采樣方法

2.2.1 什么是欠采樣方法

直接對訓(xùn)練集中多數(shù)類樣本進(jìn)行“欠采樣”(undersampling),即去除一些多數(shù)類中的樣本使得正例、反例數(shù)目接近,然后再進(jìn)行學(xué)習(xí)。

不平衡07

# 隨機(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é)果
[(064), (164), (264)]

# 數(shù)據(jù)集可視化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
不均衡問題8

缺點(diǎn):

隨機(jī)欠采樣方法通過改變多數(shù)類樣本比例以達(dá)到修改樣本分布的目的,從而使樣本分布較為均衡,但是這也存在一些問題。對于隨機(jī)欠采樣,由于采樣的樣本集合要少于原來的樣本集合,因此會造成一些信息缺失,即將多數(shù)類樣本刪除有可能會導(dǎo)致分類器丟失有關(guān)多數(shù)類的重要信息。

官網(wǎng)鏈接:https://imbalanced-learn.readthedocs.io/en/stable/ensemble.html


猜你喜歡:

語言模型-BERT:bert算法介紹

如何成為頂級開源項(xiàng)目的貢獻(xiàn)者

美國限制中國人工智能發(fā)展?被限技術(shù)傳智播客早已有相關(guān)課程在授

0 分享到:
和我們在線交談!