Oktatóanyag: R használata a repülési késés előrejelzéséhez

Ez az oktatóanyag a Synapse Adattudomány munkafolyamatának végpontok közötti példáját mutatja be a Microsoft Fabricben. A nycflights13 adatokat és az R-t használja annak előrejelzésére, hogy egy repülő több mint 30 perc késéssel érkezik-e. Ezután az előrejelzési eredmények alapján interaktív Power BI-irányítópultot hoz létre.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Tidymodels-csomagok (receptek, elemzések, rsample, munkafolyamatok) használata az adatok feldolgozásához és egy gépi tanulási modell betanításához
  • A kimeneti adatok írása egy tóházba deltatáblaként
  • Power BI-vizualizációs jelentés készítése a tóházban lévő adatok közvetlen eléréséhez

Előfeltételek

  • Microsoft Fabric-előfizetés lekérése. Vagy regisztráljon egy ingyenes Microsoft Fabric-próbaverzióra.

  • Jelentkezzen be a Microsoft Fabricbe.

  • A kezdőlap bal oldalán található élménykapcsolóval válthat a Synapse Adattudomány felületre.

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

  • Nyisson meg vagy hozzon létre egy jegyzetfüzetet. A Microsoft Fabric-jegyzetfüzetek használatáról további információt a Microsoft Fabric-jegyzetfüzetek használata című témakörben talál.

  • Állítsa a nyelvi beállítást SparkR (R) értékre az elsődleges nyelv módosításához.

  • Csatolja a jegyzetfüzetet egy tóházhoz. A bal oldalon válassza a Hozzáadás lehetőséget egy meglévő tóház hozzáadásához vagy egy tóház létrehozásához.

Csomagok telepítése

Telepítse a nycflights13 csomagot az oktatóanyagban szereplő kód használatához.

install.packages("nycflights13")
# Load the packages
library(tidymodels)      # For tidymodels packages
library(nycflights13)    # For flight data

Az adatok feltárása

Az nycflights13 adatok 325 819 járatról tartalmaznak információt, amelyek 2013-ban érkeztek New York city közelében. Először tekintse meg a repülési késések eloszlását. Ez a grafikon azt mutatja, hogy az érkezési késések eloszlása megfelelő. Hosszú farka van a magas értékekben.

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

Screenshot that shows a graph of flight delays.

Töltse be az adatokat, és módosítsa a változókat:

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)

A modell létrehozása előtt fontolja meg néhány konkrét változót, amelyek mind az előfeldolgozás, mind a modellezés szempontjából fontosak.

A változó arr_delay egy tényezőváltozó. A logisztikai regressziós modell betanításához fontos, hogy az eredményváltozó tényezőváltozó legyen.

glimpse(flight_data)

Az adathalmaz járatainak körülbelül 16%-a több mint 30 perccel később érkezett.

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

A dest szolgáltatás 104 járatcélponttal rendelkezik.

unique(flight_data$dest)

16 különböző szállító létezik.

unique(flight_data$carrier)

Az adatok felosztása

Ossza fel az egyetlen adatkészletet két halmazra: egy betanítási csoportra és egy tesztelési csoportra. A betanítási adathalmazban tartsa az eredeti adatkészlet legtöbb sorát (véletlenszerűen kiválasztott részhalmazként). A betanítási adatkészlet használatával illeszkedjen a modellhez, és a tesztadatkészlet használatával mérje a modell teljesítményét.

rsample A csomag használatával létrehozhat egy objektumot, amely információkat tartalmaz az adatok felosztásáról. Ezután két további rsample függvény használatával hozzon létre DataFrame-eket a betanítási és tesztelési csoportokhoz:

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)

Recept és szerepkörök létrehozása

Egyszerű logisztikai regressziós modell receptjének létrehozása. A modell betanítása előtt egy recept segítségével hozzon létre új prediktorokat, és végezze el a modell által igényelt előfeldolgozást.

Használja a függvénytupdate_role(), hogy a receptek tudják, és flighttime_hour változók legyenek, egy egyéni szerepkörrel.ID A szerepkörök bármilyen karakterértékűek lehetnek. A képlet a betanítási csoportban szereplő összes változót tartalmazza, a prediktorok kivételével arr_delay. A recept megtartja ezt a két azonosítóváltozót, de nem használja őket eredményként vagy előrejelzésként.

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

A változók és szerepkörök aktuális készletének megtekintéséhez használja a következő függvényt summary() :

summary(flights_rec)

Funkciók létrehozása

Végezze el a funkciófejlesztést a modell fejlesztéséhez. A repülési dátum ésszerű hatással lehet a késői érkezés valószínűségére.

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

