Я пытаюсь получить стратифицированную подвыборку моих данных, поскольку набор данных довольно большой (+ - 100 тыс. Изображений).Я пытался быть умным, используя StratifiedShuffleSplit
класс scikit-learn. Документация предоставляет мне следующий пример:
import numpy as np
from sklearn.model_selection import StratifiedShuffleSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 0, 1, 1, 1])
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)
for train_index, test_index in sss.split(X, y):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
, который дает следующий вывод (индексы соответствующих разделов Поезд / тест):
TRAIN: [5 2 3] TEST: [4 1 0]
TRAIN: [5 1 4] TEST: [0 2 3]
TRAIN: [5 0 2] TEST: [4 3 1]
TRAIN: [4 1 0] TEST: [2 3 5]
TRAIN: [0 5 1] TEST: [3 4 2]
На основевыше, и так как тип StratifiedShuffleSplit является генератором, я ожидал, что следующий код (при вызове next()
даст мне один из созданных разбиений.
sss = StratifiedKFold(n_splits=10, random_state=0)
train_index, test_index = next(sss.split(X, y)) #I expected this call to next would give me the indices of ONE of the (in this case 10) splits
print(type(sss.split(X,y))) #Type is generator
Однако, когда я проверяю len () после этого, я вижу, что я на самом деле получаю полный набор данных! Может кто-нибудь объяснить мне, почему это происходит, и как я могу достичь своей цели - взять стратифицированный подвыборку?
y_complete = np.concatenate((y[train_index], y[test_index]))
X_complete = np.concatenate((X[train_index], X[test_index]))
print(len(y_complete), len(X_complete)) #Gives me full length of dataset (So 99289 instead of expected 9920)