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

use*_*243 5 matlab machine-learning svm cross-validation supervised-learning

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

SVMModel = fitcsvm(INPUT, output,'KernelFunction','RBF','BoxConstraint',1);
CVSVMModel = crossval(SVMModel);
z = kfoldLoss(CVSVMModel)
Run Code Online (Sandbox Code Playgroud)
  • 在第一行中使用fitcsvm通过孔数据训练的模型。设置Crossvalonin 的目的是什么fitcsvm(默认情况下,此选项具有10倍交叉验证)?crossvalkfoldLoss使用与上述相同的方法?如果是,为什么MATLAB文档仅提及此方法而不设置Crossval交叉验证的方法?如果这些过程相同,我们如何使用第一个过程来获得错误率?

  • 当我们要预测特征时(这是一个预测模型),我们需要使用经过孔数据训练的模型(这里是SVMModel对象)?因此,crossval并且kfoldLoss仅用于计算误差的方法,我们不会对该预测方法的10个训练过的模型进行预测。这是真的吗 使用整个数据对神经网络模型有效吗?

Ale*_*ioX 4

关于第一个问题。设置"CrossVal""on"获取训练模型到crossval()函数中的目的都是相同的。您可以使用其中之一,这取决于您。

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

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

我建议您避免使用该"CrossVal"标志,这样您就可以控制局势,因为您将:

  1. 训练后的模型,输出fitcsvm()
  2. 交叉验证的模型, 的输出crossval(),您也可以使用以下方法评估其性能kFoldLoss()
  3. 预测标签,predict()与步骤 #1 中训练的模型一起    使用

  • 您不使用交叉验证模型进行预测。您使用“全数据训练”模型进行预测。请记住,预测和验证是机器学习的两个不同阶段。 (2认同)