在(二进制)分类的上下文中,Matlab的crossval
方法是否尊重类频率?
Matlab中的大多数分类模型都提供了计算cross-validated model的可能性。例如,当通过svm=fitcsvm(X,y);
训练线性SVM时,可以通过调用cv=crossval(svm);
来计算交叉验证的模型。 (这里是方法crossval
for objects of type ClassificationSVM
的文档。)然后,这个交叉验证的模型可用于估计培训过程的泛化误差。
现在我的问题:在划分训练数据时,crossval
是否考虑了班级频率?例如,对于0级,我们可能会有超过5倍的观察值$ X_0 $而不是类1的观察值$ X_1 $。因此,对于每个类,数据的分区版本大致具有相同的观察率(在我的示例中为5:1) )?或者这完全被忽略了,原因是如果数据集足够大,分区很可能具有大约相同的相对类大小。
在处理Matlab的crossval
功能之前,我使用了自己的分区算法,在分割数据时尊重相对类的大小。本质上,如果类频率为5/6和1/6,算法将随机抽取5个0级的项目,然后抽取1个1级项目,直到分区满。
如果忽略相对班级大小,我会说这对于非常不平衡和/或小型数据集可能会有问题。或者我错了?很高兴看到你对此的想法。
答案 0 :(得分: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
您在这里看到的是他们通过y
类基于变量cvpartition
为数据创建“分区方案”。在这种情况下,分区将创建10个分区,并尝试在所有这些分区中保持不同y
值的比率大致相等。
您也应该查看cvpartition的文档,因为它们描述了当前语法,自上层示例创建以来,这种语法显然发生了变化。基于当前的k = 10
,它应该是以下c = cvpartition(y,'KFold',10)
我希望能回答你的问题。如果我错过了什么,请告诉我。