Как разделить набор данных на более чем 2 случайные выборки - PullRequest
0 голосов
/ 14 апреля 2020

Если у меня есть набор данных с, скажем, 1000 строк, каков наилучший способ разделить набор данных, скажем, на 5 случайных выборок (ie. У каждой выборки будет 200 строк).

Я знаю, что есть такие функции, как model_selection.train_test_split() и utils.resample(), но эти функции разделяют набор данных только на 2 выборки.

Нужно ли сначала генерировать список случайных чисел, в данном случае список из 1000 случайных чисел (скажем, из От 1 до 1000), а затем взять индекс в наборе данных, соответствующий номерам от 1 до 200 в качестве первой случайной выборки, от 201 до 400 в качестве второй случайной выборки, от 401 до 600 в качестве третьей случайной выборки et c.

Или в Python есть функция, которую я мог бы использовать (чтобы облегчить мою жизнь)?

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете использовать Kfold из scikit-learn для генерации запрашиваемых вами индексов. Если вы возьмете меньшую кратность (20%), то у вас будет 5 фрагментов данных, которые вам нужны:

from sklearn.model_selection import KFold
import numpy as np

data = range(10)
kf = KFold(n_splits=5, shuffle=True)
for i in kf.split(data):
    print(i[1])

Вот ваши псевдослучайные, непересекающиеся индексы, чтобы вы могли выбрать соответствующие части ваших данных / меток

[4 9]
[1 3]
[6 7]
[0 2]
[5 8]

Если вы хотите стратифицированную выборку, вам придется использовать StratifiedKFold аналогичным образом.

Если вы хотите использовать ее как функцию, я бы, вероятно, создайте его как генератор:

def segment_data(data, labels, no_segments=5, shuffle=True):
    kf = KFold(n_splits=no_segments, shuffle=shuffle)
    for _, indices in kf.split(range(data.shape[0])):
        yield data[indices], labels[indices]

my_labels = ["L1", "L2", "L3"]
all_labels = np.random.choice(my_labels, size=100, replace=True, p=(0.1, 0.45, 0.45)
all_data = np.random.uniform(size=100)

for data, labels in segment_data(all_data, all_labels):
    print(data)
    print(labels)
...