В своей книге (Data Science on the Google Cloud Platform) я рассмотрю проблему прогнозирования задержки полета и покажу, как ее решить, используя различные инструменты, включая Spark Mlib и TensorFlow. Теперь, когда было объявлено о BigQuery ML, я подумал, что покажу, как прогнозировать задержки рейсов с помощью BQ ML.

Не заблуждайтесь - вам все равно нужно собирать данные, исследовать их, очищать и обогащать. По сути, все, что я делаю в главах 1–9. В главе 10 я использовал TensorFlow. В этой статье я буду использовать BQML.

Создать модель регрессии

Вот запрос BigQuery для создания модели:

#standardsql
CREATE OR REPLACE MODEL flights.arrdelay
OPTIONS
  (model_type='linear_reg', input_label_cols=['arr_delay']) AS
SELECT
  arr_delay,
  carrier,
  origin,
  dest,
  dep_delay,
  taxi_out,
  distance
FROM
  `cloud-training-demos.flights.tzcorr`
WHERE
  arr_delay IS NOT NULL

Обратите внимание, что:

  1. Он начинается с CREATE MODEL, при этом имя модели выглядит так же, как имя таблицы. Примечание. «Полеты» - это имя набора данных, в котором будет храниться полученная модель, поэтому перед выполнением запроса вам необходимо создать пустой набор данных.
  2. Параметры определяют алгоритм - в данном случае алгоритм линейной регрессии с меткой arr_delay.
  3. По сути, я использую переменные-предикторы и метки в SELECT

Примерно через 10 минут модель обучается, и результаты оценки заполняются для каждой итерации:

Потери здесь являются среднеквадратичной ошибкой, поэтому модель сходится на итерации №6 со среднеквадратичным значением около sqrt (97) = 10 минут.

Прогнозирование с использованием модели

Цель обучения модели - предсказывать с ее помощью. Вы можете делать прогнозы модели с помощью оператора SQL:

#standardsql
SELECT * FROM ML.PREDICT(MODEL flights.arrdelay,
(
SELECT
  carrier,
  origin,
  dest,
  dep_delay,
  taxi_out,
  distance,
  arr_delay AS actual_arr_delay
FROM
  `cloud-training-demos.flights.tzcorr`
WHERE
  arr_delay IS NOT NULL
LIMIT 10))

Это приводит к:

Как видите, поскольку мы обучили модель предсказывать переменную с именем «arr_delay», ML.PREDICT создает столбец результатов с именем predicted_arr_delay. В данном случае я беру 10 строк из исходной таблицы и прогнозирую задержку прибытия для этих рейсов.

Создать модель классификации

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

#standardsql
CREATE OR REPLACE MODEL flights.ontime
OPTIONS
  (model_type='logistic_reg', input_label_cols=['on_time']) AS
SELECT
  IF(arr_delay < 15, 1, 0) AS on_time,
  carrier,
  origin,
  dest,
  dep_delay,
  taxi_out,
  distance
FROM
  `cloud-training-demos.flights.tzcorr`
WHERE
  arr_delay IS NOT NULL

Вот результаты оценки:

и пример прогнозов:

Оценка модели

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

#standardsql
SELECT * FROM ML.EVALUATE(MODEL flights.ontime,
(
SELECT
  IF(arr_delay < 15, 1, 0) AS on_time,
  carrier,
  origin,
  dest,
  dep_delay,
  taxi_out,
  distance
FROM
  `cloud-training-demos.flights.tzcorr`
WHERE
  arr_delay IS NOT NULL
))

Результат:

BQML действительно прост и действительно эффективен. Наслаждаться!