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