LibSVM - 交叉验证后要做什么?

时间:2015-09-25 10:53:27

标签: matlab svm libsvm cross-validation

我使用网格搜索为径向基SVM找到最佳参数C和gamma,代码如下(代码主要取自Retraining after Cross Validation with libsvm)。这很好,但我有两个问题:

1.Aiven我只有一个数据集可供使用 - 我如何处理C和gamma的最佳值?我是否拆分我的数据集并使用一个部分仅用于使用gridsearch确定最佳参数C和gamma,然后使用第二部分来预测这些参数的准确性?

2.在找到我的旧数据集的最佳C和gamma后,我还有另一个数据集 - 为什么我应该将这些C和gamma用于新数据集,而不是将gridsearch应用于新数据集,以找到 新的最佳参数?

由于

%# read example data from libsvm
[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', 1^C(i), 2^gamma(i), folds));
end

%# pair (C,gamma) with best accuracy
[~,idx] = max(cv_acc);


%# now you can train you model using best_C and best_gamma
best_C = 2^C(idx);
best_gamma = 2^gamma(idx);

2 个答案:

答案 0 :(得分:1)

您执行gridsearch以查找针对给定问题的SVM的最佳参数。您可以在一个可用的数据集上执行此操作,其中包括注释,即您知道哪些预测是对错的 - 您还可以找出C和gamma的哪些值是最佳值?

一旦获得,您可以假设您以前使用过的数据集足够好地反映了问题,并且从此处开始,您可以在数据集上使用SVM和C和gamma值来解决没有注释的相同问题。

答案 1 :(得分:1)

一旦有了最佳参数,您就会认为它们对于属于该类的所有数据都是最佳的。当然,这是一个很大的假设,拥有更大的数据集会降低这些参数变化的可变性。但是整个学习点都给出了一个全新的数据我可以猜到它是什么,或者它意味着什么?因此,再次对新数据进行培训,无法看到您从未见过的数据会发生什么。

根据我的经验,这些参数只能优化某个球场内的表现。也就是说,它可以将您的测试设置精度从80%提高到81-82%。在大多数情况下,更重要的是进入80%的球场,这取决于设计好你的系统,选择正确的功能和预处理这些功能。然后,一旦完成,通过tweeking这些参数来提高性能。

无论如何,希望这会有所帮助。