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
是分层或非分层技术的例子。
问题:crossvalind
和cvpartition
可以一起使用吗?
我想做分层交叉验证。但我不明白如何将数据集划分为火车和测试并获得指数。
答案 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);