Прогнозирование задержки рейсов

В этой статье используются данные nycflights13 для прогнозирования того, прибывает ли самолет более чем на 30 минут с опозданием. Затем мы используем результаты прогнозирования для создания интерактивной панели мониторинга Power BI.

Важно!

Microsoft Fabric в настоящее время находится на этапе предварительной версии. Эта информация относится к предварительной версии продукта, который может быть существенно изменен перед выпуском. Корпорация Майкрософт не дает никаких гарантий, явных или подразумеваемых, в отношении информации, представленной здесь.

В этом руководстве описано следующее:

  • Используйте пакеты tidymodels , такие как рецепты, parsnip, rsample , рабочие процессы , для обработки данных и обучения модели машинного обучения.
  • Запишите выходные данные в lakehouse в виде разностной таблицы.
  • Создайте визуальный отчет Power BI с помощью режима просмотра напрямую обращаться к данным в lakehouse.

Предварительные требования

  • Откройте или создайте записную книжку. Дополнительные сведения см. в статье Использование записных книжек Microsoft Fabric.

  • Измените основной язык, задав для параметра язык значениеSparkR (R).

  • Вложите записную книжку в lakehouse. В левой части щелкните Добавить , чтобы добавить существующий lakehouse или создать lakehouse.

  • Вложите записную книжку в lakehouse. В левой части щелкните Добавить , чтобы добавить существующий lakehouse или создать lakehouse.

Установка пакета

Чтобы использовать код, приведенный в этой статье, установите пакет nycflights13.

install.packages("nycflights13")
# load the packages
library(tidymodels)      # for tidymodels packages
library(nycflights13)    # for flight data

Исследование данных

Данные nycflights13 содержат информацию о 325 819 рейсах, вылетающих из нью-йорка в 2013 году. Давайте сначала рассмотрим распределение задержки рейсов. На рисунке ниже показано, что распределение задержки поступления имеет правильный перекос, он имеет длинный хвост в высоких значениях.

ggplot(flights, aes(arr_delay)) + geom_histogram(color="blue", bins = 300)

График задержки рейса.

Загрузите данные и внесите несколько изменений в переменные:

set.seed(123)

flight_data <- 
  flights %>% 
  mutate(
    # convert the arrival delay to a factor
    arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
    arr_delay = factor(arr_delay),
    # we will use the date (not date-time) in the recipe below
    date = lubridate::as_date(time_hour)
  ) %>% 
  # include the weather data
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  # only retain the specific columns we will use
  select(dep_time, flight, origin, dest, air_time, distance, 
         carrier, date, arr_delay, time_hour) %>% 
  # exclude missing data
  na.omit() %>% 
  # for creating models, it is better to have qualitative columns
  # encoded as factors (instead of character strings)
  mutate_if(is.character, as.factor)

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

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

glimpse(flight_data)

Вы видите, что около 16% рейсов в этом наборе данных прибыли более чем на 30 минут с опозданием.

flight_data %>% 
  count(arr_delay) %>% 
  mutate(prop = n/sum(n))

В содержится dest104 пункта назначения рейсов.

unique(flight_data$dest)

Существует 16 различных перевозчиков.

unique(flight_data$carrier)

Разделение данных

Чтобы приступить к работе, разделите этот набор данных на два: обучающий и проверочный . Сохраните большинство строк в исходном наборе данных (подмножество, выбранное случайным образом) в обучаемом наборе. Обучающие данные используются для соответствия модели, а проверочный набор используется для измерения производительности модели.

rsample Используйте пакет для создания объекта, содержащего сведения о том, как разделить данные, а затем еще rsample две функции для создания кадров данных для обучающего и проверочного наборов:

set.seed(123)
# keep most of the data into the training set 
data_split <- initial_split(flight_data, prop = 0.75)

# create data frames for the two sets:
train_data <- training(data_split)
test_data  <- testing(data_split)

Создание рецепта и ролей

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

Используйте функцию , update_role() чтобы сообщить рецептам, что flight и time_hour являются переменными с пользовательской ролью ID (роль может иметь любое значение символа). Формула включает в обучающий набор все переменные, отличные от arr_delay прогнозов. В рецепте сохраняются эти две переменные идентификатора, но они не используются ни в качестве результатов, ни в качестве прогнозных факторов.

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") 

Чтобы просмотреть текущий набор переменных и ролей, используйте функцию summary() :

summary(flights_rec)

Создание признаков.

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

flight_data %>% 
  distinct(date) %>% 
  mutate(numeric_date = as.numeric(date)) 

Возможно, лучше добавить термины модели, производные от даты, которые имеют больше возможностей быть важными для модели. Наследуйте следующие значимые признаки из одной переменной даты:

  • День недели.
  • Месяц
  • Соответствует ли дата празднику.

Выполните все три действия, добавив шаги в рецепт:

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") %>% 
  step_date(date, features = c("dow", "month")) %>%               
  step_holiday(date, 
               holidays = timeDate::listHolidays("US"), 
               keep_original_cols = FALSE) %>% 
  step_dummy(all_nominal_predictors()) %>% 
  step_zv(all_predictors())

