首页 > 解决方案 > 大文件的分层随机拆分

问题描述

我有一个 35GB 的 CSV 文件(预计将来会更大),用于 Keras 中的二进制分类问题。为了训练和测试我的模型,我想将数据拆分为训练/测试数据集,每个数据集中具有相同比例的正样本。像这样的东西:

|数据集类型 | 样品总数 | 负样本 | 正例|
|-------------|----------------|------------------| --------------------|
|数据集 | 10000 | 8000 | 2000 |
|火车 | 7000 | 6000 | 1000 |
|测试 | 3000 | 2000 | 1000 |

由于这个数据集太大而无法放入内存,我创建了一个自定义生成器来批量加载数据并通过fit_generator. 因此,我不能应用StratifiedShuffleSplitScikitlearn 的方法来执行此操作,因为它需要整个数据集,而不是仅一部分数据,以保持训练和测试数据集的正实例的比例。

编辑:我的数据具有以下形状:11500 x 160000

有谁知道我怎么能做我想做的事?

解决方案

我一步一步地跟着伊恩林的回答。请注意,如果您有大量列,将 Dataframe 转换为 hdf5 可能会失败。因此,直接从 numpy 数组创建 hdf5 文件

此外,要将数据附加到 hdf5 文件,我必须执行以下操作(设置maxshape=None为您想要无限制地调整大小的数据集的每个维度。在我的情况下,我调整数据集的大小以附加具有固定列号的无限行):

path = 'test.h5'
mydata = np.random.rand(11500, 160000)
if not os.path.exists(path):
    h5py.File(path, 'w').create_dataset('dataset', data=mydata, maxshape=(None, mydata.shape[1]))
else:
    with h5py.File(path, 'a') as hf:
        hf['dataset'].resize(hf['dataset'].shape[0] + mydata.shape[0], axis=0)
        hf["dataset"][-mydata.shape[0]:, :] = mydata

标签: pythonsplitscikit-learnlarge-data

解决方案


我通常这样做:

  1. 将数据存储到numpy.memmap或 HDF5 数据集之类的文件中(如果您的数据集具有大量特征,请使用h5py而不是pandas.DataFrame.to_hdf()pytables)
  2. 使用类似的东西生成一个整数索引range(dataset.shape[0])
  3. 使用 sklearn 中的 split 函数将整数索引拆分为训练/测试
  4. 将整数索引传递给生成器,并使用整数索引在h5py.Datasetnumpy.memmap中查找数据

如果您keras.image.ImageDataGenerator.flow()用作生成器,您可以参考我在此处编写的帮助程序,以便更轻松地重新索引数据。


推荐阅读