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

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

SVMModel = fitcsvm(INPUT, output,'KernelFunction','RBF','BoxConstraint',1);CVSVMModel = crossval(SVMModel);z = kfoldLoss(CVSVMModel)
  • 在第一行中使用fitcsvm对整个数据集进行训练。将Crossval设置为on的目的是什么(默认情况下,此选项为10折交叉验证)?crossvalkfoldLoss使用的方法与上述相同吗?如果是,为什么MATLAB文档只提到这种方法而没有提到在fitcsvm中设置Crossval方法进行交叉验证?如果这些过程相同,我们如何使用第一种方法获得错误率?

  • 当我们想要预测特征(这是一个预测模型)时,我们需要使用整个数据集训练的模型(这里是SVMModel对象)吗?所以crossvalkfoldLoss仅用于计算错误,我们不使用这种验证方法的10个训练模型进行预测。这是正确的吗?使用整个数据集对神经网络模型有效吗?


回答:

关于第一个问题。将"CrossVal"设置为"on"和将训练好的模型传递给crossval()函数的目的是相同的。你可以选择使用其中一种方法。

kFoldLoss()本身是一个函数,不包含在"CrossVal"标志中。它接受一个交叉验证模型作为输入。不管你是使用fitcsvm()中的"CrossVal"标志还是使用crossval()函数来进行交叉验证,都必须使用这个函数来评估错误率。

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

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

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注