繁体   English   中英

大文件的分层随机播放拆分

[英]Stratified Shuffle Split for large files

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

|Dataset type | Total samples | negative samples | positive instances |
|-------------|---------------|------------------|--------------------|
|Dataset      |    10000      |        8000      |       2000         |
|Train        |    7000       |        6000      |       1000         |
|Test         |    3000       |        2000      |       1000         |

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

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

有人知道我该怎么做吗?

我一步步跟随着林恩的回答。 请注意,如果您有大量的列,则将数据帧转换为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

我通常这样做:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM