Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于大文件的分层随机剥离_Python_Split_Scikit Learn_Large Data - Fatal编程技术网

Python 用于大文件的分层随机剥离

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

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

|Dataset type | Total samples | negative samples | positive instances | |-------------|---------------|------------------|--------------------| |Dataset | 10000 | 8000 | 2000 | |Train | 7000 | 6000 | 1000 | |Test | 3000 | 2000 | 1000 | 我通常这样做:

  • 将数据存储到类似文件或HDF5的数据集中(如果数据集具有大量功能,请使用而不是
    pandas.DataFrame.to_hdf()
    或pytables)
  • 使用类似以下内容生成整数索引
    range(dataset.shape[0])
  • 使用sklearn中的split函数将整数索引拆分为训练/测试
  • 将整数索引传递到生成器中,并使用整数索引查找或中的数据
  • 如果您使用
    keras.image.ImageDataGenerator.flow()
    作为生成器,您可以参考我编写的帮助程序,以便更轻松地重新索引数据。

    我通常会这样做:

  • 将数据存储到类似文件或HDF5的数据集中(如果数据集具有大量功能,请使用而不是
    pandas.DataFrame.to_hdf()
    或pytables)
  • 使用类似以下内容生成整数索引
    range(dataset.shape[0])
  • 使用sklearn中的split函数将整数索引拆分为训练/测试
  • 将整数索引传递到生成器中,并使用整数索引查找或中的数据

  • 如果您使用
    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