Matlab cvpartition和crossvalind之间有什么区别

Matlab cvpartition和crossvalind之间有什么区别,matlab,classification,Matlab,Classification,crossvalind用于执行交叉验证,方法是通过返回索引将整个功能集X随机拆分为训练和测试数据。使用这些索引,我们可以分别创建X(trainIdx,:)和X(testIdx,:)的列车和测试数据cvpartition还使用分层和非分层等方法分割数据,但不返回索引。我没有看到crossvalind是分层或非分层技术的例子 问题:crossvalind和cvpartition可以一起使用吗 我想做分层交叉验证。但我不明白如何将数据集划分为训练集和测试集并获得索引。交叉验证和训练/测试划分是评估模型

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

问题:
crossvalind
cvpartition
可以一起使用吗


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

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

交叉验证将多个列车/试验分离的结果平均化,因此通常期望给出更现实的模型性能估计,即更悲观的模型性能估计

在您提到的两个函数中,
crossvalind
似乎是生物信息学工具箱特有的,而且相当陈旧。for
cvpartition
给出了如何进行分层交叉验证的示例:

示例

使用10倍分层交叉验证来计算 虹膜数据分类错误

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);

交叉验证不会改进模型,它会改进您对模型好坏的估计(通常是通过使模型看起来更糟,因为如果您不交叉验证,您往往会得到过于乐观的估计)。这可能是特定于您使用的模型类型的,因此我会阅读该模型类型的帮助,如果不清楚,会问一个新问题。在您的答案的最后一行,它显示了错误率,我有点困惑这是什么意思,我使用了您的代码,观察了500次,收到了0.3358,这是什么意思?这意味着我的模型工作不好?@motevalizadeh查看代码,如果需要,请查看
cvpartition
的帮助
cvErr
err
除以所有测试集总大小的总和
err
是一个向量,每个测试集有一个元素,每个元素(
err(i)
)是根据模型分类与真实类不匹配的实例数。因此,
cvErr
是交叉验证中模型分类错误的整个数据集的一部分。另一种说法是,交叉验证的准确率为66.42%。这是好还是坏?这取决于你的问题。
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);