Конвейеры машинного обучения в Spark

Построение моделей машинного обучения в Spark — это последовательный процесс. Сегодня мы расскажем о конвейерах (Pipeline) в Spark. Читайте далее: какие объекты используются в конвейере, как он работает, что такое Transfrormer и Estmator, а также как передаются параметры в модели Machine learning.

Структура MLlib

MLlib стандартизирует API-интерфейсы для алгоритмов машинного обучения, чтобы упростить объединение нескольких алгоритмов в один конвейер или рабочий процесс. Концепция конвейера в основном вдохновлена проектом Scikit-learn — библиотекой Python. В Spark-модулей MLlib имеется такие основные объекты как:

  • DataFrame — это тот же DataFrame из Spark SQL, он может содержать различные типы данных. Например, DataFrame может иметь разные столбцы с текстом, векторами, метками и прогнозами.
  • Transformer (преобразователь) преобразует один DataFrame в другой. Например, модель машинного обучения в Spark преобразует исходный набор данных в DataFrame с прогнозами.
  • Estimator — это алгоритм, который применяется над DataFrame для создания преобразователя (Transformer). Например, для алгоритмов машинного обучения — это сам процесс обучения (в зависимости от алгоритма он свой).
  • Pipeline — конвейер, который связывает несколько Transformer и Estimator вместе для объединения рабочего процесса машинного обучения.
  • Parameter используетсяя для определения параметров.

Transformer (Преобразователь)

Transformer служит для преобразования признаков и обученных моделей. Технически Transformer реализует метод transform, который преобразует один DataFrame в другой, обычно путем добавления одного или нескольких столбцов. Например:

  • Для преобразования признаков Spark читает указанный столбец, преобразует его в новый столбец и возвращает новый DataFrame с дополненным столбцом. Примером может служить VectorAssembler, который преобразует столбцы в векторы (о нем мы говорили тут).
  • Для обучения модели Spark читает указанный столбец с векторами, предсказывает значения, исходя из алгоритма Machine Learning, и возвращает новый DataFrame с дополненным столбцов прогнозов.

Estimator

Estimator абстрагирует концепцию алгоритма обучения. Технически Estimator реализует метод fit, который принимает DataFrame и создает модель, которая является преобразователем. Любой алгоритм обучения, например, логистическая регрессия, является Estimator, а вызов fit проводит процесс обучения и возвращает LogisticRegressionModel, которая является моделью и, следовательно, преобразователем (Transformer).

Pipeline (конвейер) — это объединение Transformer и Estimator

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

  1. Разделение текста каждого документа на слова, этот процесс называется токенизацией.
  2. Преобразование слов каждого документа в числовой вектор признаков.
  3. Обучение на основе полученных признаков модели.

Модуль MLlib представляет такой рабочий процесс как конвейер, который состоит из последовательности Transformers и Estimators, которые должны выполняться в определенном порядке.

Итак, внутри конвейера данным исходного датафрейма то преобразуется (transform), то обучается (fit). Причем метод fit возвращает преобразователь, а transform — новый датафейм.

Как работает Pipeline

Проиллюстрируем это на примере NLP задачи. Допустим, нужно сначала текст разбить на токены, затем представить в числовом виде, например, с помощью подсчета частоты слова (с помощью HashingTF), а после передать полученный столбец логистической регрессии. Возвращаемый объект Pipeline будет зависеть от того, какой метод вы вызываете — fit или transfrom.

При вызове метода fit конвейер в свою очередь вызовет методы transform объектов Tokenizer и HashingTF, поскольку у них нет метода fit. Но вот логистическая регрессия в Spark имеет метод fit, поэтому вернется LogisticRegressionModel, с помощью которой можно получать прогнозы с тестовой выборки.

Pipeline Spark
Что происходит при вызове fit

При вызове метода transform результатом будет являться объект DataFrame с прогнозами на основе переданных данных. Все промежуточные результаты преобразований сохраняются.

Pipeline Spark transform
Что происходит при вызове transform

Для алгоритмов машинного обучения в Spark метод fit необходим для обучения модели, а transfrom — для тестирования и предсказаний.

Параметры

В Spark-модуле MLlib есть еще один объект — Paramater (параметр). Estimator и Transformer используют один API для своих параметров. Param — это именованный параметр с своей документацией. ParamMap — это набор пар (параметр, значение).

Есть два основных способа передать параметры алгоритму:

  1. Вызывать соответствующие атрибуты. Например, если объект LogisticRegression может вызвать lr.setMaxIter(10), чтобы при обучении использовать не более 10 итераций.
  2. Передать ParamMap в fit или transform. Любые параметры в ParamMap переопределят ранее указанные.

Пример использования Pipeline

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

Пример кода с обучением модели через метод fit в Spark выглядит следующим образом:

from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF, Tokenizer


training = spark.createDataFrame([
    (0, "a b c d e spark", 1.0),
    (1, "b d", 0.0),
    (2, "spark f g h", 1.0),
    (3, "hadoop mapreduce", 0.0)
], ["id", "text", "label"])


tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.001)

pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
model = pipeline.fit(training)

А вот для получения предсказаний используется метод transform. Пример датафрейма с предсказанными значениями в Spark:

test = spark.createDataFrame([
    (4, "spark i j k"),
    (5, "l m n"),
    (6, "spark hadoop spark"),
    (7, "apache hadoop")
], ["id", "text"])

prediction = model.transform(test)
prediction.show()
+---+------------------+--------------------+----------+
| id|              text|         probability|prediction|
+---+------------------+--------------------+----------+
|  4|       spark i j k|[0.15964077387874...|       1.0|
|  5|             l m n|[0.83783256854767...|       0.0|
|  6|spark hadoop spark|[0.06926633132976...|       1.0|
|  7|     apache hadoop|[0.98215753334442...|       0.0|
+---+------------------+--------------------+----------+

 

Еще больше подробностей о машинном обучении и конвейерах в Spark вы узнаете на специализированном курсе «Машинное обучение в Apache Spark» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Записаться на курс

Смотреть раcписание

Добавить комментарий

Поиск по сайту