機器學習之陷阱 - Imbalance Class Classification

幾年前的筆者,一直覺得Build Model是一件很不可思議的事,一提到建模這個課題,就會眼前一亮,充滿好奇和期待,不知道讀者們有沒有嘗試過在做分類(Classification)的時候,一看到數據,也沒有想太多,直接就把數據倒進模型作訓練,再看看Performance有多少,看到準確度有92%,表現很不錯吧,我看的是不一定了,為了讓讀者們更好理解文中的意思,我會採用"十個男人九個滾"的例子來闡釋。

假設我收集了100個男人的資料,9成2的人都曾經對伴侶不忠,其餘的就管它是還在考慮或是打死不會,目的是從這些會出軌和不會的男人身上,讓我的Model學習出軌的男人特點,從而預測其他男人會否對伴侶不忠,剛才說過我的模型有92%的準成度,筆者還以為可以慶功食牛雜,女人們以為可以試試伴侶是否不忠的時候,才發現所有的男人都被預測為"出軌",當中包括真的會出軌的92人, 其餘8個白白被"砌了生豬肉",還未出去滾已慘遭被判為出軌,要是這樣,倒不如直接說成"十個男人十個滾",連Build Model的氣力也省去了,所以零分重作吧!


Actual / Predict           滾             沒滾 / 唸緊  
92 0
沒滾 / 唸緊 8 0


但是為何會發生這種事呢?明明準確度很高,結果卻不似預期。其實原因很簡單,這都是數據的類別分佈出現不均勻和分類器(Classifier)的設計所造成的,因為一般的Classifier的學習目標是優化準成度,透過獲得愈少的誤差,才不會考慮類別的分佈,也就是少數的聲音很容易被埋沒,導致Classifier難以從少數類別的Pattern中學習,最壞的結果就是剛才的結果:所有數據都分成同一類別。

雖然Imbalance Class不是一個新鮮的問題,但對於入門級的人,想要對模型或數據分析技巧更上一層樓的話,這些基礎是少不了,如果沒有這些理論在背後支持,我相信街上每一個的Programmer也會比你強,只要寫幾句Coding,便能輕鬆實現建模,測試和預測,那麼你就好好想一下作為數據分析師的價值何在。所以在這個問題上,要從數據還是模型著手,答案明顯是數據,模型的設計本身就已經定死了,只能用上新的算法如Isolation Forest,或是調高類別對結果的比重,否則解決的只有從數據著手,把類別變得平衡,當中有很多方法,以下列出常用的方法:
Oversampling: 隨機地複制少數類別的數據,缺點是若複制了無辜的男人(即是沒有出軌卻被說成出軌的),準確度一樣會受度負面影響。

Undersampling: 隨機地刪去多數類別的數據,缺點是出軌的男人的數量減少,也導致誤差比實際的來很高。

Resampling: 不影響本身的數據樣本,把新的數據組合成新的數據,也既是增加未出軌的男人的樣本,達至數量上的平衡。

SMOTE (Synthetic Minority Over-sampling Technique) 正正就是Resampling的其中一個方法,筆者早前在Master的Data Mining Project中,也曾利用這個技巧用處理過一些類別不平衡的問題,讓分類器更好的學習少數派的特徵,它的原理是把每一個屬於少數派的數據點和它的K個鄰居(K是自定義的整數)之間,生成K個新的數據點,以下圖為例子,K就是5,原先的數據點$X$,和鄰居$X_1$, $X_2$, $X_3$, $X_4$, $X_5$之間隨機生成$Y_1$, $Y_2$, $Y_3$, $Y_4$, $Y_5$。這也同時彌補了Oversampling的不足,而又達到增加少數類別的數據的效果。之後把新和原有的數據集合一起去訓練分類器。



Source: Imbalanced Data Sets Classification Based on SVM for Sand-Dust Storm Warning (2015), Discrete Dynamics in Nature and Society

SMOTE的唯一限制就是不能生成現有數據以外的數據點,就像上圖,新的數據會被限制在現有數據範圍中。更重要的是SMOTE並不會明顯影響模型的整體準確度,它其實是在False Positive (無辜的男人)和True Negative(被認為不會出軌但事實上出了軌的男人)的數量上取得平衡,簡單來說,這都是取決於"有殺沒有放過"還是"不要犧牲任何無辜"的決定。因此不要以為SMOTE是一個無中生有的魔法,能解決準確度低的問題,更何況要提高準確度,也是Bias和Variance之間取得平衡,對於SMOTE而言在這個Trade-off上只是一個旁觀者而已。

另外,類別不平衡也提醒我們不能只用"準確度"去評估模型,在"十個男人九個滾"的例子中,只用Accuacy去判斷去選擇模型,可以是一個完全錯誤的決定。因此要用多種的Performance Matrix去判斷模型的性能,例如ROC和Confusion Matrix,這些技巧也在其他文章介紹過和如何應用。

而現實上也有很多有類別不平衡的例子:信用卡公司需要定期偵測到一些偽造信用卡,但隨住業務日趨上升,有限的人力資源已經不能再應付,唯有靠機器學習把過程自動化,但所謂"不尋常的記錄"佔所有記錄的一少部分,那麼該公司的開發團隊會在建模時遇上Imbalance Class的問題了 。最後,我的忠告是在做分類的課題時,多嘗試不同的Performance Indicator去審核自己的模型,它強在那裡,弱在那裡,遇上類別不平衡問題,不用擔心,辦法總比困難多,不妨嘗試Sampling或者利用有Class Weight的演算法去處理吧!

Comments