如何使用libsvm matlab修复参数成本和gamma来提高准确性?

时间:2015-07-02 14:23:00

标签: machine-learning matlab libsvm

我使用libsvm对包含1000个标签的数据库进行分类。我是libsvm的新手,我发现选择参数c和g以提高性能存在问题。首先,这是我用来设置参数的程序:

  bestcv = 0;
for log2c = -1:3,
 for log2g = -4:1,
  cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
  cv = svmtrain(yapp, xapp, 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

结果,该程序给出c = 8和g = 2,当我使用这些值时 c和g,我发现准确率为55%。对于分类,我使用svm对所有。

 numLabels=max(yapp);
 numTest=size(ytest,1);

   %# train one-against-all models
    model = cell(numLabels,1);
   for k=1:numLabels
      model{k} = svmtrain(double(yapp==k),xapp, '  -c 1000 -g 10 -b 1 ');
    end

 %# get probability estimates of test instances using each model
 prob_black = zeros(numTest,numLabels);
   for k=1:numLabels
     [~,~,p] = svmpredict(double(ytest==k), xtest, model{k}, '-b 1');
     prob_black(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
   end

 %# predict the class with the highest probability
 [~,pred_black] = max(prob_black,[],2);
 acc = sum(pred_black == ytest) ./ numel(ytest)    %# accuracy

问题是我需要更改这些参数以提高性能。例如,当我随机放置c = 10000和g = 100时,我发现更好的准确率:70%。

我需要帮助,如何设置这些参数(c和g)以便找到最佳准确率?提前谢谢你

1 个答案:

答案 0 :(得分:3)

超参数调整是机器学习中一个非常重要的问题。最简单的方法是您已经实现的方法:定义一个值网格,并在网格上计算模型,直到找到一些最佳组合。一个关键的假设是网格本身就是表面的一个很好的近似:它足够精细,不会错过任何重要的东西,但不会那么精细,以至于你浪费时间计算与邻近值基本相同的值。一般来说,我不知道任何方法可以提前知道网格是多么精细。举例说明:假设全局最优值为$(5,5)$,其他地方的功能基本持平。如果你的网格是$(0,0),(0,10),(10,10),(0,10)$,你将完全错过最优。同样,如果网格是$(0,0),( - 10,-10),( - 10,0),(0,-10)$,您将永远不会接近最佳值。在这两种情况下,你都没有希望找到最佳状态。

对于带有RBF内核的SVM,存在一些经验法则:$ \ gamma \ in \ {2 ^ { - 15},2 ^ { - 14},...,2 ^ 5 \} $的网格和$ C \ in \ {2 ^ { - 5},2 ^ { - 4},...,2 ^ {15} \} $就是这样一个推荐。

如果您在测试的网格值范围之外找到了更好的解决方案,则表明您应该定义更大的网格。但是更大的网格需要更多时间来评估,因此您要么必须等待一段时间才能获得结果,要么转而采用更有效的方法来探索超参数空间。

另一种选择是随机搜索:定义您想要尝试的SVM数量的“预算”,并生成许多随机元组进行测试。这种方法大多只是用于基准测试目的,因为它完全不是智能的。

网格搜索和随机搜索都具有易于并行实现的优势。

更好的选择属于全局优化领域。 Marc Claeson等人设计了Optunity包,它使用粒子群优化。我的研究重点是对高效全局优化算法(EGO)的改进,该算法建立了高斯过程作为超参数响应表面的近似,并使用它来做出有关哪些超参数元组最有可能改进的有根据的预测。目前最好的估计。

想象一下,你已经在一些超参数元组$(\ gamma,C)$中评估了SVM,它有一些样本外的性能指标$ y $。 EGO启发方法的一个优点是它假设$(^ gamma,C)$附近的值$ y ^ * $将“接近”$ y $,因此我们不一定需要花时间探索这些附近的元组,特别是如果$ y-y_ {min} $非常大(其中$ y_ {min} $是我们发现的最小$ y $值)。 EGO将在估计存在很高改进概率的点处识别和评估SVM,因此它将智能地在超参数空间中移动:在理想情况下,它将跳过低性能区域以支持关注高绩效地区。