gpt4 book ai didi

python - 为什么用 shuffle 调用 KFold 生成器会给出相同的索引?

转载 作者:行者123 更新时间:2023-11-28 16:27:51 27 4
gpt4 key购买 nike

使用 sklearn,当您创建一个新的 KFold 对象并且 shuffle 为真时,它将产生一个不同的、新的随机折叠索引。但是,给定 KFold 对象的每个生成器都会为每个折叠提供相同的索引,即使 shuffle 为 true 也是如此。为什么会这样?

示例:

from sklearn.cross_validation import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(4, n_folds=2, shuffle = True)

for fold in kf:
print fold

print '---second round----'

for fold in kf:
print fold

输出:

(array([2, 3]), array([0, 1]))
(array([0, 1]), array([2, 3]))
---second round----#same indices for the folds
(array([2, 3]), array([0, 1]))
(array([0, 1]), array([2, 3]))

这个问题的动机是对此 answer 的评论.我决定将其拆分为一个新问题,以防止该答案变得太长。

最佳答案

具有相同 KFold 对象的新迭代不会重新排列索引,这只会在对象实例化期间发生。 KFold() 永远看不到数据,但知道样本数,因此它使用它来打乱索引。来自 KFold 实例化期间的代码:

if shuffle:
rng = check_random_state(self.random_state)
rng.shuffle(self.idxs)

每次调用生成器迭代每个折叠的索引时,它将使用相同的混洗索引并以相同的方式划分它们。

看看 code对于 KFold _PartitionIterator(with_metaclass(ABCMeta)) 的基类,其中定义了 __iter__。基类中的__iter__ 方法调用KFold 中的_iter_test_indices 来划分和产生每个折叠的train 和test 索引。

关于python - 为什么用 shuffle 调用 KFold 生成器会给出相同的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34940465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com