Predicción del retraso del vuelo

En este artículo se usan los datos nycflights13 para predecir si un avión llega más de 30 minutos tarde. A continuación, usamos los resultados de predicción para crear un panel interactivo de Power BI.

Importante

Microsoft Fabric está actualmente en versión preliminar. Esta información está relacionada con un producto en versión preliminar que puede modificarse considerablemente antes de su lanzamiento. Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto a la información que se ofrece aquí.

En este tutorial, aprenderá a:

  • Use paquetes tidymodels , como recetas, análisis, rsample , flujos de trabajo para procesar datos y entrenar un modelo de aprendizaje automático.
  • Escriba los datos de salida en lakehouse como tabla delta.
  • Cree un informe visual de Power BI a través del modo Ver a través de los datos de acceso directo a los datos de lakehouse.

Requisitos previos

  • Abra o cree un cuaderno. Para obtener información sobre cómo hacerlo, consulte Uso de cuadernos de Microsoft Fabric.

  • Cambie el idioma principal estableciendo la opción de idioma en SparkR (R).

  • Adjunte el cuaderno a un lago. En el lado izquierdo, seleccione Agregar para agregar un lago existente o crear un lago.

  • Adjunte el cuaderno a un lago. En el lado izquierdo, seleccione Agregar para agregar un lago existente o crear un lago.

Instalación del paquete

Para usar código en este artículo, instale el paquete nycflights13.

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

Exploración de datos

Los nycflights13 datos contienen información sobre 325.819 vuelos saliendo cerca de Nueva York en 2013. Echemos un vistazo primero a la distribución del retraso del vuelo. En la ilustración siguiente se muestra que la distribución del retraso de llegada está sesgada a la derecha, tiene cola larga en los valores altos.

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

Gráfico de retrasos de vuelo.

Cargue los datos y realice algunos cambios en las variables:

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)

Antes de empezar a crear el modelo, echemos un vistazo rápido a algunas variables específicas que son importantes para el preprocesamiento y el modelado.

Observe que la variable llamada arr_delay es una variable factor. Es importante que la variable de resultados para entrenar un modelo de regresión logística sea un factor.

glimpse(flight_data)

Verá que aproximadamente el 16 % de los vuelos de este conjunto de datos llegaron más de 30 minutos tarde.

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

Hay 104 destinos piloto incluidos en dest.

unique(flight_data$dest)

Hay 16 portadores distintos.

unique(flight_data$carrier)

División de datos

Para empezar, divida este único conjunto de datos en dos: un conjunto de entrenamiento y un conjunto de pruebas . Mantenga la mayoría de las filas del conjunto de datos original (subconjunto elegido aleatoriamente) en el conjunto de entrenamiento. Los datos de entrenamiento se usan para ajustarse al modelo y el conjunto de pruebas se usa para medir el rendimiento del modelo.

Use el rsample paquete para crear un objeto que contenga la información sobre cómo dividir los datos y, a continuación, dos funciones más rsample para crear marcos de datos para los conjuntos de entrenamiento y pruebas:

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)

Creación de recetas y roles

Cree una receta para un modelo de regresión logística simple. Antes de entrenar el modelo, use una receta para crear algunos predictores nuevos y realizar algún preprocesamiento requerido por el modelo.

Use la update_role() función para informar a las recetas de que flight y time_hour son variables con un rol personalizado denominado ID (un rol puede tener cualquier valor de carácter). La fórmula incluye todas las variables del conjunto de entrenamiento distintos de arr_delay los predictores. La receta mantiene estas dos variables de identificador, pero no las usa como resultados o predictores.

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

Para ver el conjunto actual de variables y roles, use la summary() función :

summary(flights_rec)

Creación de características

Realice alguna ingeniería de características para mejorar el modelo. Quizás sea razonable que la fecha del vuelo tenga un efecto sobre la probabilidad de una llegada tardía.

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

Puede ser mejor agregar términos de modelo derivados de la fecha que tienen un mejor potencial para ser importante para el modelo. Derive las siguientes características significativas de la variable de fecha única:

  • Día de la semana
  • Mes
  • Si la fecha corresponde o no a un día festivo.