Подгонайте модель с помощью рецепта

Используйте логистическую регрессию для моделирования данных о полетах. Начните с создания спецификации parsnip модели с помощью пакета :

lr_mod <- 
  logistic_reg() %>% 
  set_engine("glm")

Затем используйте пакет, workflows чтобы упаковать parsnip модель (lr_mod) с рецептом (flights_rec).

flights_wflow <- 
  workflow() %>% 
  add_model(lr_mod) %>% 
  add_recipe(flights_rec)

flights_wflow

Обучение модели

Ниже приведена одна функция, которую можно использовать для подготовки рецепта и обучения модели на основе результирующего прогнозора.

flights_fit <- 
  flights_wflow %>% 
  fit(data = train_data)

Используйте вспомогательные функции xtract_fit_parsnip() и extract_recipe() для извлечения объектов модели или рецепта из рабочего процесса. Например, здесь вы извлекаете объект модели, а затем используете broom::tidy() функцию , чтобы получить аккуратный мешок коэффициентов модели:

flights_fit %>% 
  extract_fit_parsnip() %>% 
  tidy()

Прогнозирование результатов

Теперь используйте обученный рабочий процесс (flights_fit) для прогнозирования с помощью невидимых тестовых данных, что можно сделать с помощью одного вызова predict(). Метод predict() применяет рецепт к новым данным, а затем передает их в соответствующую модель.

predict(flights_fit, test_data)

Теперь получите выходные данные из predict() возвращаемого прогнозируемого класса: late и on_time. Если вам нужны прогнозируемые вероятности классов для каждого тестового теста, используйте augment() вместе с моделью и тестовые данные, чтобы сохранить их вместе:

flights_aug <- 
  augment(flights_fit, test_data)

Данные выглядят следующим образом:

glimpse(flights_aug)

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

Теперь у вас есть спрогнозированные вероятности класса. Из этих первых нескольких строк вы увидите, что модель правильно спрогнозировала 5 полетов времени (значения .pred_on_time — p > 0,50). Но вы также знаете, что у нас есть 81 455 строк для прогнозирования.

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

Используйте область под кривой ROC в качестве метрики, вычисленной с помощью roc_curve() и roc_auc() из yardstick пакета.

flights_aug %>% 
  roc_curve(truth = arr_delay, .pred_late) %>% 
  autoplot()

Создание отчета Power BI

Результат модели не слишком плох! Используйте результаты прогнозирования задержки рейсов, чтобы создать интерактивную панель мониторинга Power BI, показывающую количество рейсов по перевозчикам и количество рейсов по пунктам назначения. Панель мониторинга также может фильтровать по результатам прогнозирования задержки.

График отчета Power BI.

Сначала включите имя перевозчика и имя аэропорта в набор данных результатов прогнозирования.

  flights_clean <- flights_aug %>% 
  # include the airline data
  left_join(airlines, c("carrier"="carrier"))%>% 
  rename("carrier_name"="name") %>%
  # include the airports data for origin
  left_join(airports, c("origin"="faa")) %>%
  rename("origin_name"="name") %>%
  # include the airports data for destination
  left_join(airports, c("dest"="faa")) %>%
  rename("dest_name"="name") %>%
  # only retain the specific columns we will use
  select(flight, origin, origin_name, dest,dest_name, air_time,distance, carrier, carrier_name, date, arr_delay, time_hour, .pred_class, .pred_late, .pred_on_time)

Данные выглядят следующим образом:

glimpse(flights_clean)

Преобразуйте данные в кадр данных Spark:

sparkdf <- as.DataFrame(flights_clean)
display(sparkdf)

Запишите данные в разностную таблицу в lakehouse:

# write data into delta table
temp_delta<-"Tables/nycflight13"
write.df(sparkdf, temp_delta ,source="delta", mode = "overwrite", header = "true")

Теперь эту таблицу можно использовать для создания набора данных Power BI.

  1. Слева выберите Центр данных OneLake.

  2. Выберите Lakehouse, прикрепленный к записной книжке.

  3. В правом верхнем углу выберите Открыть.

    Снимок экрана: где открыть lakehouse.

  4. В верхней части страницы выберите Создать набор данных Power BI.

  5. Выберите nycflight13 для нового набора данных, а затем щелкните Подтвердить.

  6. Будет создан набор данных Power BI. В верхней части окна выберите Создать отчет.

  7. Выделите или перетащите поля из областей данных и визуализаций на холст отчета, чтобы создать отчет.

Граф набора данных Power BI.

Чтобы создать отчет, показанный в начале этого раздела, используйте следующие визуализации и данные:

  1. Линейчатая диаграмма с накоплением:
    1. Ось Y: carrier_name.
    2. Ось X: полет. Выберите Счетчик для агрегирования.
    3. Условные обозначения: origin_name
  2. Линейчатая диаграмма с накоплением:
    1. Ось Y: dest_name.
    2. Ось X: полет. Выберите Счетчик для агрегирования.
    3. Условные обозначения: origin_name.
  3. Срез с:
    1. Поле: _pred_class
  4. Срез с:
    1. Поле: _pred_late

Дальнейшие действия