Руководство по использованию R для прогнозирования задержки полетов
В этом руководстве представлен полный пример рабочего процесса Synapse Обработка и анализ данных в Microsoft Fabric. Он использует данные nycflights13 и R, чтобы предсказать, прибывает ли самолет более 30 минут поздно. Затем он использует результаты прогнозирования для создания интерактивной панели мониторинга Power BI.
В этом руководстве описано следующее:
- Используйте пакеты tidymodels (рецепты, синтаксический анализ, rsample, рабочие процессы) для обработки данных и обучения модели машинного обучения
- Запись выходных данных в lakehouse в виде разностной таблицы
- Создание визуального отчета Power BI для прямого доступа к данным в этом lakehouse
Необходимые компоненты
Получение подписки Microsoft Fabric. Или зарегистрируйте бесплатную пробную версию Microsoft Fabric.
Войдите в Microsoft Fabric.
Используйте переключатель интерфейса в левой части домашней страницы, чтобы перейти на интерфейс Synapse Обработка и анализ данных.
Откройте или создайте записную книжку. Узнайте, как использовать записные книжки 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)
Загрузите данные и внесите несколько изменений в переменные:
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. На панели мониторинга отображается количество рейсов по перевозчику и количество рейсов по назначению. Панель мониторинга может фильтроваться по результатам прогнозирования задержки.
Включите имя оператора и имя аэропорта в набор данных результатов прогнозирования:
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")
Используйте разностную таблицу для создания семантической модели.
Слева выберите Центр данных OneLake
Выберите lakehouse, подключенный к записной книжке
Выберите "Открыть"
Выбор новой семантической модели
Выберите nycflight13 для новой семантической модели, а затем нажмите кнопку "Подтвердить"
Создается семантическая модель. Выбор нового отчета
Выберите или перетащите поля из панелей "Данные и визуализации " на холст отчета для создания отчета
Чтобы создать отчет, показанный в начале этого раздела, используйте следующие визуализации и данные:
- Линейчатая диаграмма с накоплением:
- Ось Y: carrier_name
- Ось X: полет. Выбор счетчика для агрегирования
- Условные обозначения: origin_name
- Линейчатая диаграмма с накоплением:
- Ось Y: dest_name
- Ось X: полет. Выбор счетчика для агрегирования
- Условные обозначения: origin_name
- Срез с:
- Поле: _pred_class
- Срез с:
- Поле: _pred_late