LibSVM - 交叉验证后做什么?
LibSVM - what to do after crossvalidation?
我使用网格搜索为径向基 SVM 寻找最佳参数 C 和 gamma,代码如下(代码主要取自 Retraining after Cross Validation with libsvm)。这工作正常,但我有两个即将提出的问题:
1.Given 我只有一个数据集可供使用 - 我该如何处理 C 和 gamma 的最佳值?我是否拆分我的数据集并使用一部分仅用于通过网格搜索确定最佳参数 C 和 gamma,然后使用第二部分来预测这些参数的准确性?
2.Given 在为我的旧数据集找到最佳 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);
您进行网格搜索以针对给定问题找到 SVM 的最佳参数。您在一个可用的数据集上执行此操作,该数据集包含注释,即您知道哪些预测是对的,哪些是错误的——否则您如何找出 C 和 gamma 的哪些值是最佳值?
一旦获得,您假设您以前使用的数据集足够好地反映了问题,并且从这里开始,您可以在没有注释的相同问题的数据集上使用具有 C 和 gamma 值的 SVM。
一旦有了最佳参数,您就可以假设它们对于属于此 class 的所有数据都是最佳的。当然,这是一个宏大的假设,拥有更大的数据集会降低这些参数变化的可变性。但是学习的重点是给出了一段全新的数据,我能猜出它是什么,或者它意味着什么吗?因此,再次对新数据进行训练违背了了解在您从未见过的数据上会发生什么的目的。
现在根据我的经验,这些参数只能优化某个球场内的性能。也就是说,它可以将你的测试集准确率从 80% 提高到 81-82%。在大多数情况下,更重要的事情是达到 80% 的目标,这取决于设计好你的系统,选择正确的特征并对这些特征进行预处理。然后一旦完成,通过调整这些参数来提高你的表现。
无论如何,希望这对您有所帮助。
我使用网格搜索为径向基 SVM 寻找最佳参数 C 和 gamma,代码如下(代码主要取自 Retraining after Cross Validation with libsvm)。这工作正常,但我有两个即将提出的问题:
1.Given 我只有一个数据集可供使用 - 我该如何处理 C 和 gamma 的最佳值?我是否拆分我的数据集并使用一部分仅用于通过网格搜索确定最佳参数 C 和 gamma,然后使用第二部分来预测这些参数的准确性?
2.Given 在为我的旧数据集找到最佳 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);
您进行网格搜索以针对给定问题找到 SVM 的最佳参数。您在一个可用的数据集上执行此操作,该数据集包含注释,即您知道哪些预测是对的,哪些是错误的——否则您如何找出 C 和 gamma 的哪些值是最佳值?
一旦获得,您假设您以前使用的数据集足够好地反映了问题,并且从这里开始,您可以在没有注释的相同问题的数据集上使用具有 C 和 gamma 值的 SVM。
一旦有了最佳参数,您就可以假设它们对于属于此 class 的所有数据都是最佳的。当然,这是一个宏大的假设,拥有更大的数据集会降低这些参数变化的可变性。但是学习的重点是给出了一段全新的数据,我能猜出它是什么,或者它意味着什么吗?因此,再次对新数据进行训练违背了了解在您从未见过的数据上会发生什么的目的。
现在根据我的经验,这些参数只能优化某个球场内的性能。也就是说,它可以将你的测试集准确率从 80% 提高到 81-82%。在大多数情况下,更重要的事情是达到 80% 的目标,这取决于设计好你的系统,选择正确的特征并对这些特征进行预处理。然后一旦完成,通过调整这些参数来提高你的表现。
无论如何,希望这对您有所帮助。