读取带有无序行的大型csv文件块,以便使用ML进行分类

2024-04-26 13:20:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近得到的数据集对于我的RAM来说太大了。 我必须用英语把它分块读

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

数据集中的所有标签都是连续的,也就是说,所有的零加在一起,一加二。 每个标签有12000个,所以每个区块都有0个或1个或2个

我的问题是,即使我使用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(所有可能的输出)

请帮忙 提前谢谢


Tags: csv数据intestreaddatalabelstrain
1条回答
网友
1楼 · 发布于 2024-04-26 13:20:26

您可以通过使用诸如https://github.com/alexandres/terashuf之类的实用程序随机洗牌磁盘上的.csv来解决标签顺序问题,具体取决于您的操作系统

编辑

只使用熊猫和标准库的解决方案可以使用skiprows参数实现

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中随机取样,但熊猫会按照原始顺序读取它们。如果您正在使用批数据块来训练模型,那么您可能需要考虑随机化每个子集数据帧,以避免在同一个问题中出现。p>

相关问题 更多 >