Вступление

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

Мотивация

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

Набор данных

Набор данных представляет собой набор обзоров и оценок настольных игр, запрошенных с помощью BGG XML API2 2 мая 2019 года. Общий объем этого набора данных составляет примерно 1 ГБ с ~ 13 миллионами записей, среди которых ~ 2,6 миллиона содержат комментарии.

Эта проблема

Я стремился оценить несколько линейных моделей, таких как Linear, Lasso, Ridge Regression, и несколько моделей классификации, таких как Naive Bayes и Logistic Regression, чтобы узнать, какая модель лучше всего подходит для этих данных.

Поскольку здесь я имею дело с текстовой функцией, ее необходимо преобразовать в числовой вектор для обучения некоторых из упомянутых выше моделей. Один из самых популярных методов для этого - векторизация TF-IDF.

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

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

  1. Преобразовать в нижний регистр
  2. Удалите HTML-теги, знаки препинания, ссылки, слова с цифрами, специальные символы.
  3. Удалите слова, длина которых меньше 3
  4. Удалите игнорируемые слова (это часто встречающиеся слова, не содержащие полезной информации, такие как a, an, the и т. Д.)

Все вышеперечисленные операции очень просты, и их реализация в python очень проста.

На выполнение всего сценария ушло ~ 3 мин. 22 сек.. Так в чем проблема ? где узкое место в производительности? Есть ли вообще?

Вот что произошло, когда я запустил метод очистки для набора данных.

На моем ноутбуке используется только одно из 12 доступных ядер (6 физических + 6 виртуальных). Это действительно подтолкнуло меня к мысли, могу ли я использовать другие ядра на своей машине? Могу ли я распараллелить части логики? Масштабируется ли мое решение так же, как и мои данные?

И наконец, почему эти вопросы кажутся знакомыми? Вот для чего нужны инструменты для работы с большими данными, такие как Spark - распределенная обработка больших объемов данных.

Искровое решение

Apache Spark, пожалуй, самый популярный инструмент обработки больших данных, позволяет выражать логику обработки, не беспокоясь о ее распараллеливании. Распараллеливание элегантно абстрагируется в его модели программирования, и решения, созданные с его помощью, могут работать в различных средах, включая, помимо прочего, локальный автономный кластер, YARN и Mesos.

Таким образом, если вам нужно выполнять операции с крупномасштабным набором данных в parellel, Spark позволяет вам создать решение, которое не только распределено, но также масштабируется по горизонтали и работает в различных средах развертывания.

Так как же компания Spark помогла мне оптимизировать решение?

Помните, что реализация Python использует только одно ядро? С помощью Spark я смог распараллелить то же самое, не реализовав логику для распараллеливания.

Вот шаги,

  1. Инициализируйте сеанс Spark и укажите параллелизм

т.е. сколько ядер использовать. Я выбрал 8 ядер.

2. Загрузите данные из файла и выполните очистку.

Как можно заметить, логика очистки так же проста, как и ее аналог в Python.

Только на этот раз данные из файла читаются как 8 фрагментов (диапазон доступных снимков экрана ниже), и операция очистки выполняется параллельно для всех 8 фрагментов с использованием 8 ядер на моем ноутбуке.

В целом, эта искровая работа заняла ~ 2 м 8.

Но ждать !! это небольшой прирост производительности. Быстрее всего на минуту. Действительно ли Spark стоит хлопот? В чем вообще смысл всей этой статьи?

Позвольте мне сделать шаг назад и изменить одну строчку реализации искры вот так

Какое улучшение на этот раз? Это выполнение задания заняло ~ 50,6 секунды. Ого !! Это почти треть времени, которое потребовалось для реализации Python.

Что на самом деле здесь происходит?

Если вы внимательно прочитали эту статью до этого момента, вы, вероятно, уже догадались, что coalesce(1) используется для объединения данных в один раздел путем перемешивания. По сути, это означает, что без coalesce(1) результат работы будет сохранен в 8 разных файлах. Это поведение Spark по умолчанию, и я не буду вдаваться в подробности, почему в этой статье, поскольку это немного выходит за рамки.

Хотя результат этой работы не может быть использован напрямую библиотеками, такими как scikit-learn, ясно, что предварительная обработка может быть оптимизирована, а оборудование / среда могут быть лучше использованы с архитектурой на основе искры.

Заключение

Это ни в коем случае не идеальное решение. Скорее, это рабочий процесс, который лучше использует среду для проектирования данных и способствует эффективному последующему использованию, например, для обучения моделей машинного обучения.

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

Так стоит ли изучать другой язык и набор инструментов только для подготовки данных? Может быть. Может быть нет. Это зависит от проекта в целом.

Ссылки / Ссылки

Я построил обзор для оценки приложения-предсказателя, используя этот подход для инженерии данных. В конце концов я продолжил использовать эту искровую работу для векторизации поля комментариев с помощью TF-IDF Vectorization. Это приложение уже запущено и должно быть доступно по этой ссылке.

Демо этого приложения: https://www.youtube.com/watch?v=L5gGwx_F_H4&feature=youtu.be

Spark job - https://github.com/harsha993/bgreview-etl

Блокнот оценки модели: https://github.com/harsha993/bgreview-notebook

Сообщение в блоге этого общего проекта - https://harshavardhan.netlify.app/blog/2020-05-11-bggratings

Если эта статья была информативной или каким-то образом помогла вам, не стесняйтесь поделиться ею. Наконец, это моя первая средняя статья. Так что если у вас есть предложения, прокомментируйте.