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