Haga los tres agregando pasos a la receta:

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())

Ajustar un modelo con una receta

Use la regresión logística para modelar los datos de vuelo. Empiece por compilar la especificación del modelo mediante el parsnip paquete:

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

A continuación, use el paquete para agrupar el workflowsparsnip modelo (lr_mod) con la receta (flights_rec).

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

flights_wflow

Entrenamiento del modelo

Esta es una única función que se puede usar para preparar la receta y entrenar el modelo a partir de los predictores resultantes:

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

Use las funciones xtract_fit_parsnip() auxiliares y extract_recipe() para extraer el modelo o los objetos de receta del flujo de trabajo. Por ejemplo, aquí extraerá el objeto de modelo ajustado y, a continuación, usará la broom::tidy() función para obtener un tibble ordenado de coeficientes de modelo:

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

Predicción de resultados

Ahora use el flujo de trabajo entrenado (flights_fit) para predecir con los datos de prueba no vistos, que se realizan con una sola llamada a predict(). El predict() método aplica la receta a los nuevos datos y, a continuación, los pasa al modelo ajustado.

predict(flights_fit, test_data)

Ahora obtenga la salida de la devolución de predict() la clase predicho: late frente a on_time. Si desea que las probabilidades de clase previstas para cada vuelo en su lugar, use augment() con el modelo más los datos de prueba para guardarlos juntos:

flights_aug <- 
  augment(flights_fit, test_data)

Los datos tienen el siguiente aspecto:

glimpse(flights_aug)

Evaluación del modelo

Ahora tiene un tibble con las probabilidades de clase predichas. A partir de estas primeras filas, verá que el modelo predijo 5 en vuelos a tiempo correctamente (los valores de .pred_on_time son p > 0,50). Pero también sabe que tenemos 81.455 filas totales para predecir.

Quiere una métrica que indique en qué medida el modelo predijo las llegadas tardías, en comparación con el verdadero estado de la variable de resultado, arr_delay.

Use el área bajo la curva ROC como métrica, calculada mediante roc_curve() y roc_auc() desde el yardstick paquete.

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

Creación de un informe de Power BI

El resultado del modelo no es demasiado malo. Use los resultados de predicción de retraso de vuelos para crear un panel interactivo de Power BI, que muestra el número de vuelos por operador y el número de vuelos por destino. El panel también puede filtrar por los resultados de predicción de retraso.

Gráfico del informe de Power BI.

En primer lugar, incluya el nombre del operador y el nombre del aeropuerto en el conjunto de datos del resultado de predicción.

  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)

Los datos tienen el siguiente aspecto:

glimpse(flights_clean)

Convertir los datos en dataframe de Spark:

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

Escriba los datos en una tabla delta en el lago:

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

Ahora puede usar esta tabla para crear un conjunto de datos de Power BI.

  1. A la izquierda, seleccione Centro de datos de OneLake.

  2. Seleccione la instancia de Lakehouse que adjuntó al cuaderno.

  3. En la parte superior derecha, seleccione Abrir.

    Captura de pantalla que muestra dónde abrir lakehouse.

  4. En la parte superior, seleccione Nuevo conjunto de datos de Power BI.

  5. Seleccione nycflight13 para el nuevo conjunto de datos y, a continuación, seleccione Confirmar.

  6. Se crea el conjunto de datos de Power BI. En la parte superior, seleccione Nuevo informe.

  7. Seleccione o arrastre campos desde los paneles de datos y visualizaciones al lienzo del informe para compilar el informe.

Gráfico del conjunto de datos de Power BI.

Para crear el informe que se muestra al principio de esta sección, use las siguientes visualizaciones y datos:

  1. Gráfico de barras apilado con:
    1. Eje Y: carrier_name.
    2. Eje X: vuelo. Seleccione Recuento para la agregación.
    3. Leyenda: origin_name
  2. Gráfico de barras apilado con:
    1. Eje Y: dest_name.
    2. Eje X: vuelo. Seleccione Recuento para la agregación.
    3. Leyenda: origin_name.
  3. Segmentación de datos con:
    1. Campo: _pred_class
  4. Segmentación de datos con:
    1. Campo: _pred_late

Pasos siguientes