lak*_*esh 17 matlab classification machine-learning svm libsvm
我知道交叉验证用于选择好的参数.找到它们之后,我需要在不使用-v选项的情况下重新训练整个数据.
但我面临的问题是,在使用-v选项训练后,我获得了交叉验证的准确性(例如85%).没有模型,我看不到C和gamma的值.在那种情况下,我如何重新训练?
顺便说一句,我应用10倍交叉验证.例如
optimization finished, #iter = 138
nu = 0.612233
obj = -90.291046, rho = -0.367013
nSV = 165, nBSV = 128
Total nSV = 165
Cross Validation Accuracy = 98.1273%
Run Code Online (Sandbox Code Playgroud)
需要一些帮助..
为了获得最佳的C和gamma,我使用LIBSVM FAQ中提供的代码
bestcv = 0;
for log2c = -6:10,
for log2g = -6:3,
cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
cv = svmtrain(TrainLabel,TrainVec, cmd);
if (cv >= bestcv),
bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
end
fprintf('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, bestcv);
end
end
Run Code Online (Sandbox Code Playgroud)
另一个问题:使用-v选项之后的交叉验证准确性是否与我们在没有-v选项的情况下训练并使用该模型进行预测时得到的相似?这两个精度是否相似?
另一个问题:交叉验证通过避免过度拟合,基本上提高了模型的准确性.因此,它需要有一个模型,才能改进.我对吗?除此之外,如果我有不同的模型,那么交叉验证的准确性会有所不同吗?我对吗?
还有一个问题:在交叉验证的准确性中,C和gamma的价值是什么?
图表是这样的

然后C的值是2,γ= 0.0078125.但是当我使用新参数重新训练模型时.该值与99.63%不同.有什么理由吗?提前致谢...
Amr*_*mro 31
-v这里的选项实际上是用来避免过度拟合问题的方法(而不是使用整个数据进行训练,在折叠上执行N折叠交叉验证培训N-1并在剩余折叠上进行测试,一个在a-a-时间,然后报告平均准确度).因此,它只返回交叉验证的准确性(假设您有分类问题,否则回归的均方误差)作为标量数而不是实际的SVM模型.
如果你想进行模式选择,你必须实现一个网格搜索使用交叉验证(类似于grid.py助手python脚本),找到的最佳值C和gamma.
这应该不难实现:使用MESHGRID创建一个值网格,迭代整体所有对(C,gamma)训练一个SVM模型与5倍交叉验证,并选择具有最佳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);
%# ...
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
21596 次 |
| 最近记录: |