Чтобы найти лучшие параметры, которые будут использоваться с libsvm, я использовал приведенный ниже код. Вместо «./heart_scale» у меня был файл, содержащий положительные и отрицательные примеры, каждый с вектором hog в формате libsvm. У меня было 1000 положительных примеров и 4000 отрицательных. Однако они были приведены в порядок, то есть 1 000 примеров были положительными, а другие были отрицательными.Перекрестная проверка с помощью libsvm для поиска наилучших параметров
Вопрос: Теперь я пришел к сомнению, является ли точность, возвращаемая этим кодом, фактической точностью. Это связано с тем, что, когда я читаю 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);
%# ...