如何将数据集分成 2 个以上的随机样本

How to separate a dataset into more than 2 random samples

如果我有一个包含 1000 行的数据集,将数据集分成 5 个随机样本(即每个样本将有 200 行)的最佳方法是什么。

我知道有 model_selection.train_test_split()utils.resample() 之类的函数,但这些函数仅将数据集分成 2 个样本。

我是否首先需要生成一个随机数列表,在本例中是一个包含 1000 个随机数的列表(比如从 1 到 1000),然后将数据集中对应于数字 1 到 200 的索引作为第一个随机样本,201到400作为第二个随机样本,401到600作为第三个随机样本等等

或者 Python 中是否有我可以使用的功能(让我的生活更轻松)?

您可以使用 scikit-learn 中的 Kfold 生成您需要的索引。如果您采用较小的折叠(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])

这是您 select data/labels

的相关部分的伪随机、非重叠索引
[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)