處理不平衡數(shù)據(jù)的過(guò)采樣技術(shù)對(duì)比總結(jié)
在不平衡數(shù)據(jù)上訓(xùn)練的分類(lèi)算法往往導(dǎo)致預(yù)測(cè)質(zhì)量差。模型嚴(yán)重偏向多數(shù)類(lèi),忽略了對(duì)許多用例至關(guān)重要的少數(shù)例子。這使得模型對(duì)于涉及罕見(jiàn)但高優(yōu)先級(jí)事件的現(xiàn)實(shí)問(wèn)題來(lái)說(shuō)不切實(shí)際。
過(guò)采樣提供了一種在模型訓(xùn)練開(kāi)始之前重新平衡類(lèi)的方法。通過(guò)復(fù)制少數(shù)類(lèi)數(shù)據(jù)點(diǎn),過(guò)采樣平衡了訓(xùn)練數(shù)據(jù),防止算法忽略重要但數(shù)量少的類(lèi)。雖然存在過(guò)擬合風(fēng)險(xiǎn),但過(guò)采樣可以抵消不平衡學(xué)習(xí)的負(fù)面影響,可以讓機(jī)器學(xué)習(xí)模型獲得解決關(guān)鍵用例的能力
常見(jiàn)的過(guò)采樣技術(shù)包括隨機(jī)過(guò)采樣、SMOTE(合成少數(shù)過(guò)采樣技術(shù))和ADASYN(不平衡學(xué)習(xí)的自適應(yīng)合成采樣方法)。隨機(jī)過(guò)采樣簡(jiǎn)單地復(fù)制少數(shù)樣本,而SMOTE和ADASYN策略性地生成合成的新數(shù)據(jù)來(lái)增強(qiáng)真實(shí)樣本。
什么是過(guò)采樣
過(guò)采樣是一種數(shù)據(jù)增強(qiáng)技術(shù),用于解決類(lèi)不平衡問(wèn)題(其中一個(gè)類(lèi)的數(shù)量明顯超過(guò)其他類(lèi))。它旨在通過(guò)擴(kuò)大屬于代表性不足的類(lèi)別的樣本量來(lái)重新平衡訓(xùn)練數(shù)據(jù)分布。
過(guò)采樣通過(guò)復(fù)制現(xiàn)有樣本或生成合成的新數(shù)據(jù)點(diǎn)來(lái)增加少數(shù)類(lèi)樣本。這是通過(guò)復(fù)制真實(shí)的少數(shù)觀察結(jié)果或根據(jù)真實(shí)世界的模式創(chuàng)建人工添加來(lái)實(shí)現(xiàn)的。
在模型訓(xùn)練之前通過(guò)過(guò)采樣放大代表性不足的類(lèi)別,這樣模型學(xué)習(xí)可以更全面地代表所有類(lèi)別,而不是嚴(yán)重傾向于占主導(dǎo)地位的類(lèi)別。這改進(jìn)了用于解決涉及檢測(cè)重要但不常見(jiàn)事件的需求的各種評(píng)估度量。
為什么要過(guò)采樣
當(dāng)處理不平衡數(shù)據(jù)集時(shí),我們通常對(duì)正確分類(lèi)少數(shù)類(lèi)感興趣。假陰性(即未能檢測(cè)到少數(shù)類(lèi)別)的成本遠(yuǎn)高于假陽(yáng)性(即錯(cuò)誤地將樣本識(shí)別為屬于少數(shù)類(lèi)別)的成本。
傳統(tǒng)的機(jī)器學(xué)習(xí)算法,如邏輯回歸和隨機(jī)森林目標(biāo)優(yōu)化假設(shè)均衡類(lèi)分布的廣義性能指標(biāo)。所以在傾斜數(shù)據(jù)上訓(xùn)練的模型往往非常傾向于數(shù)量多的類(lèi),而忽略了數(shù)量少但重要的類(lèi)的模式。
通過(guò)對(duì)少數(shù)類(lèi)樣本進(jìn)行過(guò)采樣,數(shù)據(jù)集被重新平衡,以反映所有結(jié)果中更平等的錯(cuò)誤分類(lèi)成本。這確保了分類(lèi)器可以更準(zhǔn)確地識(shí)別代表性不足的類(lèi)別,并減少代價(jià)高昂的假陰性。
過(guò)采樣VS欠采樣
過(guò)采樣和欠采樣都是通過(guò)平衡訓(xùn)練數(shù)據(jù)分布來(lái)解決類(lèi)不平衡的技術(shù)。他們以相反的方式達(dá)到這種平衡。
過(guò)采樣通過(guò)復(fù)制或生成新樣本來(lái)增加少數(shù)類(lèi)來(lái)解決不平衡問(wèn)題。而欠采樣通過(guò)減少代表性過(guò)高的多數(shù)類(lèi)別中的樣本數(shù)量來(lái)平衡類(lèi)別。
當(dāng)大多數(shù)類(lèi)有許多冗余或相似的樣本或處理龐大的數(shù)據(jù)集時(shí),就可以使用欠采樣。但是它欠采樣有可能導(dǎo)致信息的丟失,從而導(dǎo)致有偏見(jiàn)的模型。
當(dāng)數(shù)據(jù)集很小并且少數(shù)類(lèi)的可用樣本有限時(shí),就可以使用過(guò)采樣。由于數(shù)據(jù)重復(fù)或創(chuàng)建了不代表真實(shí)數(shù)據(jù)的合成數(shù)據(jù),它也可能導(dǎo)致過(guò)擬合。
下面我們將探討不同類(lèi)型的過(guò)采樣方法。
1、隨機(jī)過(guò)采樣
隨機(jī)過(guò)采樣隨機(jī)復(fù)制少數(shù)類(lèi)樣本以平衡類(lèi)分布,所以他的實(shí)現(xiàn)非常簡(jiǎn)單。它以隨機(jī)的方式從代表性不足的類(lèi)別中選擇現(xiàn)有的樣本,并在不改變的情況下復(fù)制它們。這樣做的好處是當(dāng)數(shù)據(jù)集規(guī)模較小時(shí),可以有效地提高少數(shù)觀測(cè)值,而不需要收集額外的真實(shí)世界數(shù)據(jù)。
imbalanced-learn 庫(kù)中的randomoverampler可以實(shí)現(xiàn)過(guò)采樣的過(guò)程。
from imblearn.over_sampling import RandomOverSampler
from imblearn.pipeline import make_pipeline
X, y = create_dataset(n_samples=100, weights=(0.05, 0.25, 0.7))
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 7))
clf.fit(X, y)
plot_decision_function(X, y, clf, axs[0], title="Without resampling")
sampler = RandomOverSampler(random_state=0)
model = make_pipeline(sampler, clf).fit(X, y)
plot_decision_function(X, y, model, axs[1],
f"Using {model[0].__class__.__name__}")
fig.suptitle(f"Decision function of {clf.__class__.__name__}")
fig.tight_layout()
上圖可以看到,通過(guò)復(fù)制樣本,使得少數(shù)類(lèi)的在分類(lèi)結(jié)果中被正確的識(shí)別了。
2、平滑的自舉過(guò)采樣
帶噪聲的隨機(jī)過(guò)采樣是簡(jiǎn)單隨機(jī)過(guò)采樣的改進(jìn)版本,目的是解決其過(guò)擬合問(wèn)題。這種方法不是精確地復(fù)制少數(shù)類(lèi)樣本,而是通過(guò)將隨機(jī)性或噪聲引入現(xiàn)有樣本中來(lái)合成新的數(shù)據(jù)點(diǎn)。
默認(rèn)情況下,隨機(jī)過(guò)采樣會(huì)產(chǎn)生自舉。收縮參數(shù)則在生成的數(shù)據(jù)中添加一個(gè)小的擾動(dòng)來(lái)生成平滑的自舉。下圖顯示了兩種數(shù)據(jù)生成策略之間的差異。
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 7))
sampler.set_params(shrinkage=1)
plot_resampling(X, y, sampler, ax=axs[0], title="Normal bootstrap")
sampler.set_params(shrinkage=0.3)
plot_resampling(X, y, sampler, ax=axs[1], title="Smoothed bootstrap")
fig.suptitle(f"Resampling with {sampler.__class__.__name__}")
fig.tight_layout()
平滑的自舉插值不是任意重復(fù)少數(shù)觀察樣本,而是創(chuàng)建新的數(shù)據(jù)點(diǎn),這些數(shù)據(jù)點(diǎn)是來(lái)自真實(shí)樣本的特征向量的組合或插值。這樣做的效果是,通過(guò)數(shù)據(jù)擴(kuò)展而不是直接復(fù)制,將可用的少數(shù)數(shù)據(jù)擴(kuò)展到原始記錄之外。
插值的數(shù)據(jù)點(diǎn)是“平滑”的組合,它們占據(jù)真實(shí)樣本周?chē)奶卣骺臻g,而不是覆蓋在它們上面。因此與隨機(jī)過(guò)采樣相比,平滑自舉過(guò)采樣產(chǎn)生了更多新的合成少數(shù)樣本。這有助于解決來(lái)自重復(fù)技術(shù)的過(guò)擬合問(wèn)題,同時(shí)仍然平衡類(lèi)分布。
隨機(jī)過(guò)采樣的好處是它是一種非常直接和簡(jiǎn)單的技術(shù)。它不需要復(fù)雜的算法或?qū)?shù)據(jù)底層分布的假設(shè)。因此,它可以很容易地應(yīng)用于任何不平衡的數(shù)據(jù)集,而不需要特殊的先驗(yàn)知識(shí)。
但是隨機(jī)過(guò)采樣也受到過(guò)擬合可能性的限制。由于它只是復(fù)制了現(xiàn)有的少數(shù)樣本的例子,而不是產(chǎn)生真正的新樣本,所以觀察結(jié)果并沒(méi)有提供關(guān)于代表性不足的類(lèi)的額外信息細(xì)節(jié)。而且這種重復(fù)也有可能放大了訓(xùn)練數(shù)據(jù)中的噪聲,而不是更全面地正確表征少數(shù)類(lèi)。
這樣訓(xùn)練出來(lái)的模型模型可能會(huì)過(guò)度定制初始數(shù)據(jù)集的特定細(xì)微差別,而不是捕獲真正的底層模式。這就限制了它們?cè)诿鎸?duì)新的未知數(shù)據(jù)時(shí)的泛化能力。
3、SMOTE
SMOTE(Synthetic Minority Oversampling Technique)是一種廣泛應(yīng)用于機(jī)器學(xué)習(xí)中緩解類(lèi)失衡問(wèn)題的過(guò)采樣方法。
SMOTE背后的關(guān)鍵概念是,它通過(guò)插值而不是復(fù)制,為代表性不足的類(lèi)生成新的合成數(shù)據(jù)點(diǎn)。它隨機(jī)選擇一個(gè)少數(shù)類(lèi)觀測(cè)值,并根據(jù)特征空間距離確定其最近的k個(gè)相鄰少數(shù)類(lèi)樣本。
然后通過(guò)在初始樣本和k個(gè)鄰居之間進(jìn)行插值生成新的合成樣本。這種插值策略合成了新的數(shù)據(jù)點(diǎn),這些數(shù)據(jù)點(diǎn)填充了真實(shí)觀測(cè)之間的區(qū)域,在功能上擴(kuò)展了可用的少數(shù)樣本,而不需要復(fù)制原始記錄。
SMOTE 的工作流程如下:
- 對(duì)于每個(gè)少數(shù)類(lèi)樣本,計(jì)算其在特征空間中的 K 近鄰樣本,K 是一個(gè)用戶(hù)定義的參數(shù)。
- 針對(duì)每個(gè)少數(shù)類(lèi)樣本,從其 K 近鄰中隨機(jī)選擇一個(gè)樣本。
- 對(duì)于選定的近鄰樣本和當(dāng)前少數(shù)類(lèi)樣本,計(jì)算它們之間的差異,并乘以一個(gè)隨機(jī)數(shù)(通常在 [0, 1] 之間),將該乘積加到當(dāng)前樣本上,生成新的合成樣本。
- 重復(fù)上述步驟,為每個(gè)少數(shù)類(lèi)樣本生成一定數(shù)量的合成樣本。
- 將生成的合成樣本與原始數(shù)據(jù)合并,用于訓(xùn)練分類(lèi)模型。
SMOTE 的關(guān)鍵優(yōu)勢(shì)在于通過(guò)合成樣本能夠增加數(shù)據(jù)集中少數(shù)類(lèi)的樣本數(shù)量,而不是簡(jiǎn)單地重復(fù)已有的樣本。這有助于防止模型對(duì)于過(guò)擬合少數(shù)類(lèi)樣本,同時(shí)提高對(duì)未見(jiàn)過(guò)樣本的泛化性能。
SMOTE 也有一些變種,例如 Borderline-SMOTE 和 ADASYN,它們?cè)谏珊铣蓸颖緯r(shí)考慮了樣本的邊界情況和密度信息,進(jìn)一步改進(jìn)了類(lèi)別不平衡問(wèn)題的處理效果。
4、自適應(yīng)合成采樣(ADASYN)
自適應(yīng)合成采樣(Adaptive Synthetic Sampling,ADASYN) 是一種基于數(shù)據(jù)重采樣的方法,它通過(guò)在特征空間中對(duì)少數(shù)類(lèi)樣本進(jìn)行合成生成新的樣本,從而平衡不同類(lèi)別的樣本分布。與簡(jiǎn)單的過(guò)采樣方法(如重復(fù)少數(shù)類(lèi)樣本)不同,ADASYN 能夠根據(jù)樣本的密度分布自適應(yīng)地生成新的樣本,更注重在密度較低的區(qū)域生成樣本,以提高模型對(duì)邊界區(qū)域的泛化能力。
ADASYN 的工作流程如下:
- 對(duì)于每個(gè)少數(shù)類(lèi)樣本,計(jì)算其在特征空間中的 K 近鄰樣本,K 是一個(gè)用戶(hù)定義的參數(shù)。
- 計(jì)算每個(gè)少數(shù)類(lèi)樣本與其 K 近鄰樣本之間的樣本密度比,該比例用于表示樣本所在區(qū)域的密度。
- 對(duì)于每個(gè)少數(shù)類(lèi)樣本,根據(jù)其樣本密度比,生成一定數(shù)量的合成樣本,使得合成樣本更集中在密度較低的區(qū)域。
- 將生成的合成樣本與原始數(shù)據(jù)合并,用于訓(xùn)練分類(lèi)模型。
ADASYN 的主要目標(biāo)是在增加少數(shù)類(lèi)樣本的同時(shí),盡量保持分類(lèi)器在決策邊界附近的性能。也就是說(shuō)如果少數(shù)類(lèi)的一些最近鄰來(lái)自相反的類(lèi),來(lái)自相反類(lèi)的鄰居越多,它就越有可能被用作模板。在選擇模板之后,它通過(guò)在模板和同一類(lèi)的最近鄰居之間進(jìn)行插值來(lái)生成樣本。
生成方法對(duì)比
from imblearn import FunctionSampler # to use a idendity sampler
from imblearn.over_sampling import ADASYN, SMOTE
X, y = create_dataset(n_samples=150, weights=(0.1, 0.2, 0.7))
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(15, 15))
samplers = [
FunctionSampler(),
RandomOverSampler(random_state=0),
SMOTE(random_state=0),
ADASYN(random_state=0),
]
for ax, sampler in zip(axs.ravel(), samplers):
title = "Original dataset" if isinstance(sampler, FunctionSampler) else None
plot_resampling(X, y, sampler, ax, title=title)
fig.tight_layout()
上圖可以看到ADASYN和SMOTE之間的區(qū)別。ADASYN將專(zhuān)注于難以分類(lèi)的樣本,而常規(guī)SMOTE將不做任何區(qū)分。
下面我們看看不同算法的分類(lèi)結(jié)果
X, y = create_dataset(n_samples=150, weights=(0.05, 0.25, 0.7))
fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(20, 6))
models = {
"Without sampler": clf,
"ADASYN sampler": make_pipeline(ADASYN(random_state=0), clf),
"SMOTE sampler": make_pipeline(SMOTE(random_state=0), clf),
}
for ax, (title, model) in zip(axs, models.items()):
model.fit(X, y)
plot_decision_function(X, y, model, ax=ax, title=title)
fig.suptitle(f"Decision function using a {clf.__class__.__name__}")
fig.tight_layout()
可以看到如果不進(jìn)行過(guò)采樣,那么少數(shù)類(lèi)基本上沒(méi)法區(qū)分。通過(guò)過(guò)采樣的技術(shù),少數(shù)類(lèi)得到了有效的區(qū)分。
SMOTE對(duì)所有的少數(shù)類(lèi)樣本平等對(duì)待,不考慮它們之間的分布密度。ADASYN考慮到每個(gè)少數(shù)類(lèi)樣本的鄰近樣本數(shù)量,使得對(duì)于那些鄰近樣本較少的少數(shù)類(lèi)樣本,生成更多的合成樣本,以便更好地覆蓋整個(gè)決策邊界。
但是這兩個(gè)算法還要根據(jù)實(shí)際應(yīng)用時(shí)選擇,比如上圖中黃色和藍(lán)色的決策邊界變化的影響需要實(shí)際測(cè)算后才能判斷那個(gè)算法更適合當(dāng)前的應(yīng)用。