首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab机器学习培训,验证,测试分区

Matlab机器学习培训,验证,测试分区
EN

Stack Overflow用户
提问于 2016-01-27 02:36:31
回答 2查看 2K关注 0票数 3

我使用Matlab的统计和机器学习工具箱创建决策树、集合、Knn模型等。我希望将数据分离到训练/测试分区中,然后让模型使用训练数据进行训练和交叉验证(实际上是将训练数据分成训练数据和验证数据),同时保存测试数据以进行错误度量。重要的是,不要使用测试数据以任何方式对模型进行培训。对于我的决策树,我有如下代码:

代码语言:javascript
复制
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

但是,这将返回

代码语言:javascript
复制
Undefined function 'loss' for input arguments of
type 'classreg.learning.partition.ClassificationPartitionedModel'.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-27 04:40:11

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

代码语言:javascript
复制
modelLoss = kfoldLoss(tree);

由于最初对fitctree的调用构造了10个模型折叠,因此有10个单独的训练模型。这10个模型中的每一个都包含在位于tree.Trained的单元格数组中。例如,您可以使用第一个经过培训的模型,通过以下方法测试所保存的数据的损失:

代码语言:javascript
复制
testingLoss = loss(tree.Trained{1},Xtest,Ytest,'Subtrees','all'); % Testing
票数 2
EN

Stack Overflow用户

发布于 2016-08-13 02:11:45

您也可以使用kfoldLoss函数得到每一次的CV损失,然后选择经过训练的模型,以下列方式给出最小的CV损失:

代码语言:javascript
复制
modelLosses = kfoldLoss(tree,'mode','individual');

如果你在学习的时候做了10倍的交叉验证,上面的代码会给你一个长度为10的向量。假设经过训练的CV误差最小的模型是‘k’,那么您可以使用:

代码语言:javascript
复制
testSetPredictions = predict(tree.Trained{k}, testSetFeatures);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35027844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档