我在非常小的数据上使用交叉 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 ......而且它发生了很多,因为这些值在集合中分布不均匀。
我在非常小的数据上使用交叉 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 ......而且它发生了很多,因为这些值在集合中分布不均匀。
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