1. 程式人生 > >libsvm中OC-SVM 調參問題

libsvm中OC-SVM 調參問題

一、前言

        本文主要討論libsvm中的OCSVM調參問題,參考了博文http://www.voidcn.com/blog/lplpysys/article/p-3920288.html,OCSVM是一類SVM,即適用於訓練樣本均為正樣本,或者負樣本極少的分類模型,

二、libsvm-OCSVM相關引數

       針對模型引數的訓練主要使用svmtrain函式。

       用法: svmtrain [options] training_set_file [model_file]

       其中,options為操作引數,與OCSVM相關的引數有:

       -s 2 設定SVM型別,表所選型別為一類SVM

       -t  2 選擇高斯核函式將資料樣本對映至高緯空間,使能夠線性可分。

       -n v v的取值在[0,1],其表示訓練時訓練樣本集最後被劃分為負類的比例。

       -g γ 核函式中的gamma值。

       -v n n值為交叉驗證的折數,使用該引數時,svmtrain函式返回值為n折交叉驗證下得到的準確率,通常是為了確定引數v和γ的最佳值。

三、OCSVM 調參示例

       以下為使用窮舉法確定模型引數

clear;
clc;

mu = [1,1,1,1,1]';  
sigma = diag([1,1,1,1,1]);  
data = mvnrnd(mu,sigma,2500);          %R=mvnrnd(mu,sigma,m) 生成2500個5維正態分佈資料。  
trainData = data(1:2000, :);            %前2000個用於訓練
testData = data(2001:2500, :);       %後500個用於測試

trainLabel = ones(  size(trainData,1) ,1);

[v,g] = meshgrid(-10:0.2:0,-10:0.5:10);
[m,n] = size(v);
vg = zeros(m,n);
eps = 10^(-4);
n = 10;    %採用10折交叉驗證
bestv = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = n:n
        cmd = [ ' -s 2 -t 2 ' ,' -v ',num2str(n),' -n ',num2str(2^v(i,j)),' -g ',num2str(2^g(i,j)) ];
        vg(i,j) = svmtrain(trainLabel,trainData,cmd);     
        if vg(i,j) > bestacc
            bestacc = vg(i,j);
            bestv = 2^v(i,j);
            bestg = 2^g(i,j);
        end        
        if abs( vg(i,j)-bestacc )<=eps  
            bestacc = vg(i,j);
            bestv = 2^v(i,j);
            bestg = 2^g(i,j);
        end
    end
end

%獲得最優引數後,訓練模型
cmd = [' -s 2 -t 2 ' , ' -n ',num2str( bestv ),' -g ',num2str( bestg )];
model = svmtrain(trainLabel,trainData,cmd);

%測試模型
testLabel = ones( size(  testData ,1)  ,1);
[label , Y1,Y2 ] = svmpredict(testLabel , testData  ,model );
 四、結果分析      


可得所確定最佳引數bestv和bestg,10折交叉驗證下模型的準確率可達到99.55%,測試資料的準確率為98.6%,

測試時svmpredict返回3個變數,label儲存的是模型對測試資料的分類標籤,1為正類,-1為負類,Y1都一項表示分類準確率,後兩個數字用於迴歸問題,第2個數字表示mse;第三個數字表示平方相關係數。Y2表示決策值。