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

Posted

技术标签:

【中文标题】使用 libsvm 进行交叉验证以找到最佳参数【英文标题】:Cross-Validation with libsvm to find best parameters 【发布时间】:2015-05-23 17:48:17 【问题描述】:

为了找到与 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】:

您可以在 LIBSVM 源代码中找到问题的答案。 见svm.cpp中的函数svm_cross_validation

如您所见,对于分类交叉验证问题,LIBSVM 首先执行类grouping,然后再进行混洗。

所以,回答您的问题:是的,此代码返回的准确度是实际准确度。

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

【讨论】:

以上是关于使用 libsvm 进行交叉验证以找到最佳参数的主要内容,如果未能解决你的问题,请参考以下文章

libsvm 交叉验证与 matlab 中的预计算内核

如何在 R 中使用 LibSVM 执行 10 折交叉验证?

网格搜索中的交叉验证非常慢(libsvm)

libsvm交叉验证与网格搜索(参数选择)

SVM 回归的交叉验证

在 LIBSVM 中的 SVM 中进行交叉验证时停止打印准确性 [关闭]