似乎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]))]

最佳答案

KFold和ShuffleSplit输出的差异

KFold会将您的数据集划分为折叠的预定数量,并且每个样本都必须是一个折叠且只能是一个折叠。折叠是数据集的子集。

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

摘要: ShuffleSplit可以迭代工作,KFold只是将数据集划分为k折。

进行验证时的差异

在KFold中,在每一轮中,您将使用一折作为测试集,而将所有其余的折叠用作训练集。但是,在ShuffleSplit中,在每个回合n期间,您仅应使用迭代n的训练和测试集。随着数据集的增长,交叉验证时间会增加,从而使随机拆分变得更具吸引力。如果您可以使用一定百分比的数据(而不是使用所有k-1倍)训练算法,那么ShuffleSplit是一个不错的选择。

关于python - KFold和ShuffleSplit CV有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34731421/

10-11 17:48