这里的-v
选项实际上是用来避免过度拟合问题的一种方法(而不是使用整个数据进行训练,而是对N-1
折进行N折交叉验证训练,并对其余折进行测试,一次一次,然后报告平均准确度)。因此,它仅将交叉验证的准确性(假设您有分类问题,否则存在回归的均方误差)作为标量数而不是实际的SVM模型返回。
如果要执行模型选择,则必须使用交叉验证(类似于grid.py
helper python脚本)实现网格搜索 ,以找到C
和gamma
的最佳值。
这应该不难实现:使用MESHGRID创建值网格,对所有所有对(C,gamma)
进行迭代(C,gamma)
训练具有5倍交叉验证的SVM模型,并选择具有最佳CV精度的值。 ..
例:
%# 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
我知道交叉验证用于选择良好的参数。找到它们之后,我需要在不使用-v选项的情况下重新训练整个数据。
但是我面临的问题是,在使用-v选项进行训练之后,我得到了交叉验证的准确性(例如85%)。没有模型,我看不到C和gamma的值。在那种情况下,我该如何再培训?
顺便说一句,我申请10倍交叉验证。例如
需要一些帮助。
为了获得最佳的C和gamma,我使用LIBSVM常见问题解答中提供的代码
另一个问题:使用-v选项后的交叉验证准确性是否与我们在不使用-v选项并使用该模型进行预测的情况下得到的交叉验证准确性相似?两种精度是否相似?
另一个问题:交叉验证通过避免过度拟合从根本上提高了模型的准确性。因此,在改进之前,需要先建立模型。我对吗?除此之外,如果我使用不同的模型,那么交叉验证的准确性会有所不同吗?我对吗?
还有一个问题:在交叉验证的准确性上,C和伽马值是多少?
该图是这样的
然后C的值为2,且γ= 0.0078125。但是当我用新参数重新训练模型时。该值与99.63%不同。有什么原因吗?提前致谢...