推薦一篇英文的博客:
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條方法修改模型評價指標,姑且也認為是在模型方面做的工作好了。)
數據集上的操作,收集更多少數類樣本,對少數類過采樣、重采樣,對多數類欠采樣,都是為了平衡樣本比例。