1. 程式人生 > 其它 >欠取樣和過取樣

欠取樣和過取樣

什麼是樣本不平衡

對於二分類問題,如果兩個類別的樣本數目差距很大,那麼訓練模型的時候會出現很嚴重的問題。舉個簡單的例子,貓狗圖片分類,其中貓有990張,狗有10張,這時候模型只需要把所有輸入樣本都預測成貓就可以獲得99%的識別率,但這樣的分類器沒有任何價值,它無法預測出狗。

類別不平衡(class-imbalance)就是指分類任務中正負樣本數目差距很大的情況。生活中有很多類別不平衡的例子,如工業產品次品檢測,次品樣本數目遠小於正品樣本;欺詐問題,欺詐類觀測在樣本集中也只佔據少數。因此,有必要了解解決類別不平衡的常用方法。

在實際的專案當中,資料往往是不平衡的,那麼我們一半採用欠取樣(undersampling)或者過取樣(oversampling)來處理。

欠取樣就是從多數類中刪除樣本,過取樣就是向少數類中新增更多示例。

imbalanced-learn(imblearn)是一個用於解決不平衡資料集問題的 python 包,它提供了多種方法來進行欠取樣和過取樣。

a. 使用 Tomek Links 進行欠取樣:
imbalanced-learn 提供的一種方法叫做 Tomek Links。Tomek Links 是鄰近的兩個相反類的例子。
在這個演算法中,我們最終從 Tomek Links 中刪除了大多數元素,這為分類器提供了一個更好的決策邊界。

1 from imblearn.under_sampling import TomekLinks
2 tl = TomekLinks(return_indices=True, ratio= majority ) 3 X_tl, y_tl, id_tl = tl.fit_sample(X, y)

b. 使用 SMOTE 進行過取樣:

對訓練集中少數類進行“過取樣”(oversampling),簡單來說就是少數類中一個樣本抽取多次,從而使正負樣本數目接近,再進行學習。
在 SMOE(Synthetic Minority Oversampling Technique)中,我們在現有元素附近合併少數類的元素。

1 from imblearn.over_sampling import SMOTE
2 smote = SMOTE(ratio= minority ) 3 X_sm, y_sm = smote.fit_sample(X, y)

imbLearn 包中還有許多其他方法,可以用於欠取樣(Cluster Centroids, NearMiss 等)和過取樣(ADASYN 和 bSMOTE)。

參考資料

1、https://mp.weixin.qq.com/s/Qz4qNa5AoSluyyLC_ZSJdA

2、欠取樣和過取樣解決分類樣本不平衡問題 - Js2Hou - 部落格園 (cnblogs.com)

3、python資料預處理 :樣本分佈不均的解決(過取樣和欠取樣)_python_指令碼之家 (jb51.net)