LIBSVM中的网格搜索错误,同时优化C,g参数

时间:2014-12-18 15:39:20

标签: matlab machine-learning svm libsvm

我使用libsvm来解决一类分类问题。我试图为不同的内核选择理想的C和gamma参数(多项式,线性和rbf) 我正在使用建议的matlab代码,通过v-fold验证技术找到最佳参数。

bestcv = 0;
for log2c = -1:3,
  for log2g = -4:1,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(Target_train, train, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('%g %g %g (bestc=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end

在v-fold交叉验证中,我们首先将训练集划分为相等的v子集 尺寸。顺序地,使用在剩余部分上训练的分类器来测试一个子集 v - 1个子集。因此,整个训练集的每个实例都被预测一次 交叉验证准确度是指正确分类的数据百分比。

在此代码中,C和gamma取值范围为(2 ^ -1,2 ^ 3)和(2 ^ -4,2 ^ 1)

我注意到,当调用svmtrain函数时,-s没有指定的参数来控制svm的类型。 libsvm中-s的默认参数是0,用于C-SVC。我有一个一类的clssification问题所以我应该根据svmtrain选项使用-s 2。但是当我将上面代码的第4行修改为

cmd = ['-s 2 -v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];

我收到此错误:

未定义的功能' ge'对于类型' struct'的输入参数。

ergasia出错(第37行)     if(cv> = bestcv),

据我所知,svm返回struct类型的模型。我的问题是,我使用的代码是否适用于一类分类问题中的参数选择?

另一个问题:是否有更好的方法来定义除此之外的最佳C和伽玛? 我在这里找到了这个方法: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

我真的可以使用一些帮助,所以提前谢谢你。

2 个答案:

答案 0 :(得分:1)

这些天我只是想了解LibSvm的一些内容。我也使用gridSearch来获得最好的c,g,它确实有效。 Fisrt,我用-s 2 -v 5 -c -g 12进行了一些测试

traindata=getData(1,1,12);
testdata=getData(1,0,12);
trainLabel=getLabel(1);
trainLabel(trainLabel>1)=0;
testLabel=getLabel(0);
testLabel(testLabel>1)=0;
v=5;
c=4;
g=12;
cmd = ['-s 2 -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),'    -q '];
cg = svmtrain(trainLabel,traindata,cmd);  

我得到一个结果cg,它只是数字

>> littletest
Cross Validation Accuracy = 4.53333%

>> cg

cg =

    4.5333

' if(cv> = bestcv)'所以它会起作用。

我还想告诉你的是,如果你没有为-s指定参数,它也会起作用。

traindata=getData(1,1,12);
testdata=getData(1,0,12);
trainLabel=getLabel(1);
trainLabel(trainLabel>1)=0;
testLabel=getLabel(0);
testLabel(testLabel>1)=0;
v=5;
c=4;
g=12;
cmd = [' -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),' -q '];
cg = svmtrain(trainLabel,traindata,cmd);  
>> littletest
Cross Validation Accuracy = 99.0667%
>> cg

cg =

   99.0667

第二,我粘贴了我在这里使用的gridSearch代码,希望它对你有所帮助。

[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
%% record acc with different c & g,and find the bestacc with the smallest c
bestc = 0;
bestg = 0;
bestacc = 0;
basenum = 2;
for i = 1:m
    for j = 1:n
        cmd = ['-t 2  -v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -q '];
        cg(i,j) = svmtrain(train_label, train, cmd);

        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end
        if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end

    end
end

答案 1 :(得分:-1)

在一个类svm中没有gamma参数。有成本(-c)和nu(-n)。 您可以在libsvm发行版的matlab文件夹中看到svmtrain.c文件中的所有选项。