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

问题描述 投票:5回答:1

假设我们在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仅用于计算误差,我们没有用这种验证方法进行预测。这是真的吗?使用整个数据对神经网络模型有效吗?
matlab machine-learning svm cross-validation supervised-learning
1个回答
4
投票

关于第一个问题。将"CrossVal"设置为"on"并将训练好的模型设置为crossval()函数都旨在实现同样的目标。你可以使用其中一种,这取决于你。

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

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

我建议你避免使用"CrossVal"旗帜,这样你就可以控制局势,因为你将拥有:

  1. 受过训练的模型,fitcsvm()的输出
  2. 交叉验证的模型,crossval()的输出,你也可以用kFoldLoss()来评估它的表现
  3. 使用predict()和步骤#1中训练模型的预测标签
© www.soinside.com 2019 - 2024. All rights reserved.