Segíthet a modell azon dátumából származtatott modellkifejezések hozzáadásában, amelyek potenciálisan fontosak lehetnek a modell számára. Az egydátum változóból az alábbi hasznos funkciók származtathatóak:

  • A hét napja
  • Hónap
  • Attól függetlenül, hogy a dátum egy ünnepnek felel-e meg

Adja hozzá a három lépést a recepthez:

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

Modell igazítása recepttel

Logisztikai regresszióval modellezheti a repülési adatokat. Először hozzon létre egy modellspecifikációt a parsnip csomaggal:

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

workflows A csomag használatával csomagolja be a parsnip modellt (lr_mod) a receptjével (flights_rec):

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

flights_wflow

A modell betanítása

Ez a függvény előkészíti a receptet, és betanítsa a modellt az eredményként kapott prediktorokból:

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

Használja a segédfüggvényeket xtract_fit_parsnip() , és extract_recipe() bontsa ki a modell- vagy receptobjektumokat a munkafolyamatból. Ebben a példában húzza le a beépített modellobjektumot, majd használja a függvényt a broom::tidy() modell együtthatóinak rendezett csempéjének lekéréséhez:

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

Eredmények előrejelzése

Egyetlen hívás a predict() betanított munkafolyamat (flights_fit) használatával előrejelzéseket készít a nem látható tesztadatokkal. A predict() módszer alkalmazza a receptet az új adatokra, majd átadja az eredményeket a beépített modellnek.

predict(flights_fit, test_data)

A kimenet predict() lekérése az előrejelzett osztály visszaadásához: late versus on_time. Az egyes repülések előrejelzett osztály-valószínűségeihez azonban a augment() modellel együtt, a tesztadatokkal kombinálva mentse őket együtt:

flights_aug <- 
  augment(flights_fit, test_data)

Tekintse át az adatokat:

glimpse(flights_aug)

A modell értékelése

Most már van egy kavics az előrejelzett osztály valószínűségeivel. Az első néhány sorban a modell helyesen előrejelzett öt helyszíni járatot (az .pred_on_time értékek a következők p > 0.50). Összesen azonban 81 455 sort kell előrejelezni.

Szükségünk van egy metrika, amely megmutatja, hogy a modell milyen jól előrejelezte a késői érkezéseket az eredményváltozó arr_delayvalós állapotához képest.

Metrikaként használja a görbevevő működési jellemzője (AUC-ROC) alatti területet. Számítás a csomagból roc_curve() és roc_auc()a yardstick csomagból:

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

Power BI-jelentés készítése

A modell eredménye jól néz ki. A repülési késés előrejelzési eredményeivel interaktív Power BI-irányítópultot hozhat létre. Az irányítópult a járatok számát jeleníti meg fuvarozónként, valamint a járatok számát cél szerint. Az irányítópult a késés előrejelzési eredményei alapján szűrhet.

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

Adja meg a szolgáltató nevét és a repülőtér nevét az előrejelzés eredményadatkészletében:

  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)

Tekintse át az adatokat:

glimpse(flights_clean)

Az adatok konvertálása Spark DataFrame-gé:

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

Írja be az adatokat egy delta táblába a tóházban:

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

A deltatáblával szemantikai modellt hozhat létre.

  1. A bal oldalon válassza a OneLake adatközpontot

  2. Válassza ki a jegyzetfüzethez csatolt tóházat

  3. Válassza a Megnyitás lehetőséget

    Screenshot that shows the button to open a lakehouse.

  4. Új szemantikai modell kiválasztása

  5. Válassza a nycflight13 lehetőséget az új szemantikai modellhez, majd válassza a Megerősítés lehetőséget

  6. Létrejön a szemantikai modell. Új jelentés kiválasztása

  7. Mezők kijelölése vagy húzása az Adatok és vizualizációk panelről a jelentésvászonra a jelentés létrehozásához

    Screenshot that shows data and visualization details for a report.

A szakasz elején látható jelentés létrehozásához használja az alábbi vizualizációkat és adatokat:

  1. Halmozott sávdiagram a következőkkel:
    1. Y tengely: carrier_name
    2. X tengely: repülés. Válassza a Darabszám lehetőséget az összesítéshez
    3. Jelmagyarázat: origin_name
  2. Halmozott sávdiagram a következőkkel:
    1. Y tengely: dest_name
    2. X tengely: repülés. Válassza a Darabszám lehetőséget az összesítéshez
    3. Jelmagyarázat: origin_name
  3. Szeletelő a következőkkel:
    1. Mező: _pred_class
  4. Szeletelő a következőkkel:
    1. Mező: _pred_late