Могут ли классы-разделители sklearn возвращать случайные индексы? - PullRequest
0 голосов
/ 12 июля 2020

Я использую классы-разделители 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, или мне нужно передать ему объект, подобный массиву, и позволить ему действовать с ним?

...