Matlab的crossval方法在(二进制)分类中是否尊重类的频率?
Matlab中的大多数分类模型提供了计算交叉验证模型的可能性。例如,当使用svm=fitcsvm(X,y);训练线性支持向量机时,可以通过调用cv=crossval(svm);来计算交叉验证模型。(这里是方法ClassificationSVM的文档。)该交叉验证模型可用于估计训练过程的泛化误差。
现在我的问题是:当划分训练数据时,crossval是否考虑了课程的频率?例如,对于0类,我们的观测$X_0$可能是第1类的5倍,那么数据的分区版本对于每个类是否有相同的观测比率(在我的示例中是5:1)?还是完全忽略了这一点,原因是如果数据集足够大,分区很可能具有大致相同的相对类大小。
在处理Matlab的crossval特性之前,我使用了自己的分区算法,该算法在分割数据时尊重相对的类大小。本质上,如果分类频率为5/6和1/6,则该算法将随机绘制0级的5项,然后再绘制1级的1项,直到分区满为止。
如果忽略了相对的类大小,我会说,对于非常不平衡和/或小的数据集来说,这可能是个问题。还是我搞错了?很高兴读到你对此的想法。
发布于 2018-01-30 10:34:33
如果忽略了相对的类大小,我会说,对于非常不平衡和/或小的数据集来说,这可能是个问题。
是的,它可能会成为问题,您可以遇到的情况之一就是在交叉验证的一倍中根本没有遇到特定少数类的实例。由于您处理的是二进制分类,所以我假设这不再是一个问题,但取决于类不平衡的程度,您可能仍然会在一次中遇到不幸。
但是,请注意,如果您处理的是不平衡的数据,您可能会对问题进行解读,例如,考虑您的评估度量中的类不平衡。
关于你的第一个问题
你所说的“尊重类频率”通常是通过分层样本来实现的。在您描述的Matlabs中,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=c分区(y,'KFold',10)
我希望这回答了你的问题。如果我漏掉了什么请告诉我。
https://stackoverflow.com/questions/48614803
复制相似问题