Руководство по использованию R для прогнозирования задержки полетов

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

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

Необходимые компоненты

  • Получение подписки Microsoft Fabric. Или зарегистрируйте бесплатную пробную версию Microsoft Fabric.

  • Войдите в Microsoft Fabric.

  • Используйте переключатель интерфейса в левой части домашней страницы, чтобы перейти на интерфейс Synapse Обработка и анализ данных.

    Screenshot of the experience switcher menu, showing where to select Data Science.

  • Откройте или создайте записную книжку. Узнайте, как использовать записные книжки Microsoft Fabric.

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

  • Подключите записную книжку к 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)

Screenshot that shows a graph of flight delays.

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

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),
    # You'll use the date (not date-time) for the recipe that you'll create
    date = lubridate::as_date(time_hour)
  ) %>% 
  # Include weather data
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  # Retain only the specific columns that you'll 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's 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))

Эта dest функция имеет 104 направления полета.

unique(flight_data$dest)

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

unique(flight_data$carrier)

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

Разделить один набор данных на два набора: набор обучения и набор тестирования . Храните большую часть строк в исходном наборе данных (как случайно выбранное подмножество) в наборе обучающих данных. Используйте набор данных обучения для соответствия модели и используйте тестовый набор данных для измерения производительности модели.

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

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

# Create DataFrames 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()

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

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

predict(flights_fit, test_data)

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

flights_aug <- 
  augment(flights_fit, test_data)

Просмотрите данные:

glimpse(flights_aug)

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

Теперь у нас есть вероятность прогнозируемого класса. В первых нескольких строках модель правильно прогнозировала пять полетов во время (значения.pred_on_time).p > 0.50 Однако для прогнозирования у нас есть 81 455 строк.

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

Используйте область под операционной характеристикой приемника кривой (AUC-ROC) в качестве метрики. Вычислить его с помощью roc_curve() пакета и roc_auc()из yardstick него:

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

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

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

Screenshot that shows bar charts for number of flights by carrier and number of flights by destination in a Power BI report.

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

  flights_clean <- flights_aug %>% 
  # Include the airline data
  left_join(airlines, c("carrier"="carrier"))%>% 
  rename("carrier_name"="name") %>%
  # Include the airport data for origin
  left_join(airports, c("origin"="faa")) %>%
  rename("origin_name"="name") %>%
  # Include the airport data for destination
  left_join(airports, c("dest"="faa")) %>%
  rename("dest_name"="name") %>%
  # Retain only the specific columns you'll 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 a delta table
temp_delta<-"Tables/nycflight13"
write.df(sparkdf, temp_delta ,source="delta", mode = "overwrite", header = "true")

Используйте разностную таблицу для создания семантической модели.

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

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

  3. Выберите "Открыть"

    Screenshot that shows the button to open a lakehouse.

  4. Выбор новой семантической модели

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

  6. Создается семантическая модель. Выбор нового отчета

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

    Screenshot that shows data and visualization details for a report.

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

  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