推薦一篇英文的部落格:
8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset
1.不平衡資料集帶來的影響
一個不平衡的兩類資料集,使用準確率(accuracy)作為模型評價指標,最後得到的準確率很高,感覺結果很棒大功告成了,但再看看混淆矩陣(confusion matrix)或者少數類(樣本數量少的這一類)的召回率(recall),你的心可能就拔涼拔涼的。你可能會發現少數類的樣本幾乎完全分錯,即模型將樣本基本預測為了多數類(樣本數量多的一類)。
2.不平衡資料集很普遍
有些問題產生的資料生來就是不平衡的,比如癌症檢測、金融詐騙。對於一個兩類問題,比例為多少時,該資料集就不平衡了?英文部落格中認為:如果存在類似4:1的類不平衡,則可能會導致問題。
3.英文部落格中介紹的8種處理不平衡資料的策略
1) Collect more data
最簡單而實用的方法,當獲得少數類樣本比較容易時,可以考慮直接獲得一個比較平衡的資料集。但如果代價比較大,還是考慮別的方法吧。
2) Try Changing Your Performance Metric 修改模型評價指標
處理不平衡資料集時,accuracy很可能不再適用,尤其當我們更加關注少數類樣本。此時,可以使用confusion matrix、precision、recall、F1 score、ROC曲線的AUC值等來評價模型。
3) Try Resampling Your Dataset
過取樣(oversampling)和欠取樣(undersampling)
在這裡,更多的是介紹過取樣中的重取樣(re-sampling),也就是不生成新的資料。
4) Try Generate Synthetic Samples
SMOTE: Synthetic Minority Over-sampling Technique
對少數類使用SMOTE演算法“造”資料,可以想象一下對少數類進行k-means,在每個少數類樣本與其k個近鄰的連線上隨機選擇生成新的樣本點,這就是SMOTE這一類演算法大概的思想。SMOTE演算法是過取樣的一種方法,其生成了新的資料,而重取樣不生成新的資料。
5) Try Different Algorithms
樹模型處理不平衡資料集效果可能比較好,比如CART、C4.5、Random Forest。
6) Try Penalized Models
比如penalized-SVM 和penalized-LDA。
7) Try a Different Perspective
嘗試使用無監督學習中的異常檢測演算法。
8) Try Getting Creative
嗯,當時我看到這裡也是矇蔽的,這是啥方法。嗯,自己根據問題創造方法吧,英文部落格中也列舉了一些Quora上比較好的想法。
4.個人對不平衡資料集處理的總結
對於不平衡資料集,我們一般從資料集和模型兩個層面去考慮怎麼處理。上面列舉的第1、3、4條方法都是在資料集上的操作,第2、5、6、7條方法都是在模型方面做的一些嘗試。(第2條方法修改模型評價指標,姑且也認為是在模型方面做的工作好了。)
資料集上的操作,收集更多少數類樣本,對少數類過取樣、重取樣,對多數類欠取樣,都是為了平衡樣本比例。