欠取樣和過取樣
什麼是樣本不平衡
對於二分類問題,如果兩個類別的樣本數目差距很大,那麼訓練模型的時候會出現很嚴重的問題。舉個簡單的例子,貓狗圖片分類,其中貓有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 TomekLinks2 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 SMOTE2 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