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

假设我们在MATLAB R2015b中拥有以下代码:

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

  • 当我们想要预测特征(这是一个预测模型)时,我们需要使用整个数据集训练的模型(这里是SVMModel对象)吗?所以crossvalkfoldLoss仅用于计算错误,我们不使用这种验证方法的10个训练模型进行预测。这是正确的吗?使用整个数据集对神经网络模型有效吗?


回答:

关于第一个问题。将"CrossVal"设置为"on"和将训练好的模型传递给crossval()函数的目的是相同的。你可以选择使用其中一种方法。

kFoldLoss()本身是一个函数,不包含在"CrossVal"标志中。它接受一个交叉验证模型作为输入。不管你是使用fitcsvm()中的"CrossVal"标志还是使用crossval()函数来进行交叉验证,都必须使用这个函数来评估错误率。

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

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

  1. 训练好的模型,fitcsvm()的输出
  2. 交叉验证模型,crossval()的输出,你也可以使用kFoldLoss()评估其性能
  3. 使用步骤#1中训练好的模型通过predict()获得的预测标签

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注