Мультиклассовая классификация текстов с MLlib и PySpark

MLlib, PySpark и многоклассовая классификация криминальных сводок с помощью нескольких алгоритмов. Не пропустите! Будет интересно.

Мультиклассовая классификация текстов с PySpark

Мы обрабатываем так много информации ежедневно, что возможность передавать и анализировать ее в реальном времени стала очень ценной. Apache Spark это умеет, благодаря чему стремительно набирает популярность. Он достаточно быстр для выполнения исследовательских запросов без выборки. Многие эксперты Data Science рекомендуют его.

Мы будем использовать библиотеку машинного обучения Spark (MLlib) для многоклассовой классификации текста c помощью PySpark. Если вы хотите увидеть реализацию со Scikit-Learn, взгляните на этот материал.

Данные

Задача состоит в том, чтобы классифицировать описания преступлений в Сан-Франциско по 33 предопределенным категориям. Исходные данные можно загрузить из Kaggle.

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

  • Входные данные: описание преступления. Например, STOLEN AUTOMOBILE (украденный автомобиль).
  • Выходные данные: категория. Например, VEHICLE THEFT (транспортная кража).

Для решения мы будем использовать различные методы извлечения признаков и алгоритмы контролируемого машинного обучения Spark.

Получение и извлечение данных

Загрузить CSV-файл очень просто с помощью csv-пакетов Spark.

Набор данных загружен, можно начинать анализ. Убираем ненужные столбцы и выводим первые 5 строк:

Мультиклассовая классификация текстов с MLlib и PySpark

Чтобы распечатать схему в формате дерева, нужно использовать функцию printSchema() .

Мультиклассовая классификация текстов с MLlib и PySpark

Получим самые многочисленные категории преступлений:

Мультиклассовая классификация текстов с MLlib и PySpark

А вот ТОП-20 описаний:

Мультиклассовая классификация текстов с MLlib и PySpark

Классификация по этапам

Spark Machine Learning Pipelines API похож на Scikit-Learn. Наша классификация состоит из трех шагов:

  1. RegexTokenizer – токенизация с использованием регулярного выражения;
  2. StopwordsRemover – удаление стоп-слов;
  3. CountVectors – расчет векторов (метод «мешок слов»).

StringIndexer

StringIndexer кодирует столбец строковых меток в столбец индексов. Они находятся в интервале [0, numLabels) и отсортированы по частоте, поэтому самая частая метка получает индекс 0.

В нашем случае столбец меток (Категории) будет перекодирован в индексы от 0 до 32. Самая популярная метка LARCENY/THEFT (кража).

Мультиклассовая классификация текстов с MLlib и PySpark

Обучающие и тестовые наборы

Размер тренировочной выборки: 5185

Размер тестовой выборки: 2104

Обучение и оценка моделей

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

Логистическая регрессия с использованием векторов слов

Мультиклассовая классификация текстов с MLlib и PySpark

0.9610787444388802

Логистическая регрессия с использованием метода TF-IDF

Мультиклассовая классификация текстов с MLlib и PySpark

0.9616202660247297

Результат такой же.

Кросс-валидация

Теперь проведем кросс-валидацию, чтобы настроить гиперпараметры.

0.9851796929217101

Наивный Байесовский подход

Мультиклассовая классификация текстов с MLlib и PySpark

0.9625414629888848

Случайный лес

Мультиклассовая классификация текстов с MLlib и PySpark

0.6600326922344301

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

Очевидно, что для нашей модели следует использовать логистическую регрессию с перекрестной валидацией.