Я использую классы-разделители Sklearns для перекрестной проверки K-кратности. В частности, я использую KFold, StratifiedKFold и GroupKFold. У меня есть несколько pandas фреймов данных, которые содержат мои X и y, поэтому я вызываю функции sklearn следующим образом:
cv = StratifiedKFold(n_splits=param['num_splits'], random_state=999, shuffle=True)
for fold, (train_idx, val_idx) in enumerate(cv.split(X=np.zeros(len(train_df)),
y=train_df['target'],
groups=train_df['patient_id'].tolist()), 1):
Как видите, я передаю «фиктивные данные» в sklearn (np.zeros ), потому что все, что меня заботило, - это индексы, которые он вернет, чтобы позже я использовал их. Но, похоже, происходит то, что sklearn ожидает реальных данных, перемешивает их, а затем возвращает индексы. которые всегда в основном находятся в несколько последовательном порядке:
All data size: 33126 malignant/benign: 584/32542
Fold 0 train size: 26498 malignant/benign: 467/26031 Idx: [ 0 1 2 3 4 5 7 8 9 11]
Fold 0 test size: 6628 malignant/benign: 117/6511 Idx: [ 6 10 18 19 20 22 24 27 31 56]
Fold 1 train size: 26502 malignant/benign: 466/26036 Idx: [ 1 2 4 5 6 7 8 9 10 11]
Fold 1 test size: 6624 malignant/benign: 118/6506 Idx: [ 0 3 14 15 17 28 35 42 47 53]
Fold 2 train size: 26508 malignant/benign: 467/26041 Idx: [ 0 1 3 4 5 6 7 8 9 10]
Fold 2 test size: 6618 malignant/benign: 117/6501 Idx: [ 2 12 13 23 25 29 33 38 39 43]
Fold 3 train size: 26502 malignant/benign: 468/26034 Idx: [ 0 2 3 5 6 7 8 10 12 13]
Fold 3 test size: 6624 malignant/benign: 116/6508 Idx: [ 1 4 9 11 16 32 34 45 46 50]
Fold 4 train size: 26494 malignant/benign: 468/26026 Idx: [ 0 1 2 3 4 6 9 10 11 12]
Fold 4 test size: 6632 malignant/benign: 116/6516 Idx: [ 5 7 8 21 26 30 36 37 40 41]
В основном мои индексы поездов всегда начинаются примерно с 0 и за некоторыми исключениями, поскольку они go в тесте, он может пропустить некоторые. Я надеялся, что sklearn полностью рандомизирует и перемешает «индексы» и вернет мне рандомизированный набор индексов, который соответствует критериям (стратифицированный, групповой и т. Д. c). Есть ли способ сделать это, чтобы я мог просто получить нужные мне индексы из sklearn, или мне нужно передать ему объект, подобный массиву, и позволить ему действовать с ним?