Python 用于大文件的分层随机剥离
我有一个35GB的CSV文件(预计将来会更大),用于Keras中的二进制分类问题。为了训练和测试我的模型,我想将数据分割成训练/测试数据集,每个数据集中的阳性样本比例相同。大概是这样的: |Dataset type | Total samples | negative samples | positive instances | |-------------|---------------|------------------|--------------------| |Dataset | 10000 | 8000 | 2000 | |Train | 7000 | 6000 | 1000 | |Test | 3000 | 2000 | 1000 | 我通常这样做:Python 用于大文件的分层随机剥离,python,split,scikit-learn,large-data,Python,Split,Scikit Learn,Large Data,我有一个35GB的CSV文件(预计将来会更大),用于Keras中的二进制分类问题。为了训练和测试我的模型,我想将数据分割成训练/测试数据集,每个数据集中的阳性样本比例相同。大概是这样的: |Dataset type | Total samples | negative samples | positive instances | |-------------|---------------|------------------|--------------------| |Dataset
pandas.DataFrame.to_hdf()
或pytables)range(dataset.shape[0])
keras.image.ImageDataGenerator.flow()
作为生成器,您可以参考我编写的帮助程序,以便更轻松地重新索引数据。我通常会这样做:
pandas.DataFrame.to_hdf()
或pytables)range(dataset.shape[0])
如果您使用
keras.image.ImageDataGenerator.flow()
作为生成器,您可以参考我编写的帮助程序,以便更轻松地重新编制数据索引。感谢您的回答@Ian Lin。但是,将我的csv文件转换为HDF5不起作用,因为它太大。值得一提的是,我的数据集包含11500个样本和160000个特征(它们不是图像),即11500x160000个矩阵。”引发“标题太大”异常。11500x160000实际上非常小。我认为HDF5中维度的最大大小是2^64
。你是怎么做到的?我可以使用h5py
轻松创建一个具有如此大维度的文件:h5py.file('test.h5','w')。创建数据集('test',data=np.random.rand(11500160000))
我尝试使用df.to_hdf('test.h5',w',formar='table')创建它。请注意,我需要一个非固定数据集,因为要创建它,我需要附加来自多个批次的数据。我读到当format='fixed'
(默认值)时,这样做没有问题。在第一次迭代之后,我使用df.to_hdf(path,append=True)
将数据追加到现有文件中。是的,我认为这是pandas
的一个限制,所以我建议您使用h5py
而不是pandas
(pytables
)。如果使用h5py
,则可以首先创建数据集,因为您已经知道尺寸。创建之后,只需填充多个批次中的行。我已经按照您的建议完成了,现在它可以正常工作了!我将更新我的问题,以使我的解决方案能够帮助其他人。感谢您的回答@Ian Lin。但是,将我的csv文件转换为HDF5不起作用,因为它太大。值得一提的是,我的数据集包含11500个样本和160000个特征(它们不是图像),即11500x160000个矩阵。”引发“标题太大”异常。11500x160000实际上非常小。我认为HDF5中维度的最大大小是2^64
。你是怎么做到的?我可以使用h5py
轻松创建一个具有如此大维度的文件:h5py.file('test.h5','w')。创建数据集('test',data=np.random.rand(11500160000))
我尝试使用df.to_hdf('test.h5',w',formar='table')创建它。请注意,我需要一个非固定数据集,因为要创建它,我需要附加来自多个批次的数据。我读到当format='fixed'
(默认值)时,这样做没有问题。在第一次迭代之后,我使用df.to_hdf(path,append=True)
将数据追加到现有文件中。是的,我认为这是pandas
的一个限制,所以我建议您使用h5py
而不是pandas
(pytables
)。如果使用h5py
,则可以首先创建数据集,因为您已经知道尺寸。创建之后,只需填充多个批次中的行。我已经按照您的建议完成了,现在它可以正常工作了!我会更新我的问题,提出我的解决方案,这样它可以帮助其他人。
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