在 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)
第一行使用fitcsvm
孔数据训练的模型。在 fitcsvm
中将 Crossval
设置为 on
的目的是什么(默认情况下我们使用此选项进行 10 折交叉验证)? crossval
和 kfoldLoss
使用与上述相同的方法?如果是,为什么 MATLAB 文档只提到这种方法而不是设置 Crossval
方法进行交叉验证?如果这些程序相同,我们如何使用第一个程序获得错误率?
当我们要预测特征(这是一个预测模型)时,我们需要使用用孔数据训练的模型(这里是SVMModel
对象)?因此 crossval
和 kfoldLoss
仅用于计算误差,我们不会使用此验证方法的 10 个训练模型进行预测。这是真的吗?使用整个数据对神经网络模型有效吗?
关于第一个问题。将 "CrossVal"
设置为 "on"
和将训练好的模型提取到 crossval()
函数都针对同一件事。您可以使用其中之一,由您决定。
kFoldLoss()
本身是一个函数,不包含在 "CrossVal" 标志中。它将交叉验证模型作为输入。无论您是使用 fitcsvm()
中的 "CrossVal" 标志还是使用适当的 crossval()
函数来交叉验证此类模型。如果要评估错误率,必须使用此功能。
关于现在的第二个问题,简短的回答是肯定的。您必须使用 fitcsvm()
返回的经过训练的支持向量机模型。交叉验证程序旨在验证您的模型,因此您对其性能有一个了解(10 折交叉验证只是众多可用方法之一),但它不执行任何预测。为此,您必须使用 predict()
函数。我估计你有一个训练集和一个测试集(或验证集)以及它们各自的标签。使用训练集,您可以训练 SVM 模型,而使用验证集来执行预测阶段。 predict()
的主要输出是模型预测的标签向量,您可以将这些预测标签与验证集的真实标签进行匹配,以收集验证中的错误率。
我建议您避免使用 "CrossVal"
标志,这样您就可以控制情况,因为您将拥有:
- 训练好的模型,
fitcsvm()
的输出
- 交叉验证模型,
crossval()
的输出,您也可以使用 kFoldLoss()
评估其性能
- 预测标签,使用
predict()
和步骤 #1 中的训练模型
假设我们在 MATLAB R2015b 中有这样的代码:
SVMModel = fitcsvm(INPUT, output,'KernelFunction','RBF','BoxConstraint',1);
CVSVMModel = crossval(SVMModel);
z = kfoldLoss(CVSVMModel)
第一行使用
fitcsvm
孔数据训练的模型。在fitcsvm
中将Crossval
设置为on
的目的是什么(默认情况下我们使用此选项进行 10 折交叉验证)?crossval
和kfoldLoss
使用与上述相同的方法?如果是,为什么 MATLAB 文档只提到这种方法而不是设置Crossval
方法进行交叉验证?如果这些程序相同,我们如何使用第一个程序获得错误率?当我们要预测特征(这是一个预测模型)时,我们需要使用用孔数据训练的模型(这里是
SVMModel
对象)?因此crossval
和kfoldLoss
仅用于计算误差,我们不会使用此验证方法的 10 个训练模型进行预测。这是真的吗?使用整个数据对神经网络模型有效吗?
关于第一个问题。将 "CrossVal"
设置为 "on"
和将训练好的模型提取到 crossval()
函数都针对同一件事。您可以使用其中之一,由您决定。
kFoldLoss()
本身是一个函数,不包含在 "CrossVal" 标志中。它将交叉验证模型作为输入。无论您是使用 fitcsvm()
中的 "CrossVal" 标志还是使用适当的 crossval()
函数来交叉验证此类模型。如果要评估错误率,必须使用此功能。
关于现在的第二个问题,简短的回答是肯定的。您必须使用 fitcsvm()
返回的经过训练的支持向量机模型。交叉验证程序旨在验证您的模型,因此您对其性能有一个了解(10 折交叉验证只是众多可用方法之一),但它不执行任何预测。为此,您必须使用 predict()
函数。我估计你有一个训练集和一个测试集(或验证集)以及它们各自的标签。使用训练集,您可以训练 SVM 模型,而使用验证集来执行预测阶段。 predict()
的主要输出是模型预测的标签向量,您可以将这些预测标签与验证集的真实标签进行匹配,以收集验证中的错误率。
我建议您避免使用 "CrossVal"
标志,这样您就可以控制情况,因为您将拥有:
- 训练好的模型,
fitcsvm()
的输出
- 交叉验证模型,
crossval()
的输出,您也可以使用kFoldLoss()
评估其性能
- 预测标签,使用
predict()
和步骤 #1 中的训练模型