Код, обсуждаемый в этом посте, доступен по адресу:

https://github.com/opsabarsec/titanic_on_databricks

Заранее небольшая заметка для новичков в Data Science или просто для людей, которые думают, что Deep Learning = Magic. Лучшие данные, более умная разработка функций превзойдут лучший алгоритм 9–0. Наука о данных изучает данные, а не модели.

Но, сказав это, экспериментирование с несколькими моделями и отслеживание результатов — типичная задача современных специалистов по данным. После создания конвейера данных на Databricks, как показано в предыдущем посте, пришло время передать все алгоритму машинного обучения (ML). Небольшое резюме: данные были знаменитым набором данных Титаника. Что для многих является входной дверью в искусственный интеллект (ИИ). Проблема обычно решается с помощью классических алгоритмов машинного обучения, таких как логистическая регрессия. При работе со Spark важным шагом является вставка этого в конвейер моделирования.

Этап 1: одно горячее кодирование категориальных столбцов, выполняемое с помощью следующего кода:

from pyspark.ml.feature import OneHotEncoder, StringIndexer

categoricalCols = [field for (field, dataType) in trainDF.dtypes if dataType == "string"]
indexOutputCols = [x + "Index" for x in categoricalCols]
oheOutputCols = [x + "OHE" for x in categoricalCols]

stringIndexer = StringIndexer(inputCols=categoricalCols, outputCols=indexOutputCols, handleInvalid="skip")
oheEncoder = OneHotEncoder(inputCols=indexOutputCols, outputCols=oheOutputCols)

Чуть сложнее, чем Pandas, так как мы используем две функции (индексирование + кодирование) вместо одной.

Этап 2. Сборка прогностических признаков

Следующий шаг - это то, что вместо этого отличается между двумя языками. В этот момент вам нужно вызвать функцию VectorAssembler. Цитирую из [1] «VectorAssembler — это преобразователь, который объединяет заданный список столбцов в один векторный столбец. Это полезно для объединения необработанных функций и функций, созданных различными преобразователями функций, в единый вектор функций, чтобы обучать модели машинного обучения, такие как логистическая регрессия и деревья решений».

Этап 3: вызовите алгоритм, который вы хотите использовать для модели.

В этом случае мы используем логистическую регрессию из библиотек pyspark.ml.classification.

Наконец, давайте построим конвейер нашей модели, используя функцию, предоставленную в Spark:

from pyspark.ml import Pipeline
stages = [stringIndexer, oheEncoder, vecAssembler, lr]
pipeline = Pipeline(stages=stages)
pipelineModel = pipeline.fit(trainDF)

Модель можно экспортировать

pipelineModel.write().overwrite().save(pipelinePath)

и перезагружается при необходимости, без обучения алгоритма

from pyspark.ml import PipelineModel
savedPipelineModel = PipelineModel.load(pipelinePath)

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

Плохой прогноз? Ну, в моем случае R2 был позорным 0,2. Нет, нечего паниковать, в этой статье показано, как лучше извлекать информацию из данных для улучшения прогнозов [2] (опять же, НЕ изменяя алгоритм)

Далее хорошо бы отслеживать эксперименты с помощью MLFlow. Для этого нужно сделать отдельный пост. Основы MLFlow проиллюстрированы в документации Databricks [3].

[1] https://george-jen.gitbook.io/data-science-and-apache-spark/vectorassembler

[2] Прогноз выживания Титаника | Ваш первый проект по науке о данных (analyticsvidhya.com)

[3] Руководство по MLflow | Блоки данных на AWS