使用libsvm进行交叉验证以查找最佳参数

时间:2015-03-20 10:33:49

标签: matlab libsvm cross-validation

为了找到与libsvm一起使用的最佳参数,我使用下面的代码。而不是' ./ heart_scale'我有一个包含正面和负面示例的文件,每个示例都有一个libsvm格式的hog向量。我有1000个正面例子和4000个负面例子。然而,这些都是按顺序排列的,即前1000个例子是正例,其他例子是否定的。

问题:现在,我怀疑此代码返回的准确度是否真实准确。这是因为当我阅读5倍交叉验证时,它将数据的前4/5作为训练,将1/5作为测试。这是否意味着测试集可能都是负面的?或者它随机抽取示例?

%# read some training data
[labels,data] = libsvmread('./heart_scale');

%# grid of parameters
folds = 5;
[C,gamma] = meshgrid(-5:2:15, -15:2:3);

%# grid search, and cross-validation
cv_acc = zeros(numel(C),1);
for i=1:numel(C)
    cv_acc(i) = svmtrain(labels, data, ...
                    sprintf('-c %f -g %f -v %d', 2^C(i), 2^gamma(i), folds));
end

%# pair (C,gamma) with best accuracy
[~,idx] = max(cv_acc);

%# contour plot of paramter selection
contour(C, gamma, reshape(cv_acc,size(C))), colorbar
hold on
plot(C(idx), gamma(idx), 'rx')
text(C(idx), gamma(idx), sprintf('Acc = %.2f %%',cv_acc(idx)), ...
    'HorizontalAlign','left', 'VerticalAlign','top')
hold off
xlabel('log_2(C)'), ylabel('log_2(\gamma)'), title('Cross-Validation Accuracy')

%# now you can train you model using best_C and best_gamma
best_C = 2^C(idx);
best_gamma = 2^gamma(idx);
%# ...

1 个答案:

答案 0 :(得分:0)

您可以在LIBSVM源代码中找到问题的答案。 请参阅svm.cpp中的.back-red { background-color:red; } .back-green { background-color:green; } <div class="container"> <div class="row" th:with="employees=${{'emp-01', 'emp-02', 'emp-03', 'emp-04', 'emp-05', 'emp-06', 'emp-07', 'emp-08', 'emp-09', 'emp-10', 'emp-11', 'emp-12'}}"> <div class="col-md-4 col-sm-6 col-xs-12" th:each="i:${#numbers.sequence(0, #lists.size(employees))}" th:classappend'(${i} % 2) == 0?back-red:back-green"><span th:text="${emplyees[i]}"></span></div> </div> </div> 函数。

正如您所看到的,对于分类交叉验证问题,LIBSVM首先执行类grouping而不是改组。

所以,回答你的问题:是的,这段代码返回的准确度是实际的准确度。

注意:准确性估计还取决于数据性质,交叉验证折叠数量本身是一个随机值,具有一定的分布。