Accord.NET 中的交叉验证

本文关键字:验证 NET Accord | 更新日期: 2023-09-27 18:37:08

假设我们启动 10 折的交叉验证来训练支持向量机,根据理论,每个折叠都将使用不同的模型,并且根据最小的交叉验证误差,我们将选择该模型,现在根据 Accord.NET 框架,这就是我们用来实现交叉验证的:

var crossvalidation = new CrossValidation(size: data.Length, folds: 3);

crossvalidation.Fitting = delegate(int k, int[] indicesTrain, int[] indicesValidation)
{
// Lets now grab the training data:
var trainingInputs = data.Submatrix(indicesTrain);
var trainingOutputs = xor.Submatrix(indicesTrain);
// And now the validation data:
var validationInputs = data.Submatrix(indicesValidation);
var validationOutputs = xor.Submatrix(indicesValidation);

// Create a Kernel Support Vector Machine to operate on the set
var svm = new KernelSupportVectorMachine(new Polynomial(2), 2);
// Create a training algorithm and learn the training data
var smo = new SequentialMinimalOptimization(svm, trainingInputs, trainingOutputs);
double trainingError = smo.Run();
// Now we can compute the validation error on the validation data:
double validationError = smo.ComputeError(validationInputs, validationOutputs);
// Return a new information structure containing the model and the errors achieved.
return new CrossValidationValues(svm, trainingError, validationError);
};

然后我们计算:

// Compute the cross-validation
var result = crossvalidation.Compute();

现在,如何从这些折叠中提取最佳模型,或者如果不是前面提到的,框架正在根据什么逻辑工作?

Accord.NET 中的交叉验证

我开始以其他方式考虑这个问题,可能这是一个很好的答案候选者,由于缺乏适当的文档,与 encog 等不同,可能是我们应该自己选择我们的模型,然后使用每个选定的模型对它运行交叉验证,然后可以使用平均值来选择合适的模型。

Yo 可以对结果执行以下操作:

var minError = result.Models.Select(y=>y.ValidationValue).Min();
var bestModel = result.Models.Where(x=>x.ValidationValue==minError).FirstOrDefault()

首先找出最小错误,然后选择产生此错误的模型。