我使用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'.
试图找到测试错误时。我已尝试使用不同类型的分类算法的类似方法的几种组合,但由于分区数据而不断回到无法将测试数据应用于交叉验证模型。我应该如何将测试数据应用于交叉验证的模型?
答案 0 :(得分:2)
在调用fitctree时使用交叉验证时,默认情况下,在用于训练模型的70%数据中构建10个模型折叠。您可以通过以下方式找到kFoldLoss(在每个模型折叠中):
modelLoss = kfoldLoss(tree);
由于对fitctree的原始调用构建了10个模型折叠,因此有10个单独的训练模型。 10个模型中的每一个都包含在一个单元格阵列中,位于tree.Trained。例如,您可以使用第一个经过训练的模型通过以下方式测试您的保留数据的损失:
testingLoss = loss(tree.Trained{1},Xtest,Ytest,'Subtrees','all'); % Testing
答案 1 :(得分:2)
你可以使用kfoldLoss函数同时获得每次折叠的CV损失,然后选择训练有素的模型,以下列方式减少CV损失:
modelLosses = kfoldLoss(tree,'mode','individual');
如果您在学习期间进行了10次交叉验证,上面的代码将为您提供长度为10的向量。假设经过训练的模型具有最小的CV误差是'k',那么您将使用:
testSetPredictions = predict(tree.Trained{k}, testSetFeatures);