Matlab 机器学习训练、验证、测试分区

Posted

技术标签:

【中文标题】Matlab 机器学习训练、验证、测试分区【英文标题】:Matlab Machine Learning Train, Validate, Test Partitions 【发布时间】:2016-01-27 02:36:31 【问题描述】:

我正在使用 Matlab 的统计和机器学习工具箱来创建决策树、集成、Knn 模型等。我想将我的数据分成训练/测试分区,然后让模型训练并使用训练数据进行交叉验证(基本上将训练数据分成训练和验证数据),同时保留我的测试数据以获取错误指标。重要的是不要使用测试数据以任何方式训练模型。对于我的决策树,我有如下代码:

chess = csvread(filename);
predictors = chess(:,1:6);
class = chess(:,7);

cvpart = cvpartition(class,'holdout', 0.3);
Xtrain = predictors(training(cvpart),:);
Ytrain = class(training(cvpart),:);
Xtest = predictors(test(cvpart),:);
Ytest = class(test(cvpart),:);


% Fit the decision tree
tree = fitctree(Xtrain, Ytrain, 'CrossVal', 'on');

% Error Metrics
testingLoss = loss(tree,Xtest,Ytest,'Subtrees','all'); % Testing
resubcost = resubLoss(tree,'Subtrees','all'); % Training
[cost,secost,ntermnodes,bestlevel] = cvloss(tree,'Subtrees','all'); % Cross Val

但是,这会返回

Undefined function 'loss' for input arguments of
type 'clas-s-reg.learning.partition.ClassificationPartitionedModel'.

尝试查找测试错误时。我已经使用不同类型的分类算法尝试了几种类似方法的组合,但由于分区数据,我一直无法将测试数据应用于交叉验证模型。我应该如何将测试数据应用于交叉验证的模型?

【问题讨论】:

【参考方案1】:

当您在调用 fitctree 时使用交叉验证时,默认情况下,在用于训练模型的 70% 数据中构建 10 个模型折叠。您可以通过以下方式找到 kFoldLoss(在每个模型折叠中):

modelLoss = kfoldLoss(tree);

由于对 fitctree 的原始调用构建了 10 个模型折叠,因此有 10 个单独的训练模型。 10 个模型中的每一个都包含在一个元胞数组中,位于 tree.Trained 。例如,您可以使用第一个经过训练的模型通过以下方式测试保留数据的损失:

testingLoss = loss(tree.Trained1,Xtest,Ytest,'Subtrees','all'); % Testing

【讨论】:

【参考方案2】:

您还可以使用 kfoldLoss 函数来获取每个折叠的 CV 损失,然后通过以下方式选择给您最小 CV 损失的训练模型:

modelLosses = kfoldLoss(tree,'mode','individual');

如果您在学习时进行了 10 倍交叉验证,上述代码将为您提供长度为 10 的向量。假设 CV 误差最小的训练模型是第“k”个,那么您将使用:

testSetPredictions = predict(tree.Trainedk, testSetFeatures);

【讨论】:

以上是关于Matlab 机器学习训练、验证、测试分区的主要内容,如果未能解决你的问题,请参考以下文章

机器学习基础:(Python)训练集测试集分割与交叉验证

机器学习数据集划分-训练集,验证集,测试集

机器学习:验证数据集与交叉验证

机器学习笔记:交叉验证

机器学习笔记关于MATLAB实现决策树

为啥要划分训练集、验证集和测试集