1

我在非常小的数据上使用交叉 valind 函数......但是我观察到它给了我相同的错误结果。这应该发生吗?

我有 Matlab R2012a,这是我的输出

crossvalind('KFold',1:1:11,5)

ans =

 2
 5
 1
 3
 2
 1
 5
 3
 5
 1
 5

注意没有set 4.. 这是一个错误吗?我预计每组至少有 2 个元素,但它给了我一个 0 ......而且它发生了很多,因为这些值在集合中分布不均匀。

4

1 回答 1

2

crossvalind的帮助说您使用的形式是:crossvalind(METHOD, GROUP, ...). 在这种情况下,GROUP 是例如您的数据的类标签。所以 1:11 作为第二个论点在这里令人困惑,因为它表明没有两个示例具有相同的标签。我认为这是非常不寻常的,如果函数做了一些奇怪的事情,你不应该感到惊讶。

我试着做:

numel(unique(crossvalind('KFold', rand(11, 1) > 0.5, 5)))

结果它可靠地给出5了,这是我所期望的;我的示例将对应于一个二分类问题(我猜想,作为一般规则,你会想要类似的东西numel(unique(group)) <= numel(group) / folds) - 我的假设是它试图在第 K 折叠中拥有每个类的一个示例,并且在至少有 2 个示例,折叠大小之间的差异不超过 1 - 但我没有查看代码来验证这一点。

您的意思可能是:

crossvalind('KFold', 11, 5);

这将为 11 个数据点计算 5 次折叠 - 这不会尝试对标签进行任何巧妙的处理,因此您可以确定会有 K 次折叠。

但是,在您的问题中,如果您的数据点确实很少,那么最好进行留一交叉验证,您可以这样做:

crossvalind('LeaveMOut', 11, 1);

虽然更好的方法是:

for leave_out=1:11
  fold_number = (1:11) ~= leave_out;
  <code here; where fold_number is 0, this is the leave-one-out example. fold_number = 1 means that the example is in the main fold.>
end
于 2012-04-15T12:30:45.530 回答