Слишком часто специалисты по обработке данных увлекаются исследовательской фазой науки о данных, т. Е. Запуском нескольких моделей для определенного набора данных и оптимизацией для повышения точности.
Исследовательский этап машинного обучения, несомненно, важен. Прежде чем вкладывать значительное время и ресурсы в производственный процесс, необходимо убедиться, что модель работает правильно и имеет предсказательную силу.
Однако всегда есть риск потратить слишком много времени на эту фазу и не на производство. То есть сопоставление данных из нескольких источников и проверка пригодности инфраструктуры для работы с большими потоками данных.
Вот пример конвейера машинного обучения, созданного для прогнозирования отмены бронирования отелей с помощью классификатора градиентного повышения. В этом примере построены и запущены две модели для двух разных отелей (H1 и H2).
Трубопровод
В частности, конвейер устроен следующим образом:
- Выбранные столбцы из таблицы отмены бронирования загружаются из базы данных Google BigQuery в блокнот Jupyter с помощью pythonbq - клиента Python для BigQuery.
- Сеанс Spark инициализируется с помощью pyspark. Соответствующие преобразования данных выполняются, чтобы позволить классификатору GBTC работать с соответствующими данными.
- Разделение поездов и тестов 80/20 проводится, чтобы модель могла оценить производительность на невидимой части обучающей выборки.
- Прогнозы модели преобразуются из фрейма данных 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.
Заявление об ограничении ответственности: эта статья написана на условиях «как есть» без каких-либо гарантий. Он был написан с целью предоставить обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.