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

Different ways of implementing cross-validation for SVM model in MATLAB

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

SVMModel = fitcsvm(INPUT, output,'KernelFunction','RBF','BoxConstraint',1);
CVSVMModel = crossval(SVMModel);
z = kfoldLoss(CVSVMModel)

关于第一个问题。将 "CrossVal" 设置为 "on" 和将训练好的模型提取到 crossval() 函数都针对同一件事。您可以使用其中之一,由您决定。

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

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

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

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