處理不平衡數(shù)據(jù)的過采樣技術(shù)對比總結(jié)
在不平衡數(shù)據(jù)上訓練的分類算法往往導致預測質(zhì)量差。模型嚴重偏向多數(shù)類,忽略了對許多用例至關(guān)重要的少數(shù)例子。這使得模型對于涉及罕見但高優(yōu)先級事件的現(xiàn)實問題來說不切實際。
過采樣提供了一種在模型訓練開始之前重新平衡類的方法。通過復制少數(shù)類數(shù)據(jù)點,過采樣平衡了訓練數(shù)據(jù),防止算法忽略重要但數(shù)量少的類。雖然存在過擬合風險,但過采樣可以抵消不平衡學習的負面影響,可以讓機器學習模型獲得解決關(guān)鍵用例的能力
常見的過采樣技術(shù)包括隨機過采樣、SMOTE(合成少數(shù)過采樣技術(shù))和ADASYN(不平衡學習的自適應合成采樣方法)。隨機過采樣簡單地復制少數(shù)樣本,而SMOTE和ADASYN策略性地生成合成的新數(shù)據(jù)來增強真實樣本。
什么是過采樣
過采樣是一種數(shù)據(jù)增強技術(shù),用于解決類不平衡問題(其中一個類的數(shù)量明顯超過其他類)。它旨在通過擴大屬于代表性不足的類別的樣本量來重新平衡訓練數(shù)據(jù)分布。
過采樣通過復制現(xiàn)有樣本或生成合成的新數(shù)據(jù)點來增加少數(shù)類樣本。這是通過復制真實的少數(shù)觀察結(jié)果或根據(jù)真實世界的模式創(chuàng)建人工添加來實現(xiàn)的。
在模型訓練之前通過過采樣放大代表性不足的類別,這樣模型學習可以更全面地代表所有類別,而不是嚴重傾向于占主導地位的類別。這改進了用于解決涉及檢測重要但不常見事件的需求的各種評估度量。
為什么要過采樣
當處理不平衡數(shù)據(jù)集時,我們通常對正確分類少數(shù)類感興趣。假陰性(即未能檢測到少數(shù)類別)的成本遠高于假陽性(即錯誤地將樣本識別為屬于少數(shù)類別)的成本。
傳統(tǒng)的機器學習算法,如邏輯回歸和隨機森林目標優(yōu)化假設均衡類分布的廣義性能指標。所以在傾斜數(shù)據(jù)上訓練的模型往往非常傾向于數(shù)量多的類,而忽略了數(shù)量少但重要的類的模式。
通過對少數(shù)類樣本進行過采樣,數(shù)據(jù)集被重新平衡,以反映所有結(jié)果中更平等的錯誤分類成本。這確保了分類器可以更準確地識別代表性不足的類別,并減少代價高昂的假陰性。
過采樣VS欠采樣
過采樣和欠采樣都是通過平衡訓練數(shù)據(jù)分布來解決類不平衡的技術(shù)。他們以相反的方式達到這種平衡。
過采樣通過復制或生成新樣本來增加少數(shù)類來解決不平衡問題。而欠采樣通過減少代表性過高的多數(shù)類別中的樣本數(shù)量來平衡類別。
當大多數(shù)類有許多冗余或相似的樣本或處理龐大的數(shù)據(jù)集時,就可以使用欠采樣。但是它欠采樣有可能導致信息的丟失,從而導致有偏見的模型。
當數(shù)據(jù)集很小并且少數(shù)類的可用樣本有限時,就可以使用過采樣。由于數(shù)據(jù)重復或創(chuàng)建了不代表真實數(shù)據(jù)的合成數(shù)據(jù),它也可能導致過擬合。
下面我們將探討不同類型的過采樣方法。
1、隨機過采樣
隨機過采樣隨機復制少數(shù)類樣本以平衡類分布,所以他的實現(xiàn)非常簡單。它以隨機的方式從代表性不足的類別中選擇現(xiàn)有的樣本,并在不改變的情況下復制它們。這樣做的好處是當數(shù)據(jù)集規(guī)模較小時,可以有效地提高少數(shù)觀測值,而不需要收集額外的真實世界數(shù)據(jù)。
imbalanced-learn 庫中的randomoverampler可以實現(xiàn)過采樣的過程。
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()
上圖可以看到,通過復制樣本,使得少數(shù)類的在分類結(jié)果中被正確的識別了。
2、平滑的自舉過采樣
帶噪聲的隨機過采樣是簡單隨機過采樣的改進版本,目的是解決其過擬合問題。這種方法不是精確地復制少數(shù)類樣本,而是通過將隨機性或噪聲引入現(xiàn)有樣本中來合成新的數(shù)據(jù)點。
默認情況下,隨機過采樣會產(chǎn)生自舉。收縮參數(shù)則在生成的數(shù)據(jù)中添加一個小的擾動來生成平滑的自舉。下圖顯示了兩種數(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()
平滑的自舉插值不是任意重復少數(shù)觀察樣本,而是創(chuàng)建新的數(shù)據(jù)點,這些數(shù)據(jù)點是來自真實樣本的特征向量的組合或插值。這樣做的效果是,通過數(shù)據(jù)擴展而不是直接復制,將可用的少數(shù)數(shù)據(jù)擴展到原始記錄之外。
插值的數(shù)據(jù)點是“平滑”的組合,它們占據(jù)真實樣本周圍的特征空間,而不是覆蓋在它們上面。因此與隨機過采樣相比,平滑自舉過采樣產(chǎn)生了更多新的合成少數(shù)樣本。這有助于解決來自重復技術(shù)的過擬合問題,同時仍然平衡類分布。
隨機過采樣的好處是它是一種非常直接和簡單的技術(shù)。它不需要復雜的算法或?qū)?shù)據(jù)底層分布的假設。因此,它可以很容易地應用于任何不平衡的數(shù)據(jù)集,而不需要特殊的先驗知識。
但是隨機過采樣也受到過擬合可能性的限制。由于它只是復制了現(xiàn)有的少數(shù)樣本的例子,而不是產(chǎn)生真正的新樣本,所以觀察結(jié)果并沒有提供關(guān)于代表性不足的類的額外信息細節(jié)。而且這種重復也有可能放大了訓練數(shù)據(jù)中的噪聲,而不是更全面地正確表征少數(shù)類。
這樣訓練出來的模型模型可能會過度定制初始數(shù)據(jù)集的特定細微差別,而不是捕獲真正的底層模式。這就限制了它們在面對新的未知數(shù)據(jù)時的泛化能力。
3、SMOTE
SMOTE(Synthetic Minority Oversampling Technique)是一種廣泛應用于機器學習中緩解類失衡問題的過采樣方法。
SMOTE背后的關(guān)鍵概念是,它通過插值而不是復制,為代表性不足的類生成新的合成數(shù)據(jù)點。它隨機選擇一個少數(shù)類觀測值,并根據(jù)特征空間距離確定其最近的k個相鄰少數(shù)類樣本。
然后通過在初始樣本和k個鄰居之間進行插值生成新的合成樣本。這種插值策略合成了新的數(shù)據(jù)點,這些數(shù)據(jù)點填充了真實觀測之間的區(qū)域,在功能上擴展了可用的少數(shù)樣本,而不需要復制原始記錄。
SMOTE 的工作流程如下:
- 對于每個少數(shù)類樣本,計算其在特征空間中的 K 近鄰樣本,K 是一個用戶定義的參數(shù)。
- 針對每個少數(shù)類樣本,從其 K 近鄰中隨機選擇一個樣本。
- 對于選定的近鄰樣本和當前少數(shù)類樣本,計算它們之間的差異,并乘以一個隨機數(shù)(通常在 [0, 1] 之間),將該乘積加到當前樣本上,生成新的合成樣本。
- 重復上述步驟,為每個少數(shù)類樣本生成一定數(shù)量的合成樣本。
- 將生成的合成樣本與原始數(shù)據(jù)合并,用于訓練分類模型。
SMOTE 的關(guān)鍵優(yōu)勢在于通過合成樣本能夠增加數(shù)據(jù)集中少數(shù)類的樣本數(shù)量,而不是簡單地重復已有的樣本。這有助于防止模型對于過擬合少數(shù)類樣本,同時提高對未見過樣本的泛化性能。
SMOTE 也有一些變種,例如 Borderline-SMOTE 和 ADASYN,它們在生成合成樣本時考慮了樣本的邊界情況和密度信息,進一步改進了類別不平衡問題的處理效果。
4、自適應合成采樣(ADASYN)
自適應合成采樣(Adaptive Synthetic Sampling,ADASYN) 是一種基于數(shù)據(jù)重采樣的方法,它通過在特征空間中對少數(shù)類樣本進行合成生成新的樣本,從而平衡不同類別的樣本分布。與簡單的過采樣方法(如重復少數(shù)類樣本)不同,ADASYN 能夠根據(jù)樣本的密度分布自適應地生成新的樣本,更注重在密度較低的區(qū)域生成樣本,以提高模型對邊界區(qū)域的泛化能力。
ADASYN 的工作流程如下:
- 對于每個少數(shù)類樣本,計算其在特征空間中的 K 近鄰樣本,K 是一個用戶定義的參數(shù)。
- 計算每個少數(shù)類樣本與其 K 近鄰樣本之間的樣本密度比,該比例用于表示樣本所在區(qū)域的密度。
- 對于每個少數(shù)類樣本,根據(jù)其樣本密度比,生成一定數(shù)量的合成樣本,使得合成樣本更集中在密度較低的區(qū)域。
- 將生成的合成樣本與原始數(shù)據(jù)合并,用于訓練分類模型。
ADASYN 的主要目標是在增加少數(shù)類樣本的同時,盡量保持分類器在決策邊界附近的性能。也就是說如果少數(shù)類的一些最近鄰來自相反的類,來自相反類的鄰居越多,它就越有可能被用作模板。在選擇模板之后,它通過在模板和同一類的最近鄰居之間進行插值來生成樣本。
生成方法對比
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將專注于難以分類的樣本,而常規(guī)SMOTE將不做任何區(qū)分。
下面我們看看不同算法的分類結(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()
可以看到如果不進行過采樣,那么少數(shù)類基本上沒法區(qū)分。通過過采樣的技術(shù),少數(shù)類得到了有效的區(qū)分。
SMOTE對所有的少數(shù)類樣本平等對待,不考慮它們之間的分布密度。ADASYN考慮到每個少數(shù)類樣本的鄰近樣本數(shù)量,使得對于那些鄰近樣本較少的少數(shù)類樣本,生成更多的合成樣本,以便更好地覆蓋整個決策邊界。
但是這兩個算法還要根據(jù)實際應用時選擇,比如上圖中黃色和藍色的決策邊界變化的影響需要實際測算后才能判斷那個算法更適合當前的應用。