我在非常小的数据上使用交叉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 :(得分: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