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



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

例:

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

这个问题的动机是对这个答案的评论。我决定把它分成一个新问题,以防止答案变得太长。

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

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

每次调用生成器来遍历每个折叠的索引时,它都会使用相同的洗牌索引并以相同的方式划分它们。

查看定义__iter__的 KFold _PartitionIterator(with_metaclass(ABCMeta)) 基类的代码。基类中的__iter__方法调用 KFold 中的 _iter_test_indices 来划分并生成每个折叠的训练和测试索引。

在新版本的 sklearn 中,通过调用 from sklearn.model_selection import KFold ,带有 shuffleKFold 生成器给出了不同的索引:

import numpy as np
from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=3, shuffle=True)
print('---first round----')
for train_index, test_index in kf.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    
print('---second round----')
for train_index, test_index in kf.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)

外:

---first round----
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]
---second round----
TRAIN: [0 1] TEST: [2 3]
TRAIN: [1 2 3] TEST: [0]
TRAIN: [0 2 3] TEST: [1]

或者,下面的代码以迭代方式生成相同的结果:

from sklearn.model_selection import KFold
np.random.seed(42)
data = np.random.choice([0, 1], 10, p=[0.5, 0.5])
kf = KFold(2, shuffle=True, random_state=2022)
list(kf.split(data))

外:

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

相关内容

  • 没有找到相关文章