Как загрузить большой CSV-файл в модель keras?

#numpy #dataframe #keras

#numpy #фрейм данных #keras

Вопрос:

Мне нужно преобразовать большой csv-файл в один np.ndarray горячего кодирования для модели Keras.

 For ex: csv data = 

  F1  F2  F3  
1.'M' 'N' 'I' 
2.'-' 'M' 'K'

Each Column's Possible Values
F1: ['-', 'M', 'N']
F2: ['-', 'A', 'B', 'M', 'N']
F3: ['-', 'I', 'J', 'K']

Expected Value(One hot encode in np.array)
   F1       F2                F3  
1. 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0
2. 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
  

Я могу читать csv, а затем анализировать строку за строкой.
Но это медленно, и у меня очень большой файл.
Есть ли способ использовать «pd.dataframe.apply» для преобразования в одно горячее кодирование?

Ответ №1:

Чайники…. Лол, у panda есть функция get_dummies для таких пустышек, как я. Вот видео https://www.youtube.com/watch?v=0s_1IsROgDc


После того, как я внедрил get_dummies, мой модуль выдает ошибку размера. Я узнал это, потому что я использую .fit_generator(), затем загружаю фрагмент фрейма данных, затем получаю_думмы. Он вернет несоответствующие размеры, если пакет не содержит всех возможных значений.

Решение: из sklearn.предварительная обработка импортирует OneHotEncoder

Урок здесь, если у вас большой набор данных, у вас больше работы.

Ответ №2:

Чтобы сгенерировать данные для тестирования моего метода, я сгенерировал файл, используя указанный вами формат из 60000000 строк (или любую комбинацию из вышеперечисленных, которая умножена на 60 на 1000000). Поскольку ваши данные для каждой строки могут быть только одним из 60 вариантов, вместо сохранения данных (поскольку порядок не должен иметь значения), сохранение количества каждого появления каждой строки намного быстрее, поскольку вместо преобразования 60000000 строк вы конвертируете 60 в свою единственную горячую кодировку. Примечание: файл данных в конечном итоге составил 480 мб. Следующий код считывает данные в словарь:

 def foo():
    data = {}
    with open('data.csv') as f:
        for line in f:
            try:
                data[line]  = 1
            except KeyError as e:
                data[line] = 1
  

С print(timeit(__main__, number=10)) я достиг времени 125.45043465401977 .

С этого момента вы можете преобразовать каждую строку строки в одну горячую кодировку и добавить n копий для обучения. Это также должно упростить обучение вашей модели, поскольку Keras может использовать для обучения объект-генератор python. Это означает, что ни в коем случае не все данные хранятся в памяти, что позволяет проводить обучение на наборах данных, размер которых превышает объем оперативной памяти.