cvpartition和crossvalind有什么区别

时间:2018-06-06 22:09:54

标签: matlab classification

load fisheriris;
y = species; %label
X = meas;

%Create a random partition for a stratified 10-fold cross-validation.

c = cvpartition(y,'KFold',10);
%  split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', y, 0.6);

crossvalind用于通过返回索引将整个功能集X随机拆分为训练和测试数据来执行交叉验证。使用索引,我们可以分别创建列车和测试数据X(trainIdx,:)X(testIdx,:)cvpartition也使用分层和非分层等方法分割数据,但不返回索引。我没有看到crossvalind是分层或非分层技术的例子。

问题:crossvalindcvpartition可以一起使用吗?

我想做分层交叉验证。但我不明白如何将数据集划分为火车和测试并获得指数。

1 个答案:

答案 0 :(得分:0)

交叉验证和训练/测试分区是估计模型性能的两种不同方式,而不是构建模型本身的不同方式。通常,您应该使用您拥有的所有数据构建模型,但也使用这些技术之一(使用该数据的子集构建和评分一个或多个其他模型)来估计主模型可能有多好。

交叉验证平均了多次列车/测试分割的结果,因此通常预期会给出更现实的,即对模型性能的更悲观估计。

在您提到的两个功能中,crossvalind似乎特定于Bioinformatics工具箱,而且相当陈旧。 cvpartition的{​​{3}}给出了如何进行分层交叉验证的示例:

  

<强>实施例

     

使用10倍分层交叉验证来计算   错误分类错误,用于对虹膜数据进行分类。

load('fisheriris');
CVO = cvpartition(species,'k',10);
err = zeros(CVO.NumTestSets,1);
for i = 1:CVO.NumTestSets
    trIdx = CVO.training(i);
    teIdx = CVO.test(i);
    ytest = classify(meas(teIdx,:),meas(trIdx,:),...
       species(trIdx,:));
    err(i) = sum(~strcmp(ytest,species(teIdx)));
end
cvErr = sum(err)/sum(CVO.TestSize);