【问题标题】:What's the difference between KFold and ShuffleSplit CV?KFold 和 ShuffleSplit CV 有什么区别?
【发布时间】:2016-04-16 08:17:35
【问题描述】:

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

【问题讨论】:

    标签: python scipy scikit-learn


    【解决方案1】:

    KFold 和 ShuffleSplit 输出的区别

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

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

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

    验证时的区别

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

    【讨论】:

    • 很好的答案,谢谢!现在似乎当您创建一个新的 KFold 生成器并且 shuffle 为 true 时,它​​会产生不同的输出,但当您多次调用生成器时不会。为什么会这样?
    • 刚刚决定为您的评论提出一个新问题,以防止它变得太长。 It is here。希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-10-21
    • 2020-07-11
    • 2023-03-29
    • 2010-10-02
    • 2011-12-12
    相关资源
    最近更新 更多