Чтение кусков большого CSV-файла с перемешанными строками для классификации с ML - PullRequest
0 голосов
/ 28 апреля 2020

Недавно я получил этот набор данных, который слишком велик для моей оперативной памяти. Я должен прочитать его кусками, используя

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

И все метки в наборе данных являются непрерывными, то есть все нули вместе, и единицы, и двойки. Каждый ярлык содержит 12000, поэтому в каждом чанке есть все нули, единицы или двойки.

Проблема, с которой я сталкиваюсь, - даже если я использую randomize и test_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 гигабайт оперативной памяти могут обрабатывать, и из-за последовательной природы всех меток, все мои Y_train и Y_test имеют только 0, или 1 или 2 (все возможные выходы)

Пожалуйста, помогите Заранее спасибо

1 Ответ

2 голосов
/ 29 апреля 2020

Вы можете решить проблему с порядком меток путем случайного перемешивания .csv на диске с помощью таких утилит, как https://github.com/alexandres/terashuf - в зависимости от вашей ОС

EDIT

Решение, использующее только pandas и стандартные библиотеки, может быть реализовано с использованием аргумента 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, они читаются pandas в их первоначальном порядке. Если вы тренируете свою модель с пакетами каждого блока данных, вы можете рассмотреть возможность рандомизации каждого подмножества DataFrame, чтобы избежать возникновения одной и той же проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...