使用SMOTE 算法實現過采樣(附Matlab 程序)


在機器學習領域,時常會出現某一類的樣本數量遠遠低於其他類的情況,即類不平衡問題。解決類不平衡問題通常有三種思路:

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',即按照數值型特征對待)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM