SVM中引數調優的方法
阿新 • • 發佈:2019-01-01
最近在用到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 '];
使用這些更新引數,你會收到意想不到的高精度。