【问题标题】:What is the difference between cvpartition and crossvalindcvpartition 和 crossvalind 有什么区别
【发布时间】:2018-11-16 17:26:53
【问题描述】:
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可以一起使用吗?

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

【问题讨论】:

    标签: matlab classification


    【解决方案1】:

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

    交叉验证对多次训练/测试拆分的结果进行平均,因此通常期望给出更现实的模型性能,即更悲观的估计。

    在您提到的两个函数中,crossvalind 似乎是 Bioinformatics Toolbox 特有的,并且相当陈旧。 help for cvpartition 给出了如何进行分层交叉验证的示例:

    示例

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

    【讨论】:

    • 交叉验证不会改善你的模型,它会提高你对模型有多好的估计(通常是让它看起来更糟,因为如果你不交叉验证,你往往会克服- 乐观估计)。
    • 这可能特定于您使用的模型类型,因此我会阅读该模型类型的帮助,如果不清楚,请提出一个新问题。
    • 在最后一行的答案中显示错误率,我有点困惑这是什么意思,我使用您的代码进行 500 次观察并收到 0.3358,这是什么意思?这意味着我的模型将无法正常工作?
    • @motevalizadeh 查看代码,如果需要,请查看cvpartition 的帮助。 cvErrerr 的总和除以所有测试集的总大小。 err 是一个向量,每个测试集有 1 个元素,每个元素 (err(i)) 是根据模型进行的分类与真实类不匹配的实例数。所以cvErr 是整个数据集中模型在交叉验证中分类错误的部分。另一种说法是你得到了 66.42% 的交叉验证准确率。是好还是坏?取决于你的问题。
    猜你喜欢
    • 2012-12-09
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多