Udostępnij za pośrednictwem


Samouczek: przewidywanie opóźnienia lotu przy użyciu języka R

Ten samouczek przedstawia pełny przykład przepływu pracy analizy danych usługi Synapse w usłudze Microsoft Fabric. Używa on nycflights13 danych i R, aby przewidzieć, czy samolot przybywa ponad 30 minut późno. Następnie użyje wyników przewidywania do utworzenia interaktywnego pulpitu nawigacyjnego usługi Power BI.

Z tego samouczka dowiesz się, jak wykonywać następujące działania:

  • Używanie tidymodels pakietów (przepisy, parsnip, rsample, przepływy pracy ) do przetwarzania danych i trenowania modelu uczenia maszynowego
  • Zapisz dane wyjściowe do Lakehouse jako tabelę różnicową.
  • Tworzenie raportu wizualizacji usługi Power BI w celu bezpośredniego uzyskiwania dostępu do danych w tym lakehouse

Warunki wstępne

  • Pobierz subskrypcję usługi Microsoft Fabric . Możesz też utworzyć bezpłatne konto wersji próbnej usługi Microsoft Fabric.

  • Zaloguj się do usługi Microsoft Fabric.

  • Użyj przełącznika doświadczeń w lewym dolnym rogu strony głównej, aby przełączyć się na Fabric.

    Zrzut ekranu przedstawiający menu przełącznika doświadczenia, pokazujący, gdzie wybrać pozycję Nauka o danych.

  • Otwórz lub utwórz notes. Aby dowiedzieć się, jak to zrobić, zobacz Jak używać notesów usługi Microsoft Fabric.

  • Ustaw opcję języka na SparkR (R), aby zmienić język podstawowy.

  • Dołącz notatnik do lakehouse. Po lewej stronie wybierz opcję Dodaj, aby dodać istniejący lakehouse lub utworzyć nowy lakehouse.

Instalowanie pakietów

Zainstaluj pakiet nycflights13, aby użyć kodu w tym samouczku.

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

Eksplorowanie danych

Dane nycflights13 zawierają informacje o 325 819 lotach, które przybyły w pobliżu Nowego Jorku w 2013 roku. Najpierw wyświetl rozkład opóźnień lotów. Ten wykres pokazuje, że rozkład opóźnień przylotów jest prawostronnie skośny. Ma długi ogon w wysokich wartościach.

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

Zrzut ekranu przedstawiający wykres opóźnień lotów.

Załaduj dane i wprowadź kilka zmian w zmiennych:

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)

Przed utworzeniem modelu należy wziąć pod uwagę kilka określonych zmiennych, które są ważne zarówno w przypadku przetwarzania wstępnego, jak i modelowania.

Zmienna arr_delay jest zmienną współczynnikową. W przypadku trenowania modelu regresji logistycznej ważne jest, aby zmienna wynikowa była zmienną czynnikową.

glimpse(flight_data)

Około 16% lotów w tym zestawie danych spóźniło się o ponad 30 minut.

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

Funkcja dest ma 104 miejsca docelowe lotów.

unique(flight_data$dest)

Istnieje 16 odrębnych przewoźników.

unique(flight_data$carrier)

Dzielenie danych

Podziel pojedynczy zestaw danych na dwa zestawy: zestaw treningowy i zestaw testowy. Zachowaj większość wierszy oryginalnego zestawu danych (jako losowo wybrany podzestaw) w obrębie zestawu danych treningowego. Użyj zestawu danych trenowania, aby dopasować model i użyć zestawu danych testowego do mierzenia wydajności modelu.

Użyj pakietu rsample, aby utworzyć obiekt zawierający informacje o sposobie dzielenia danych. Następnie użyj dwóch kolejnych funkcji rsample, aby utworzyć ramki danych dla zestawów trenowania i testowania:

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)

Utwórz przepis i role

Utwórz przepis na prosty model regresji logistycznej. Przed rozpoczęciem trenowania modelu użyj przepisu, aby utworzyć nowe czynniki prognostyczne i przeprowadzić wstępne przetwarzanie wymagane przez model.

Użyj funkcji update_role(), aby przepisy wiedziały, że flight i time_hour są zmiennymi z rolą niestandardową o nazwie ID. Rola może mieć dowolną wartość znaku. Formuła zawiera wszystkie zmienne, inne niż arr_delay, w zestawie treningowym jako predyktory. Procedura przechowuje te dwie zmienne identyfikatorów, ale nie używa ich jako zmiennych wynikowych lub zmiennych predykcyjnych.

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

Aby wyświetlić bieżący zestaw zmiennych i ról, użyj funkcji summary():

summary(flights_rec)

Tworzenie funkcji

Wykonaj kilka inżynierii cech, aby ulepszyć model. Data lotu może mieć rozsądny wpływ na prawdopodobieństwo późnego przyjazdu.

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

Może to pomóc w dodaniu terminów modelu pochodzących z daty, która potencjalnie ma znaczenie dla modelu. Uzyskiwanie następujących znaczących cech z pojedynczej zmiennej daty:

  • Dzień tygodnia
  • Miesiąc
  • Czy data odpowiada świętu czy nie

Dodaj trzy kroki do swojego przepisu:

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

Dopasuj model za pomocą schematu

Użyj regresji logistycznej, aby modelować dane lotu. Najpierw utwórz specyfikację modelu przy użyciu pakietu parsnip:

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

Użyj pakietu workflows, aby powiązać model parsnip (lr_mod) z przepisem (flights_rec):

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

flights_wflow

Trenowanie modelu

Ta funkcja może przygotować przepis i wytrenować model z wynikowych predyktorów:

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

Użyj funkcji pomocnika xtract_fit_parsnip() i extract_recipe(), aby wyodrębnić obiekty modelu lub przepisu z przepływu pracy. W tym przykładzie pobierz dopasowany obiekt modelu, a następnie użyj funkcji broom::tidy(), aby uzyskać uporządkowaną tabelę tibble współczynników modelu.

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

Przewidywanie wyników

Pojedyncze wywołanie do predict() używa wytrenowanego przepływu pracy (flights_fit), by dokonywać przewidywań z niewidocznymi danymi testowymi. Metoda predict() stosuje przepis do nowych danych, a następnie przekazuje wyniki do dopasowanego modelu.

predict(flights_fit, test_data)

Pobierz dane wyjściowe z predict(), aby otrzymać przewidywaną klasę: late w porównaniu do on_time. Jednak aby zapisać razem przewidywane prawdopodobieństwa klasy dla każdego lotu, użyj augment() z modelem w połączeniu z danymi testowymi.

flights_aug <- 
  augment(flights_fit, test_data)

Przejrzyj dane:

glimpse(flights_aug)

Ocena modelu

Mamy teraz tibble z przewidywanymi prawdopodobieństwami klas. W pierwszych kilku rzędach model prawidłowo przewidział pięć punktualnych lotów (wartości .pred_on_timep > 0.50). Musimy przewidzieć 81 455 wierszy w sumie.

Potrzebujemy metryki, która informuje, jak dobrze model przewidział późne przybycie, w porównaniu z rzeczywistym stanem zmiennej wyniku, arr_delay.

Użyj obszaru pod właściwością operacyjną odbiornika krzywej (AUC-ROC) jako metryki. Oblicz go przy użyciu roc_curve() i roc_auc()z pakietu yardstick:

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

Tworzenie raportu usługi Power BI

Wynik modelu wygląda dobrze. Użyj wyników przewidywania opóźnienia lotu, aby utworzyć interaktywny pulpit nawigacyjny usługi Power BI. Na pulpicie nawigacyjnym jest wyświetlana liczba lotów według przewoźnika oraz liczba lotów według miejsca docelowego. Pulpit nawigacyjny może filtrować według wyników przewidywania opóźnień.

Zrzut ekranu przedstawiający wykresy słupkowe dotyczące liczby lotów według przewoźnika i liczby lotów według miejsca docelowego w raporcie usługi Power BI.

Uwzględnij nazwę przewoźnika i nazwę lotniska w zestawie danych wyników przewidywania:

  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)

Przejrzyj dane:

glimpse(flights_clean)

Przekonwertuj dane na ramkę danych platformy Spark:

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

Zapisz dane w tabeli Delta w Lakehouse.

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

Użyj tabeli różnicowej, aby utworzyć model semantyczny.

  1. Po lewej stronie wybierz pozycję OneLake

  2. Wybierz lakehouse, który dołączyłeś do swojego notesu.

  3. Wybierz pozycję Otwórz

    Zrzut ekranu przedstawiający przycisk otwierania jeziora.

  4. Wybierz Nowy semantyczny model

  5. Wybierz nycflight13 dla nowego modelu semantycznego, a następnie wybierz pozycję Potwierdź

  6. Twój model semantyczny został utworzony. Wybierz pozycję Nowy raport

  7. Wybierz lub przeciągnij pola z okienek Dane i Wizualizacje na kanwę raportu, aby zbudować raport.

    Zrzut ekranu przedstawiający szczegóły danych i wizualizacji raportu.

Aby utworzyć raport pokazany na początku tej sekcji, użyj tych wizualizacji i danych:

  1. Skumulowany wykres słupkowy z:
    1. Oś Y: carrier_name
    2. Oś X: flight. Wybierz liczbę do agregacji
    3. Legenda: origin_name
  2. Skumulowany wykres słupkowy z:
    1. Oś Y: dest_name
    2. Oś X: flight. Wybierz liczbę do agregacji
    3. Legenda: origin_name
  3. krajalnica z:
    1. Pole: _pred_class
  4. krajalnica z:
    1. Pole: _pred_late