为了找到与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);
%# ...
答案 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而不是改组。
所以,回答你的问题:是的,这段代码返回的准确度是实际的准确度。
注意:准确性估计还取决于数据性质,交叉验证折叠数量本身是一个随机值,具有一定的分布。