Код, обсуждаемый в этом посте, доступен по адресу:
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)