【问题标题】:How to separate a dataset into more than 2 random samples如何将数据集分成 2 个以上的随机样本
【发布时间】:2020-07-27 01:35:38
【问题描述】:

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

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

我是否首先需要生成一个随机数列表,在这种情况下是 1000 个随机数的列表(比如从 1 到 1000),然后将数据集中对应于数字 1 到 200 的索引作为第一个随机样本,201~400作为第二个随机样本,401~600作为第三个随机样本,以此类推

或者我可以使用 Python 中的某个函数(让我的生活更轻松)?

【问题讨论】:

  • scikit-learn.model_selection.KFold 应该这样做...scikit-learn.org/stable/modules/generated/…(或者如果你有很大的类不平衡,请查看分层 kfold)
  • 您的数据集中是否有 标签,您可能需要根据这些标签对子集进行分层,或者只是随机拆分?
  • 感谢@Andrew,但scikit-learn.model_selection.KFold 或分层 kfold 会产生折叠,而不是 非重叠样本,这正是我所追求的。
  • KFold 可以轻松做到这一点 - 我上面的问题呢?您的数据的形式是什么?熊猫数据框?其他?
  • 嗨@desertnaut,是的,我的数据集有标签,所以如果有一个也可以进行分层抽样的函数会有所帮助。数据可以是数据框或数组。

标签: python random scikit-learn sampling resampling


【解决方案1】:

您可以使用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])

这是您的伪随机、非重叠索引,供您选择数据/标签的相关部分

[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)

【讨论】:

  • 感谢@Andrew。你知道 Python 库中是否有一个函数/包可以自动拆分我的数据集,而无需手动创建索引,然后必须使用索引来拆分数据集?这真的会让我的生活更轻松。
  • 我不知道有什么可以做到这一点,如果我需要做很多事情,我可能会自己将上述内容粘贴到一个函数中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2013-06-29
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多