在機器學習中,咱們經常會遇到不均衡的數據集。好比癌症數據集中,癌症樣本的數量可能遠少於非癌症樣本的數量;在銀行的信用數據集中,
定期還款的客戶數量可能遠大於違約客戶的樣本數量。
好比很是有名的德國信用數據集,正負樣本的分類就不是很均衡:
若是不作任何處理簡單地進行訓練,那麼訓練結果中(以SVM爲例),大部分好客戶(約97%)能被正確地識別爲好客戶,可是大部分的壞客戶(約95%)卻會被識別爲好客戶。
這個時候,若是咱們僅僅使用accuracy來評價模型,那麼銀行可能會承受違約帶來的巨大損失。在南大周志華老師的《機器學習》「模型的選擇與評價」部分中,就提到了使用Precision、Recall、F1 Score(加權平均Precision和Recall)等更全面評價模型的方法。本文將探討如何解決機器學習中遇到的分類非均衡問題:
- 過採樣 Over-sampling
- 下采樣 Under-sampling
- 上採樣與下采樣結合
- 集成採樣 Ensemble sampling
- 代價敏感學習 Cost-Sensitive Learning
注:github開源項目
github-scikit-learn-contrib/imbalanced-learn
中提供了本回答中大部分算法的實現代碼,並配有詳細的文檔和註釋。
過採樣 Over-sampling
過採樣便是將原本數量少的那類樣本增長。目前比較常見的方法包含了SMOTE, ADASYN, SVM SMOTE,bSMOTE。其中,SMOTE和ADASYN算法的實現也能夠參考這個github項目。
我可視化了一下結果:
好比說在下圖中,藍色三角形表明的是多數樣本(不妨設爲正例),綠色三角形表明的是原始的少數樣本(不妨設爲反例),而紅色圓點則是使用SMOTE算法生成的反例。
相似地,ADASYN也能夠有相似的效果。
不過,SMOTE在一些狀況下表現得並非特別好,也不是很穩定,這也與它自己的算法思路有關。咱們能夠對比一下在下面狀況下SMOTE和ADASYN的表現:
但ADASYN也不是天衣無縫的——當分割兩個類別樣本可以清晰地被劃分並且數據點間隔很大時ADASYN會出現NaN。例如在如下的狀況,ADASYN就極可能會出問題:
下采樣 Under-sampling
下采樣便是將原本數量多的那類樣本減小。隨機下采樣就不用說了,實現很是簡單。但它的表現並非很好,所以又有了一些新方法,比較知名的有:
-
Tomek links
-
One-sided selection: Addressing the curse of imbalanced training sets: One-sided selection
-
Neighboorhood Cleaning Rule: Improving identification of difficult small classes by balancing class distribution
上採樣與下采樣結合
顧名思義,將本來比較多的樣本所屬類別的樣本減小,同時也將本來屬於少數的樣本類別中的樣本增長。
集成採樣 Ensemble sampling
如咱們所知,一些下采樣的方法可能會使咱們丟失一些比較重要的數據點,可是Xu-Ying Liu, Jianxin Wu, and Zhi-Hua Zhou的論文Exploratory Undersampling for Class-Imbalance Learning中提出了EasyEnsemble和BalanceCascade的方法必定程度上解決了這個問題。
在論文中,做者提到,EasyEnsemble的思想有一部分與Balanced Random Forests類似,可是EasyEnsemble使用了樣原本隨機訓練決策樹。
代價敏感學習 Cost-Sensitive Learning
咱們都知道比起將一個正常客戶誤判爲不良貸款客戶,將一個不良貸款客戶誤判爲正常客戶可能會給銀行帶來更大的損失;比起將非癌症病人誤判爲癌症病人,將癌症病人誤判爲非癌症病人可能會致使治療沒法及時進行從而致使更嚴重的後果。因而就有了cost-sensitive learning這樣的思路——來解決這種樣本分類不均衡的問題。這部分能夠參考Charles X. Ling, Victor S. Sheng的論文Cost-Sensitive Learning and the Class Imbalance Problem: