Matlab 的 crossval 方法是否尊重 class 频率?

Does Matlab's crossval method respect class frequencies?

Matlab 的 crossval 方法在(二进制)class化的上下文中是否尊重 class 频率?

Matlab 中的大多数 class化模型都提供了计算 cross-validated model. For instance when training a linear SVM by means of svm=fitcsvm(X,y);, one can compute a cross-validated model by calling cv=crossval(svm);. (Here the documentation for the method crossval for objects of type ClassificationSVM 的可能性。)然后可以使用此交叉验证模型来估计训练过程的泛化误差。

现在我的问题是:划分训练数据时,crossval 是否考虑了 class 频率?例如,class 0 的观测值 $X_0$ 可能是 class 1 的观测值 $X_1$ 的 5 倍。数据的分区版本也大致如此每个 class 的观察比率相同(在我的示例中为 5:1)?或者这完全被忽略了,原因是如果数据集足够大,分区很可能具有大致相同的相对 class 大小。

在处理 Matlab 的 crossval 功能之前,我使用了自己的分区算法,该算法在拆分数据时尊重相对 class 大小。本质上,如果 class 频率为 5/6 和 1/6,该算法将随机抽取 5 个 class 0 项,然后抽取 1 个 class 1 项,直到分区为满的。

如果相对 class 大小被忽略,我会说这对于非常不平衡的 and/or 小数据集来说可能会有问题。还是我在这里弄错了?很高兴看到你对此的看法。

If the the relative class sizes were ignored, I'd say that this can be problematic for very imbalanced and/or small datasets.

是的,它可能会成为问题,您可以 运行 进入的一种情况是在一次交叉验证中根本没有遇到特定少数 class 的实例。由于您正在处理二进制 classification,我认为这不再是一个问题,但取决于 class 不平衡的强度,一个人可能仍然会倒霉。
但是请注意,如果您处理的是不平衡数据,您可以阅读一下这个问题,例如考虑评估指标中的 class 不平衡。

关于你的第一个问题

您所说的 'respecting the class frequencies' 通常是通过 分层样本 实现的。在您描述的 Matlabs crossval 函数的情况下,不会自动使用分层分区作为交叉验证的一部分。但是,他们在 documentation for crossval 中为此提供了一个示例,例如 2:

load('fisheriris');
y = species;
X = meas;
cp = cvpartition(y,'k',10); % Stratified cross-validation

classf = @(XTRAIN, ytrain,XTEST)(classify(XTEST,XTRAIN,...
ytrain));



cvMCR = crossval('mcr',X,y,'predfun',classf,'partition',cp)
cvMCR =
    0.0200

你在这里看到的是他们通过 cvpartition class 基于变量 y 为数据创建 'partitioning scheme'。在这种情况下,分区将创建 10 个分区,并尝试使所有这些分区中不同 y 值的比率大致相等。

您也应该查看 cvpartition 的文档,因为它们描述了当前的语法,自上例创建以来显然发生了变化。基于当前的 k=10

应该是下面的

c = cvpartition(y,'KFold',10)

我希望能回答您的问题。如果我遗漏了什么,请告诉我。