как создать подмножество выборки из исходного размера данных mnist, сохраняя при этом все 10 классов - PullRequest
0 голосов
/ 30 апреля 2019

предположим X,Y = load_mnist(), где X и Y - тензоры, которые содержат весь мнестист. Теперь я хочу, чтобы меньшая доля данных заставляла мой код работать быстрее, но мне нужно, чтобы все 10 классов оставались сбалансированными. Есть ли простой способ сделать это?

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

scikit-learn's train_test_split предназначен для разделения данных на обучающие и тестовые классы, но вы можете использовать его для создания «сбалансированного» подмножества вашего набора данных, используя аргумент stratified.Вы можете просто указать желаемую пропорцию размера поезда / теста и, таким образом, получить меньшую стратифицированную выборку ваших данных.В вашем случае:

from sklearn.model_selection import train_test_split

X_1, X_2, Y_1, Y_2 = train_test_split(X, Y, stratify=Y, test_size=0.5)
0 голосов
/ 30 апреля 2019
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=Ture, test_size=0.33, random_state=42)

Стратификация обеспечит пропорцию классов.

Если вы хотите выполнить K-Fold, тогда

from sklearn.model_selection import StratifiedShuffleSplit
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.iloc[train_index], X.iloc[test_index]
       y_train, y_test = y.iloc[train_index], y.iloc[test_index]

проверьте здесь для sklearn документирования.

0 голосов
/ 30 апреля 2019

Если вы хотите сделать это с большим контролем, вы можете использовать numpy.random.randint для генерации индексов размера подмножества и выборки исходных массивов, как в следующем фрагменте кода:

# input data, assume that you've 10K samples
In [77]: total_samples = 10000
In [78]: X, Y = np.random.random_sample((total_samples, 784)), np.random.randint(0, 10, total_samples)

# out of these 10K, we want to pick only 500 samples as a subset
In [79]: subset_size = 500

# generate uniformly distributed indices, of size `subset_size`
In [80]: subset_idx = np.random.choice(total_samples, subset_size)

# simply index into the original arrays to obtain the subsets
In [81]: X_subset, Y_subset = X[subset_idx], Y[subset_idx]

In [82]: X_subset.shape, Y_subset.shape
Out[82]: ((500, 784), (500,))
...