Преобразование sparsematrix в hdf5 занимает слишком много времени даже при сбоях Vaex и памяти

#python #sparse-matrix #dask #hdf5 #vaex

#python #разреженная матрица #dask #hdf5 #vaex

Вопрос:

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

Я векторизовал текстовые данные, используя TIDF, как показано ниже:

 from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(max_features=10000)
text_vect = vect.fit_transform(myDataframe['text_column'])
text_vect_df = pd.DataFrame.sparse.from_spmatrix(text_vect)
  

text_vect_df.shape: 250000 x 9300

Я преобразовал text_vect_df в файл csv и использовал vaex для преобразования его в hdf5, как показано ниже. Vaex должен хорошо работать с форматом hdf5.

 text_vaex_hdf5 = vaex.from_csv('text_vectorized.csv', convert=True, chunk_size=5_000_000)
  

Это text_vectorized.csv 4 ГБ. vaex.from_csv() занимает слишком много времени и сбой памяти (8 ГБ ОЗУ).

Я попробовал в своем Jupyterhub (с внешним графическим процессором), чтобы text_vect_df.shape 200000 x 9300. он загружался порциями по 7 ГБ каждый, и чтение этого занимает слишком много времени.

 text_vectorized.csv_chunk0.hdf5
7.51 GB
text_vectorized.csv_chunk1.hdf5
7.51 GB
text_vectorized.csv_chunk2.hdf5
2.5 GB
  

Вопрос 1. Как файлы hdf5 могут быть больше, чем исходные файлы csv5? Разве оно не должно быть меньше?
Вопрос 2. Как сохранить фрейм данных размером 950000 x 10000, если меньший размер выходит из строя / сбой?

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

Уже опробованные решения:

  1. Pandas to_hdf не следует использовать для хранения разреженной матрицы, потому что https://vaex.readthedocs.io/en/latest/faq.html

При использовании метода pandas .to_hdf выходной файл HDF5 имеет формат, основанный на строках. Vaex, с другой стороны, ожидает, что файлы HDF5 на основе столбцов

  1. Без dask или vaex происходит сбой памяти при запуске KNN, SVM или любых алгоритмов ML.
  2. Пробовал с dask, не повезло, рабочий был убит в локальном кластере клиента.
  3. С Vaex невозможно двигаться вперед

Комментарии:

1. Какой формат у вас разреженный csv? Координата трех столбцов?

2. @CJR Я не совсем понимаю, что вы подразумеваете под координатами трех столбцов. Не могли бы вы уточнить? Матрица, возвращаемая TFID, является матрицей документа (n_samples, n_features). Итак, то же самое хранится в CSV. Столбцы в CSV представляют собой числа в диапазоне от 1 до 10000 (функции), они имеют значения ячеек как 0.0 и веса.

3. Я не совсем понимаю, что вы делаете — у вас есть разреженная матрица, которую вы превращаете в разреженный фрейм данных, который вы превращаете в плотный файл csv, который вы превращаете в плотный файл hdf5, который вы пытаетесь прочитать? Мне это кажется безумным рабочим процессом. Также у вас почти наверняка есть нечисловые данные, из-за которых ваш фрейм данных post-CSV является объектами вместо чисел.

4. 1) Если я сохраняю разреженную матрицу непосредственно в h5, она сохраняется в формате строки. Чтение его с помощью vaex ожидает, что h5 на основе столбцов, так что это дает мне ошибки. 2) Я не могу объединить разреженную матрицу с оставшимся числовым фреймом данных, поэтому я должен превратить разреженную матрицу в разреженный фрейм данных, а затем объединить ее с другим моим числовым фреймом данных. Я все еще не могу сохранить это как h5, потому что я получаю сообщение об ошибке при чтении vaex. 3) Единственный вариант сейчас: мне нужно сохранить sparsematrix в виде csv-файла, а затем преобразовать его в hd5 с помощью vaex, а затем объединить его с уже преобразованным фреймом данных numeric.h5. 🙁

5. Лично я бы, вероятно, сохранил ваши данные в разреженном виде и пропустил всю эту ерунду, но моим вторым выбором было бы преобразовать блоки строк в файлы hdf5, а затем объединить их все в конце, если вы по какой-то причине решили использовать vaex (я пытался использовать vaex только один раз, и я подумал, что этодовольно бесполезно). Вероятно, вам следует задать вопрос о вашей проблеме, а не о проблемах, с которыми вы столкнулись при решении вашей проблемы. Заставить плохую идею работать не так хорошо, как создать новую, лучшую идею.