在 MATLAB 中实现 SVM 模型交叉验证的不同方法
Posted
技术标签:
【中文标题】在 MATLAB 中实现 SVM 模型交叉验证的不同方法【英文标题】:Different ways of implementing cross-validation for SVM model in MATLAB 【发布时间】:2016-05-24 21:47:45 【问题描述】:假设我们在 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 个训练模型进行预测。这是真的吗?使用整个数据对神经网络模型有效吗?
【问题讨论】:
【参考方案1】:关于第一个问题。将"CrossVal"
设置为"on"
并将训练好的模型提取到crossval()
函数都针对同一件事。您可以使用其中一个,这取决于您。
kFoldLoss()
本身是一个函数,不包含在“CrossVal”标志中。它将交叉验证的模型作为输入。无论您是使用fitcsvm()
中的“CrossVal”标志还是使用正确的crossval()
函数来交叉验证此类模型。如果您想评估错误率,则必须使用此功能。
现在关于第二个问题,简短的回答是肯定的。您必须使用fitcsvm()
返回的训练有素的支持向量机模型。交叉验证过程旨在验证您的模型,因此您对它的性能有所了解(10 折交叉验证只是众多可用方法之一),但它不执行任何预测。为此,您必须使用 predict()
函数。我认为您有一个训练集和一个测试集(或验证集)以及它们各自的标签。使用训练集,您可以训练 SVM 模型,而使用验证集来执行预测阶段。 predict()
的主要输出是模型预测的标签向量,您可以将这些预测标签与验证集的真实标签进行匹配,以收集验证中的错误率。
我建议您避免使用"CrossVal"
标志,这样您就可以控制局势,因为您将拥有:
-
训练好的模型,
fitcsvm()
的输出
交叉验证模型,crossval()
的输出,您也可以使用kFoldLoss()
评估其性能
预测的标签,使用predict()
和步骤#1 中的训练模型
【讨论】:
感谢您的回答。关于第二个问题,在 k-fold 类验证中,我们使用 10 个子样本(不同的 10 个模型)训练 10 个模型,当使用整个数据作为训练时,我们有不同的模型。由于这种行为,类验证的返回错误率是否可靠? 在 10 折交叉验证中,您将整个训练集分成 10 个子集,然后将交叉验证过程重复 10 次,其中 10 个子集中的每个子集仅使用一次作为验证集。当然,您会得到 10 个错误率,它们被组合(例如平均)以返回单个值。 您不使用交叉验证模型进行预测。您使用“全数据训练”模型进行预测。请记住,预测和验证是机器学习的两个不同阶段。 我明白你的意思。但请记住,整个数据中只有 1/10 不可用于训练,而是用于验证。此外,每种模式都用于训练(9 次)和验证(1 次),这非常强大。如果您想要更可靠的错误率,只需检查有多少预测标签与验证标签不同。正如我们所说,在预测阶段,您使用“全数据训练”模型,而不涉及交叉验证模型。 不客气。继续努力,我喜欢 SVM!以上是关于在 MATLAB 中实现 SVM 模型交叉验证的不同方法的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB 支持向量机 (SVM) 交叉验证实现以提高代码速度
如何在交叉验证和 GridSearchCV 中实现 SMOTE