【libsvm】svm實例(一)


來源:

BreastTissue_classify_matlab: 使用libsvm進行分類 (github.com)

libsvm學習筆記-參數設置_時有的博客-CSDN博客

LIBSVM -- 支持向量機庫 (ntu.edu.tw)

使用的一般步驟

1 )按照 LIBSVM 軟件包所要求的格式准備數據集;

2 )對數據進行簡單的縮放操作;

3 )首要考慮選用 RBF  核函數;

4 )采用交叉驗證選擇最佳參數 C 與 g  ;

5 )采用最佳參數 C 與 g  對整個訓練集進行訓練獲取支持向量機模型;

6 )利用獲取的模型進行測試與預測。

一、數據 

BreastTissue_data.mat

這里給出了106個數據, 每一個數據都有9個特征和一個分類標簽;用這些數據來生成測試集和訓練集, 得到模型並且測試、分類。

label:1、2、3、4、5、6

 

二、代碼流程

%% I. 清空環境變量
clear all
clc

%% II. 導入數據
load BreastTissue_data.mat

%%
% 1. 隨機產生訓練集和測試集
n = randperm(size(matrix,1));

%%
% 2. 訓練集——80個樣本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);

%%
% 3. 測試集——26個樣本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);

%% III. 數據歸一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';

%% IV. SVM創建/訓練(RBF核函數)
%%參數  
% 1. 尋找最佳c/g參數——交叉驗證方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
        cg(i,j) = svmtrain(train_label,Train_matrix,cmd);     
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end        
        if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j) 
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end               
    end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];

%%
% 2. 創建/訓練SVM模型
model = svmtrain(train_label,Train_matrix,cmd);

%% V. SVM仿真測試
[predict_label_1,accuracy_1,prob_estimates] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2,prob_estimates2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];

%% VI. 繪圖
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真實類別','預測類別')
xlabel('測試集樣本編號')
ylabel('測試集樣本類別')
string = {'測試集SVM預測結果對比(RBF核函數)';
          ['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)

結果:

參數

輸入:

cmin,cmax: 懲罰參數c的變化范圍,在[2^cmin,2^cmax]范圍內尋找最佳的參數c,默認值為cmin=-8,cmax=8。

gmin,gmax: RBF核參數g的變化范圍,在[2^gmin,2^gmax]范圍內尋找最佳的RBF核參數g,默認值為gmin=-8,gmax=8。

v:對訓練集進行v-fold Cross Validation,默認為3。

cstep,gstep:進行參數尋優是c和g的步進大小,默認取值為cstep=1,gstep=1。

accstep:最后參數選擇結果圖中准確率離散化顯示的步進間隔大小([0,100]之間的一個數),默認為4.5。

輸出:

bestCVaccuracy:最終CV意義下的最佳分類准確率。

bestc:最佳的參數c。

bestg:最佳的參數g。

 

 

三、常用的幾個概念:

1.歸一化函數(mapminmax)

(1)[Y,PS] = mapminmax(X,YMIN,YMAX)

         其中,YMIN是我們期望歸一化后矩陣Y每行的最小值,YMAX是我們期望歸一化后矩陣Y每行的最大值。

(2)[Y,PS] = mapminmax(X,FP)

   FP是一個結構體成員,主要是FP.ymin(相當於YMIN), FP.ymax(相當於YMAX)。1和2處理效果一樣,只不過參數的帶入形式不同。

(3)Y = mapminmax('apply',X,PS)

   PS是訓練樣本的映射,測試樣本的預處理方式應與訓練樣本相同。只需將映射PS apply到測試樣本。

(4)X = mapminmax('reverse',Y,PS)

   將歸一化后的Y反轉為歸一化之前

(5)dx_dy = mapminmax('dx_dy',X,Y,PS)

2.交叉驗證(Cross-validation)

交叉驗證將原始數據集分為兩組,分別作為訓練集和驗證集。訓練集用於訓練模型,驗證集用於評價訓練模型的性能指標。
參數尋優的意義:參數的數值決定着模型的性能。
采用交叉驗證方法保障驗證數據集沒有參與過模型的訓練,可以給出較為准確的參數尋優結果。

 

幾種常用交叉驗證(cross validation)方式的比較【python】

優化算法有很多,如網格搜索算法、遺傳算法、粒子群算法、蟻群算法、模擬退火算法等。

交叉驗證來說,我們采取的是網格搜索算法,即在參數的一定的范圍內,按照指定的步長對不同的參數進行排列組合,將每一組參數組合進行測試,取性能指標最優的那一組參數作為最終參數的值。如本例中(C,gamma)組成了一個二維網格,再與性能指標識別率組成三維模型,實現參數的最優選擇。

1、Double cross-validation

Double cross-validation也稱2-fold cross-validation(2-CV)

將數據集分成兩個相等大小的子集,進行兩回合的分類器訓練。在第一回合,一個子集作為訓練集,另一個作為測試集;在第二回合,則將訓練集與測試集對換后,再次訓練分類器,而其中我們比較關心的是兩次測試集的識別率。

優點:容易實現,處理簡單。
缺點:沒有用到交叉的方法,驗證數據集對於模型的訓練沒有任何貢獻。

2、K-flod CV(k折交叉驗證)
樣本數據被分為k組,每次將一組作為驗證數據集,其余的k−1組作為訓練數據集。這樣就會有k 個訓練模型,這k個模型的驗證准確率的平均值作為模型的性能指標。
優點:所有的樣本都會被用於模型訓練,評價結果可信。
缺點:相較於Hold one method,處理較為復雜。

3、Leave-One-Out CV(LOO-CV留一驗證法)
設原始數據集中有K個樣本,每次選擇一個樣本作為驗證數據集,其余的K−1個樣本作為訓練數據集,這樣就會有K個訓練模型,這K個訓練模型的驗證准確率平均值為模型的性能指標。
優點:每次模型訓練,幾乎所有的樣本都會應用到,結果最可信。
缺點:需要訓練的模型較多,且訓練數據集樣本大,計算成本高。

3.rbf核函數最佳參數cg的選取w問題

  C被稱為懲罰因子,C越大說明對錯誤的容忍度越小,會導致過擬合(overfitting);C太小可能會導致容錯率過高,會導致欠擬合。

一般是通過交叉驗證的方法來確定C和gamma。

思路:將C和gamma參數在一定取值范圍內按照一定的步長(默認為1)進行取值組合;在不同(C,gamma)的組合下,將訓練集樣本均分成k組,一組作為驗證的數據樣本,其余k-1組則用來作為訓練的數據,每一組數據都輪流着作為驗證數據樣本,這樣在一組(C,gamma)組合下,就需要進行K次計算,把這K次計算的模型測試准確率score的均值作為這組(C,gamma)下模型的得分。這樣的話就能夠得到不同(C,gamma)組合下模型的得分,取得分最高的那組(C,gamma)即可,如果碰到有相同分的,一般考慮參數C,取C小的,因為在保證模型的准確率的情況下,C越小模型容錯率大,可以避免過擬合,若C也相同,則取先出現的那一組gamma。簡單的說,網格法原理就是在一定的范圍里面大步伐的,挨着試cg的參數,然后把該參數結果的精確度 繪制成等高線;再縮小cg的范圍,用小步伐去試,所以運算量很大

  網格法的缺點就是慢,數據量稍微大一點根本就跑不了。詳細的理論代碼可以在《[MATAB神經網絡30個案例分析].史峰》這本書的的十二十三章有講解,數據量太大的真的跑不動。

  

 

 


免責聲明!

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



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