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

3

我正在使用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 'classreg.learning.partition.ClassificationPartitionedModel'.

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

2个回答

2

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

modelLoss = kfoldLoss(tree);

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

testingLoss = loss(tree.Trained{1},Xtest,Ytest,'Subtrees','all'); % Testing

2
您可以使用kfoldLoss函数来获取每个折叠的交叉验证损失,并按照以下方式选择给您提供最小CV损失的训练模型:
modelLosses = kfoldLoss(tree,'mode','individual');

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

testSetPredictions = predict(tree.Trained{k}, testSetFeatures);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接