在機器學習領域,時常會出現某一類的樣本數量遠遠低於其他類的情況,即類不平衡問題。解決類不平衡問題通常有三種思路:
1. 欠采樣
2.過采樣
3.代價敏感學習
要解決類不平衡問題可以參考以下文獻:
《Learning from Imbalanced Data》
本文主要介紹SMOTE算法的使用。
SMOTE算法是一種過采樣方法,它通過KNN算法來填充少數類樣本。博主在MATLAB中文論壇里找到了一個實現SMOTE算法的程序包,下載鏈接如下:
https://www.ilovematlab.cn/thread-167786-1-1.html
或者使用我的百度雲鏈接:
鏈接:https://pan.baidu.com/s/1BpGdRciK8V0Qt16s1zd6bA
提取碼:7bhm
打開這個程序包,先打開ReadMe.html,里面有相關的使用說明。建議先閱讀該說明。
我們再打開sample_SmoteOverSampling.m文件,該文件是使用smote算法的一個樣例,使用smote算法主要的程序段為:
[newTrain,newTrainLabel]=SmoteOverSampling(Train,TrainLabel,ClassType,C,attribute,5,'nominal');
完整代碼如下:
1 % sample_SmoteOverSampling 2 % sample routine to use SmoteOverSampling algorithm 3 % step 1: Generate new training set using FUNCTION SmoteOverSampling 4 % step 2: Train a neural network N from the new training set 5 % step 3: Get cost-sensitive predictions or their real-value outputs using N 6 7 clear; 8 %------------prepare data------------ 9 10 load echocardiogram 11 Cost=CostMatrix(2,5); 12 C=sum(Cost);%convert cost matrix to cost vector 13 14 %-------------step 1: Generate new training set using FUNCTION OverSampling ------------------- 15 16 [newTrain,newTrainLabel]=SmoteOverSampling(Train,TrainLabel,ClassType,C,attribute,5,'nominal'); 17 newTrainTarget=LabelFormatConvertion(newTrainLabel,ClassType);% change to 2-value format 18 19 %-------------step 2: Train a neural network from the new training set------------- 20 21 net=newff(minmax(newTrain),[10,NumClass],{'logsig','logsig'},'trainrp'); 22 net.trainParam.show = 200; 23 net.trainParam.epochs = 200; 24 net=train(net,newTrain,newTrainTarget); 25 26 %-------------step 3: Get cost-sensitive predictions or their real-value outputs using N---- 27 28 cs_out=sim(net,Test); 29 cs_out=normalize(cs_out);% real-value outputs 30 cs_prediction=LabelFormatConvertion(cs_out,ClassType,2);%prediction
先假設我們的樣本數量為m,特征數量為n。
SmoteOverSampling函數中,最主要的幾點如下:
1. Train是訓練數據,行數代表特征數量,列數代表樣本數量
2.TrainLabel是訓練數據對應的標簽,對於二分類問題,可以用[0,1]來標記。
3.ClassType是標簽中的類名稱,對於二分類問題,一般設ClassType=[0,1]
4. C是代價向量(cost vector)。在這個程序包里,它是通過對代價矩陣每一列求和得到的,而代價矩陣卻是通過隨機數取得的(有點迷)。
對於具體的問題,讀者應該自己建立代價矩陣,若不想考慮代價問題,我們可以簡單地設C=[1,1]; % 二分類問題有兩個1,n分類問題有n個1
5.attribute是對我們特征屬性的一個說明。它是一個行向量,向量中只能取0或者1。比如第n個特征是數值型特征,我們把attribute的第n個元素設為0;
若第n個特征是標稱特征(nominal attribute),我們把attribute的第n個元素設為1。那么什么是標稱特征?簡單地說,某個特征是用某個整數或字符來表示的,比如顏色特征,用0代表白色,用1代表黃色,用2代表黑色等等。那么頭發顏色特征就是標稱特征。很多時候我們的數據中並沒有標稱特征,這時候要注意了,由於這個程序包沒有考慮這種全數值型特征的情況,所以把attribute設為全零向量(即zeros(1,n))會導致程序報錯!!!為了解決這個問題,我們可以自行添加一個沒啥用的標稱特征,即在我們的Train訓練數據最后一行下面添加一個全1向量。這時候我們的特征數量增加了一個,再對應地,把attribute先設為zeros(1,(n+1)),再設attribute(end)=1;這樣我們就添加了一個標稱特征.
6.SmoteOverSampling的最后兩個參數我們可以保持默認,即 5,'nominal'。其中5是KNN的參數k,'nominal'是把標稱特征按照標稱特征對待(也可以設為'numeric',即按照數值型特征對待)