KFold和ShuffleSplit CV之间有何区别?

47

看起来KFold每次迭代生成相同的值,而Shuffle Split每次生成不同的索引。这是正确的吗?如果是,那么一个相对于另一个有什么用途呢?

cv = cross_validation.KFold(10, n_folds=2,shuffle=True,random_state=None)
cv2 = cross_validation.ShuffleSplit(10,n_iter=2,test_size=0.5)
print(list(iter(cv)))
print(list(iter(cv)))
print(list(iter(cv2)))
print(list(iter(cv2)))

产生以下输出:

[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]                                     
[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]                                     
[(array([4, 6, 3, 2, 7]), array([8, 1, 9, 0, 5])), (array([3, 6, 7, 0, 5]), array([9, 1, 8, 4, 2]))]                                     
[(array([3, 0, 2, 1, 7]), array([5, 6, 9, 4, 8])), (array([0, 7, 1, 3, 8]), array([6, 2, 5, 4, 9]))]    
1个回答

66

KFold和ShuffleSplit输出的区别

KFold将数据集划分为预定数量的折叠(folds),每个样本必须位于一个且仅一个fold中。一个fold是您数据集的一个子集。

ShuffleSplit在每个迭代期间随机对整个数据集进行抽样,以生成训练集和测试集。 test_sizetrain_size参数控制每个迭代的测试集和训练集的大小。由于在每个迭代中都从整个数据集中抽样,因此在一次迭代中选择的值可能会在另一次迭代中再次选择。

总结: ShuffleSplit工作是迭代的,KFold只是将数据集分成 k 个折叠。

在验证时的区别

在KFold中,在每个回合中,您将使用一个fold作为测试集,而所有其余折叠作为训练集。但是,在ShuffleSplit中,在每个第n次迭代中,您应该只使用第n次迭代的训练集和测试集。随着数据集的增长,交叉验证时间会增加,使得ShuffleSplit成为更具吸引力的替代方案。如果您可以使用一定比例的数据来训练算法,而不是使用所有k-1个折叠,则ShuffleSplit是一个有吸引力的选择。


非常好的答案,谢谢!现在看起来当您创建一个新的KFold生成器并且shuffle为true时,它会产生不同的输出,但是当您多次调用生成器时却不会。为什么会这样? - rb612
1
刚决定创建一个新的问题,以便您进行评论,以防止这个问题变得太长。在这里。希望能有所帮助! - ilyas patanam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接