为什么crossvalind会失败?

时间:2012-04-15 12:02:57

标签: matlab

我在非常小的数据上使用交叉valind函数...但是我发现它给了我不正确的结果。这应该发生吗?

我有Matlab R2012a,这是我的输出

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

ans =

 2
 5
 1
 3
 2
 1
 5
 3
 5
 1
 5

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

1 个答案:

答案 0 :(得分: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这样的东西) - 我的假设是它试图在每个类中有一个例子。 Kth折叠,并且至少有两个示例,折叠大小不超过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