Matlab 的 crossval 方法是不是尊重类频率?
Posted
技术标签:
【中文标题】Matlab 的 crossval 方法是不是尊重类频率?【英文标题】:Does Matlab's crossval method respect class frequencies?Matlab 的 crossval 方法是否尊重类频率? 【发布时间】:2018-07-14 20:25:03 【问题描述】:Matlab 的crossval
方法在(二进制)分类的上下文中是否尊重类频率?
Matlab 中的大多数分类模型都提供了计算 cross-validated model 的可能性。例如,当通过svm=fitcsvm(X,y);
训练线性 SVM 时,可以通过调用cv=crossval(svm);
计算交叉验证模型。 (这里是方法crossval
for objects of type ClassificationSVM
的文档。)然后可以使用此交叉验证模型来估计训练过程的泛化误差。
现在我的问题是:在划分训练数据时,crossval
是否考虑了类频率?例如,对于第 0 类的观测值 $X_0$ 可能是对第 1 类的观测值 $X_1$ 的 5 倍。因此,数据的分区版本对每个类的观测值的比率大致相同(在我的示例中为 5:1 )?还是完全忽略了这一点,因为如果数据集足够大,分区很可能具有大致相同的相对类大小。
在处理 Matlab 的 crossval
功能之前,我使用了自己的分区算法,该算法在拆分数据时尊重相对类大小。本质上,该算法将随机抽取 5 类 0 项,然后如果类频率为 5/6 和 1/6,则抽取 1 类 1 项,直到分区已满。
如果忽略了相对班级规模,我想说这对于非常不平衡和/或小数据集来说可能是个问题。还是我在这里弄错了?很高兴读到您对此的看法。
【问题讨论】:
【参考方案1】:如果相对班级人数被忽略,我会说这可以 对于非常不平衡和/或小的数据集有问题。
是的,它可能会成为问题,您可能遇到的一种情况就是在交叉验证的一个折叠中根本没有遇到特定少数类的实例。由于您正在处理二元分类,我认为这不再是一个问题,但取决于类不平衡的严重程度,一个人可能仍然会在一个方面不走运。 但是请注意,如果您正在处理不平衡的数据,您可以阅读一下这个问题,例如在您的评估度量中考虑类别不平衡。
关于您的第一个问题
您所说的“尊重班级频率”通常是通过分层样本实现的。在您描述 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
类基于变量y
为数据创建“分区方案”。在这种情况下,分区将创建 10 个分区,并尝试在所有这些分区中保持不同 y
值的比率大致相等。
您也应该查看cvpartition 的文档,因为它们描述了当前的语法,自上例创建以来,该语法显然发生了变化。根据当前的 k=10 应该如下
c = cvpartition(y,'KFold',10)
我希望能回答您的问题。如果我遗漏了什么,请告诉我。
【讨论】:
这正好回答了我的问题。非常感谢。如果我有足够的代表,我什至会投票 :) 我不知道cvpartition
支持这种分层交叉验证,并且可以使用'mcr'
的crossval
模式“注入”分区方案。以上是关于Matlab 的 crossval 方法是不是尊重类频率?的主要内容,如果未能解决你的问题,请参考以下文章
R语言编写自定义K折交叉验证(k-fold crossValidation)函数使用使用bootstrap包中的crossval函数来交叉验证模型的R方指标验证模型的效能的可靠性和稳定性