如何将一个数据集分离为两个以上的随机样本

2024-06-02 08:13:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我知道有像model_selection.train_test_split()utils.resample()这样的函数,但是这些函数只将数据集分成两个样本

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

或者Python中是否有我可以使用的函数(使我的生活更轻松)


Tags: 数据函数test列表model方式train数字
1条回答
网友
1楼 · 发布于 2024-06-02 08:13:41

您可以使用来自scikit-learnKfold来生成所需的索引。如果采用较小的折叠(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)

相关问题 更多 >