1. 程式人生 > >SVM中引數調優的方法

SVM中引數調優的方法

最近在用到svm做一些科研的工作,但是在用到svm的時候,發現在不同的svm引數下,精度差別不是一般的大。

熟悉svm的大家應該都知道,svm中引數很多,其中最主要得還是-c和-g引數,所以我就主要 調整這兩個引數。

所以,找找怎麼調整合適的引數,已達到最高的精度,如下: 是我親測的兩個可以很大情況下提高精度的引數值,

第一種:

[c,g] = meshgrid(-10:0.2:10,-10:0.5: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 = n:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j)),' -s 2', ' -n 0.5'];
        cg(i,j) = svmtrain(trainLabel,trainMatrix,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),' -n 0.5',' -s 2'];
model = svmtrain(trainLabel,trainMatrix,cmd);


第二種:

bestcv = 0;
for log2c = -4:12,
  for log2g = -8:4,
%       for log2c = -1:3,
%   for log2g = -4:1,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(labels2, data2, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
 %   fprintf('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end
% # train one-against-one model
  cmd2 = ['-c ', num2str(bestc), ' -g ',num2str(bestg), ' -b 1 '];


使用這些更新引數,你會收到意想不到的高精度。