Вы можете использовать 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)