python - 大文件的分层随机拆分
问题描述
我有一个 35GB 的 CSV 文件(预计将来会更大),用于 Keras 中的二进制分类问题。为了训练和测试我的模型,我想将数据拆分为训练/测试数据集,每个数据集中具有相同比例的正样本。像这样的东西:
|数据集类型 | 样品总数 | 负样本 | 正例| |-------------|----------------|------------------| --------------------| |数据集 | 10000 | 8000 | 2000 | |火车 | 7000 | 6000 | 1000 | |测试 | 3000 | 2000 | 1000 |
由于这个数据集太大而无法放入内存,我创建了一个自定义生成器来批量加载数据并通过fit_generator
. 因此,我不能应用StratifiedShuffleSplit
Scikitlearn 的方法来执行此操作,因为它需要整个数据集,而不是仅一部分数据,以保持训练和测试数据集的正实例的比例。
编辑:我的数据具有以下形状: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
解决方案
我通常这样做:
- 将数据存储到numpy.memmap或 HDF5 数据集之类的文件中(如果您的数据集具有大量特征,请使用h5py而不是
pandas.DataFrame.to_hdf()
pytables) - 使用类似的东西生成一个整数索引
range(dataset.shape[0])
- 使用 sklearn 中的 split 函数将整数索引拆分为训练/测试
- 将整数索引传递给生成器,并使用整数索引在h5py.Dataset或numpy.memmap中查找数据
如果您keras.image.ImageDataGenerator.flow()
用作生成器,您可以参考我在此处编写的帮助程序,以便更轻松地重新索引数据。
推荐阅读
- python - 两个数据帧的所有组合
- c++ - 调试错误:变量“cardDesc”周围的堆栈已损坏
- python-3.x - 相同的代码在 PyCharm 中不工作,但在 PyCharm 之外工作
- html - 调整浏览器大小时,坡度保持流动(使用剪辑路径)
- r - 使用子集过滤数据
- android - 无法解决:firebase-storage-15.0.0
- java - 爪哇。未为 Lock 类型定义方法 isOpen()。还需要一些帮助来修复一些代码/调试
- ruby - 如何在 JRuby w/ActiveRecord 中创建多对多类实例关系?
- haskell - 努力实现 Monad 功能
- python - 延长数据框 Python 中值的日期