Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab libsvm交叉验证后的再培训_Matlab_Machine Learning_Classification_Svm_Libsvm - Fatal编程技术网

Matlab libsvm交叉验证后的再培训

Matlab libsvm交叉验证后的再培训,matlab,machine-learning,classification,svm,libsvm,Matlab,Machine Learning,Classification,Svm,Libsvm,我知道交叉验证用于选择好的参数。在找到它们之后,我需要在不使用-v选项的情况下重新训练整个数据 但我面临的问题是,在使用-v选项进行训练后,我得到了交叉验证的准确率(例如85%)。没有模型,我看不到C和gamma的值。在这种情况下,我如何再培训 顺便说一句,我应用10倍交叉验证。 e、 g 需要一些帮助 为了获得最佳的C和gamma,我使用LIBSVM常见问题解答中提供的代码 bestcv = 0; for log2c = -6:10, for log2g = -6:3, cmd =

我知道交叉验证用于选择好的参数。在找到它们之后,我需要在不使用-v选项的情况下重新训练整个数据

但我面临的问题是,在使用-v选项进行训练后,我得到了交叉验证的准确率(例如85%)。没有模型,我看不到C和gamma的值。在这种情况下,我如何再培训

顺便说一句,我应用10倍交叉验证。 e、 g

需要一些帮助

为了获得最佳的C和gamma,我使用LIBSVM常见问题解答中提供的代码

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
另一个问题:使用-v选项后的交叉验证准确性是否与我们在不使用-v选项的情况下进行训练并使用该模型进行预测时得到的结果相似?这两种精度相似吗

另一个问题:交叉验证通过避免过度拟合基本上提高了模型的准确性。因此,它需要有一个模型,然后才能改进。我说得对吗?除此之外,如果我有一个不同的模型,那么交叉验证的准确性会不同吗?我说得对吗

还有一个问题:在交叉验证精度中,C和gamma的值是多少

图表是这样的

那么C的值为2,伽马=0.0078125。但当我用新参数重新训练模型时。该值与99.63%不同。有什么原因吗?
提前感谢…

此处的
-v
选项实际上是用来避免过度拟合问题的一种方法(不是使用整个数据进行训练,而是对
N-1
折叠进行N次交叉验证训练,并对剩余折叠进行测试,每次一次,然后报告平均精度)。因此,它只返回交叉验证精度(假设您有分类问题,否则回归的均方误差)作为标量数,而不是实际的SVM模型

如果要执行模型选择,必须使用交叉验证(类似于
grid.py
helper python脚本)实现网格搜索,以找到
C
gamma
的最佳值

这应该不难实现:使用MESHGRID创建一个值网格,迭代所有对
(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);
%# ...

如果使用整个数据集来确定参数,然后在该数据集上进行训练,则会过度拟合数据。理想情况下,您可以分割数据集,对一部分(使用CV)进行参数搜索,然后使用另一部分使用CV进行训练和测试。如果将整个数据集用于这两个方面,您会得到更好的结果吗?当然,但您的模型可能无法很好地概括。如果要确定模型的真实性能,需要单独选择参数。

非常棒的代码,谢谢…还有一个问题:精度值是最佳c和gamma的位置。我说得对吗?@lakesh:对,只要记住图表是用log2比例绘制的(所以这里最好的值是
C=2^9
和gamma=
2^-11
)太棒了。。。我编辑了上面的问题。。基本上,我又增加了几个小问题……我想知道你的答案。@lakesh:我建议你参考一本合适的机器学习书籍,阅读更多关于过度拟合、训练/测试/验证集、偏差/方差等的内容。。。(这些主题不是特定于SVM的)@Amro[~,idx]=max(cv_acc);你说。那是->[C,idx]=max(cv_acc)?在最后一句话中,你所说的参数选择是什么意思?你的意思是确定某一部分的参数。很抱歉我不清楚。参数选择是确定哪些参数最适合您的数据集的行为(实际上,哪些参数最适合数据集的整个域以及您希望能够分类的未来数据)我的上一句话只是想总结一下我上面所说的——单独选择参数意味着使用数据集的单独部分来找出最佳参数,然后在训练未使用的部分时使用这些参数。第二部分:我认为你需要更深入地研究过拟合的概念。这是一个很好的例子。您的数据永远不会是数据世界的完美表示。构建模型时,可以创建一个具有100%精度的模型。你不会想要的,这就像图中的绿线。它不能很好地概括,这意味着它将在未来的数据上犯更多的错误。这称为过度装配。这意味着你的模型训练得太过严格了,无法获得训练数据。这就是为什么我们将测试数据单独保存的原因。这是我们对数据世界其他部分的最佳猜测,我们不想用它来构建我们的模型,因为如果我们这样做,我们就不知道我们的模型在新数据上是否真的很好。如果你使用这些数据来进行参数搜索,那么你就不知道你的分类器是否能够准确地处理未来的数据,或者你是否刚刚找到了这个特定数据集的完美参数。因为你有一个测试和训练集,我会将训练集一分为二-保持每个类的比例相同,使用前半部分进行参数网格搜索(最好使用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);
%# ...