在MATLAB中实现SVM模型交叉验证的不同方法

时间:2016-02-13 20:01:25

标签: matlab machine-learning svm cross-validation supervised-learning

假设我们在MATLAB R2015b中有这个代码:

SVMModel = fitcsvm(INPUT, output,'KernelFunction','RBF','BoxConstraint',1);
CVSVMModel = crossval(SVMModel);
z = kfoldLoss(CVSVMModel)
  • 在使用孔数据训练的fitcsvm模型的第一行中。在Crossval中将on设置为fitcsvm的目的是什么(默认情况下,我们使用此选项进行10次交叉验证)? crossvalkfoldLoss使用与上述相同的方法?如果是,为什么MATLAB文档只提到这种方法没有设置Crossval方法进行交叉验证?如果这些程序与我们如何使用第一个程序获得错误率相同?

  • 在想要预测特征(这是预测模型)的时候,需要使用用洞数据训练的模型(这里是SVMModel对象)?因此,crossvalkfoldLoss仅用于计算错误,我们不会使用此验证方法的训练模型进行预测。这是真的吗?使用整个数据对神经网络模型有效吗?

1 个答案:

答案 0 :(得分:4)

关于第一个问题。将"CrossVal"设置为"on"并将训练后的模型提取到crossval()函数的目标都是相同的。你可以使用其中一种,这取决于你。

kFoldLoss()是一个函数本身,不包含在“CrossVal”标志中。它将交叉验证的模型作为输入。无论您是使用fitcsvm()中的“CrossVal”标记还是使用正确的crossval()函数对此模型进行交叉验证。必须使用此功能是否要评估错误率。

关于第二个问题,简短的回答是肯定的。您必须使用由fitcsvm()返回的经过培训的支持向量机模型。交叉验证程序旨在验证您的模型,因此您可以了解其性能(并且10倍交叉验证只是众多可用方法中的一种),但它不执行任何预测。为此,您必须使用predict()功能。我估计你有一个训练集和一个测试集(或验证集)及其各自的标签。使用训练集,您可以训练SVM模型,而使用验证集来执行预测阶段。 predict()的主要输出是模型预测的标签向量,您可以将此类预测标签与验证集的真实标签进行匹配,以便在验证中收集错误率。

我建议你避免使用"CrossVal"标志,这样你就可以控制情况,因为你将拥有:

  1. 训练有素的模型,输出fitcsvm()
  2. 交叉验证的模型,crossval()的输出,您还可以使用kFoldLoss()评估其效果
  3. 预测标签,在步骤#1中使用predict()和训练过的模型