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表示决策值。

猜你喜欢

转载自blog.csdn.net/AP1005834/article/details/74926868