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

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

Однако всегда есть риск потратить слишком много времени на эту фазу и не на производство. То есть сопоставление данных из нескольких источников и проверка пригодности инфраструктуры для работы с большими потоками данных.

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

Трубопровод

В частности, конвейер устроен следующим образом:

  1. Выбранные столбцы из таблицы отмены бронирования загружаются из базы данных Google BigQuery в блокнот Jupyter с помощью pythonbq - клиента Python для BigQuery.
  2. Сеанс Spark инициализируется с помощью pyspark. Соответствующие преобразования данных выполняются, чтобы позволить классификатору GBTC работать с соответствующими данными.
  3. Разделение поездов и тестов 80/20 проводится, чтобы модель могла оценить производительность на невидимой части обучающей выборки.
  4. Прогнозы модели преобразуются из фрейма данных Spark в pandas, а затем экспортируются в CSV. Эти прогнозы затем считываются обратно в Jupyter Notebook, и создается матрица неточностей для оценки точности модели.

Google BigQuery

Во-первых, соответствующий CSV-файл для H1 можно загрузить в Google BigQuery и сохранить в виде таблицы.

В этом случае для схемы выбирается опция «Автоматическое определение» и создается таблица.

Вот таблица, отображаемая в Google BigQuery:

Взаимодействие с PySpark

Spark специально разработан для работы с «большими данными». Хотя размер наборов данных в этом примере по-прежнему является подходящим для работы с моделями, присущими самому Python, предполагается, что по мере добавления данных в базу данных в конечном итоге потребуется использовать Spark для эффективной обработки. эти большие пакеты данных. Более того, Spark лучше подходит для работы с данными, которые передаются и постоянно обновляются.

Сеанс Spark инициализируется с помощью pyspark, а pythonbq используется для загрузки данных из BigQuery:

import pyspark
conf = pyspark.SparkConf()
conf.set('spark.local.dir', 'path')
sc = pyspark.SparkContext(conf=conf)
from pythonbq import pythonbq
myProject=pythonbq(
  bq_key_path='json_file',
  project_id='project_id'
)

Вот отображение таблицы с выбранными функциями в Jupyter Notebook:

Загружаются соответствующие функции и метка вывода:

from pyspark.ml import Pipeline
from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler
categoricalColumns = ["Country", "MarketSegment", "ArrivalDateMonth", "DepositType", "CustomerType"]
stages = []
for categoricalCol in categoricalColumns:
    stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol + "Index")
    encoder = OneHotEncoderEstimator(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + "classVec"])
    stages += [stringIndexer, encoder]
label_stringIdx = StringIndexer(inputCol="IsCanceled", outputCol="label")
stages += [label_stringIdx]
numericCols = ["LeadTime", "ArrivalDateYear", "ArrivalDateWeekNumber", "ArrivalDateDayOfMonth", "RequiredCarParkingSpaces"]
assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericCols
assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")
stages += [assembler]

GBTClassifier

GBTClassifier (или Gradient Boosting Classifier) ​​теперь может быть загружен для обучения с соответствующими данными.

from pyspark.ml.classification import GBTClassifier
  
partialPipeline = Pipeline().setStages(stages)
pipelineModel = partialPipeline.fit(dataset)
preppedDataDF = pipelineModel.transform(dataset)
gbtClassifier = GBTClassifier()
trainedModel = gbtClassifier.fit(preppedDataDF)

После разделения данных на 80% обучение и 20% тест классификатор можно обучить.

gbtModel = gbtClassifier.fit(trainingData)
predictions = gbtModel.transform(testData)
selected = predictions.select("label", "prediction", "probability")

Оценим модель.

from pyspark.ml.evaluation import BinaryClassificationEvaluator
evaluator = BinaryClassificationEvaluator(rawPredictionCol="rawPrediction")
evaluator.evaluate(predictions)

Модель возвращает оценку 0,9131.

Теперь прогнозы можно преобразовать в фрейм данных Pandas и экспортировать в CSV:

selected.toPandas().to_csv('h1predictions.csv')

После повторного импорта прогнозов вот матрица путаницы с результатами.

Общая точность показателя f1 составляет 84%, в то время как отзыв 66% указывает на то, что модель правильно определяет 66% клиентов, которые отменяют бронирование в отеле.

Та же процедура выполняется для таблицы H2 - вот результаты матрицы неточностей.

Точность по шкале f1 составляет 94%, а отзывчивость - 79%.

Заключение

В этом примере мы видели:

  • Как заполнить таблицу в Google BigQuery
  • Взаимодействие записной книжки Jupyter с базой данных BigQuery
  • Реализуйте классификатор повышения градиента с помощью pyspark.ml

Большое спасибо за ваше время - любые мысли или отзывы приветствуются!

Соответствующий репозиторий GitHub для этого примера можно найти здесь, а больше моих материалов по науке о данных можно найти на michael-grogan.com.

Заявление об ограничении ответственности: эта статья написана на условиях «как есть» без каких-либо гарантий. Он был написан с целью предоставить обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.