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
Una suscripción Power BI Premium. Si no tiene una, consulte Cómo comprar Power BI Premium.
Un área de trabajo de Power BI con capacidad Premium asignada. Si no tiene un área de trabajo, siga los pasos descritos en Creación de un área de trabajo para crear una y asignarla a una capacidad Premium.
Inicie sesión en Microsoft Fabric.
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)
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 workflows
parsnip
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.
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.
A la izquierda, seleccione Centro de datos de OneLake.
Seleccione la instancia de Lakehouse que adjuntó al cuaderno.
En la parte superior derecha, seleccione Abrir.
En la parte superior, seleccione Nuevo conjunto de datos de Power BI.
Seleccione nycflight13 para el nuevo conjunto de datos y, a continuación, seleccione Confirmar.
Se crea el conjunto de datos de Power BI. En la parte superior, seleccione Nuevo informe.
Seleccione o arrastre campos desde los paneles de datos y visualizaciones al lienzo del informe para compilar el informe.
Para crear el informe que se muestra al principio de esta sección, use las siguientes visualizaciones y datos:
Gráfico de barras apilado con:
- Eje Y: carrier_name.
- Eje X: vuelo. Seleccione Recuento para la agregación.
- Leyenda: origin_name
Gráfico de barras apilado con:
- Eje Y: dest_name.
- Eje X: vuelo. Seleccione Recuento para la agregación.
- Leyenda: origin_name.
Segmentación de datos con:
- Campo: _pred_class
Segmentación de datos con:
- Campo: _pred_late