softnshare / datanmachlearn

https://softnshare.wordpress.com/slack/forum-datamachlearn/
24 stars 2 forks source link

以SVM-SMOTE解決類別失衡(class imbalance)問題 #9

Open ywchan2005 opened 8 years ago

ywchan2005 commented 8 years ago

英文版:Tackling class imbalance with SVM-SMOTE

權衡的得失 (The trade-off)

假設我們需要將葡萄酒分等級,用以評計價格,而通常質素較好的酒會比較難找到,佔整體的少數,這種不平均的類別分布會使葡萄酒質素分類較難處理,分類結果中的陽性判斷錯誤(false positive)會使聲譽受損,而陰性判斷錯誤(false negative)則會使利益受損,在我們提升分類成效時,這種得失的權衡是必然要面對的。

SVM-SMOTE

這次解決類別失衡的實驗中,我們嘗試利用SVM-SMOTE來看看over-sampling技術對提升分類成效而帶來的得失的影響。先說說SMOTE的概念,SMOTE利用少數類別中的個體,與相同類別中鄰近個體的線性差異,來生成新的個體,令類別分布比較平均。SVM-SMOTE以SMOTE為基礎,同樣是利用生成新個體來減低類別分布的失衡情況,但SVM-SMOTE主要集中於類別之間的邊緣位置,藉此令分類器(classifier)更易掌握類別之間的界線。

實驗結果

我們利用SVM-SMOTE來減低類別失衡的情況。

smote = SMOTE( kind='svm' )
X_smote, Y_smote = smote.fit_transform( X_data, Y_data )

1-svm-smote 使用SVM-SMOTE前(左)與使用後(右)的類別分布情況 2-svm-smote 使用SVM-SMOTE前(左)與使用後(右)的類別分布情況,藍點是佔大多數的類別,而紅點則是佔少數的類別 我們利用類神經網絡來做分類。

m = Sequential()
m.add( Dense( 512, input_dim=X_smote.shape[ 1 ], init='glorot_normal', activation='relu' ) )
m.add( Dense( 512, init='glorot_normal', activation='relu' ) )
m.add( Dropout( .5 ) )
m.add( Dense( 2, init='glorot_normal', activation='softmax' ) )
m.compile( loss='categorical_crossentropy', optimizer='adam' )

分類結果顯示能正確分類96.68%多數類別和90.40%少數類別。

預測多數 預測少數
實際多數 96.68% 3.32%
實際少數 9.60% 90.40%

相反地,在沒有利用SVM-SMOTE的情況下,相同配置的類神經網絡只能夠一面到地將所有個體分類到多數類別中,因為分類到少數類別會令整體分類分數下降。

預測多數 預測少數
實際多數 100.00% 0.00%
實際少數 100.00% 0.00%

參考

VC,軟件工程師,閒餘學習類神經網絡 學習筆記記錄於 http://www.medium.com/vclab