【问题标题】:Reading chunks of large csv file with shuffled rows for classification with ML读取带有洗牌行的大型 csv 文件块以使用 ML 进行分类
【发布时间】:2020-04-28 17:48:52
【问题描述】:

我最近得到的这个数据集对于我的 RAM 来说太大了。 我必须使用

分块阅读它

pd.read_csv('filename.csv', chunksize=1024)

并且数据集中的所有标签都是连续的,即所有的零都在一起,一个和两个。 每个标签有 12000 个,所以每个块都是零或一或二。

我遇到的问题是,即使我使用 randomizetest_train_split,我的训练数据中仍然会得到所有相同的标签。 因此,我的模型学会为任何输入输出一个值。 恒定输出取决于随机种子。我需要知道如何解决这个错误。

编辑: 这是要求的代码

data_in_chunks = pd.read_csv(data_file, chunksize=4096)
data = next(iter(data_in_chunks)
X = data.drop(['labels'], axis=1)
Y = data.labels
X_train, X_val, Y_train, Y_val = train_test_split(X, Y, stratify=Y, random_state=0) # train test random state has no effect
for i in iter(data_in_chunks):
    train(i) # this is just simplified i used optim in the actual code

所以换句话说,4096 是最高的chunksize 我的 16 gig 的 ram 可以处理,并且由于所有标签的顺序性质,我所有的Y_trainY_test 只有0、1 或 2(所有可能的输出)

请帮忙 提前致谢

【问题讨论】:

  • 您应该提供用于拆分的代码。

标签: python pandas numpy dataframe data-science


【解决方案1】:

您可以通过使用https://github.com/alexandres/terashuf 等实用程序随机改组磁盘上的 .csv 来解决标签顺序问题 - 取决于您的操作系统

编辑

使用 skiprows 参数可以实现仅使用 pandas 和标准库的解决方案。

import pandas as pd
import random, math

def read_shuffled_chunks(filepath: str, chunk_size: int,
                        file_lenght: int, has_header=True):

    header = 0 if has_header else None
    first_data_idx = 1 if has_header else 0
    # create index list
    index_list = list(range(first_data_idx,file_lenght))

    # shuffle the list in place
    random.shuffle(index_list)

    # iterate through the chunks and read them
    n_chunks = ceil(file_lenght/chunk_size)
    for i in range(n_chunks):

        rows_to_keep = index_list[(i*chunk_size):((i+1)*chunk_size - 1)]
        if has_header:
            rows_to_keep += [0] # include the index row
        # get the inverse selection
        rows_to_skip = list(set(index_list) - set(rows_to_keep)) 
        yield pd.read_csv(filepath,skiprows=rows_to_skip, header=header)

请注意,虽然每个块中包含的行将从 csv 中随机采样,但它们是由 pandas 以原始顺序读取的。如果您使用每个数据块的批次训练模型,您可能需要考虑随机化每个子集 DataFrame 以避免出现相同的问题。

【讨论】:

  • 我没有办法使用 pandas 或 numpy 来做到这一点吗?
  • 我想您可以按照this answer 中的建议使用skiprow 参数创建批次,并使用不同的集合多次调用read_csv
  • 非常感谢...您有任何可以让我学习数据管理的链接吗?我最近了解到,收集和管理数据是深度/机器学习最重要的部分,而不是模型本身 xD
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多