Κοινή χρήση μέσω


Εκμάθηση: Χρήση R για πρόβλεψη καθυστέρησης πτήσης

Αυτό το εκπαιδευτικό βοήθημα παρουσιάζει ένα τελικό παράδειγμα μιας ροής εργασιών Synapse Data Science στο Microsoft Fabric. Χρησιμοποιεί τα δεδομένα nycflights13 και R, για να προβλέψει αν ένα αεροπλάνο φτάνει με καθυστέρηση άνω των 30 λεπτών. Στη συνέχεια, χρησιμοποιεί τα αποτελέσματα πρόβλεψης για τη δημιουργία ενός αλληλεπιδραστικού πίνακα εργαλείων Power BI.

Σε αυτή την εκμάθηση, θα μάθετε πώς μπορείτε να κάνετε τα εξής:

  • Χρησιμοποιήστε tidymodels πακέτα (συνταγές, ανάλυσης , rsample , ροές εργασιών) για την επεξεργασία δεδομένων και την εκπαίδευση ενός μοντέλου εκμάθησης μηχανής
  • Εγγραφή των δεδομένων εξόδου σε μια λίμνη ως πίνακα δέλτα
  • Δημιουργία μιας αναφοράς απεικόνισης Power BI για απευθείας πρόσβαση σε δεδομένα σε αυτή τη λίμνη

Προϋποθέσεις

  • Λάβετε μια συνδρομής Microsoft Fabric . Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση microsoft Fabric.

  • Εισέλθετε για να το Microsoft Fabric.

  • Χρησιμοποιήστε την εναλλαγή εμπειρίας στην κάτω αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε σε Fabric.

    Στιγμιότυπο οθόνης του μενού εναλλαγής εμπειρίας, που εμφανίζει πού μπορείτε να επιλέξετε Επιστήμη δεδομένων.

  • Ανοίξτε ή δημιουργήστε ένα σημειωματάριο. Για να μάθετε πώς, ανατρέξτε στο θέμα Τρόπος χρήσης σημειωματάριων Microsoft Fabric.

  • Ορίστε την επιλογή γλώσσας για να το SparkR (R) για να αλλάξετε την κύρια γλώσσα.

  • Επισυνάψτε το σημειωματάριό σας σε ένα 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),
    # 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)

Πριν από τη δημιουργία του μοντέλου, εξετάστε μερικές συγκεκριμένες μεταβλητές που είναι σημαντικές τόσο για την προεπεξεργασία όσο και για τη μοντελοποίηση.

Η μεταβλητή 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 για να δημιουργήσετε DataFrames για τα σύνολα εκπαίδευσης και δοκιμών:

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)

Δημιουργία συνταγής και ρόλων

Δημιουργήστε μια συνταγή για ένα απλό μοντέλο λογιστικής παλινδρόμησης. Πριν από την εκπαίδευση του μοντέλου, χρησιμοποιήστε μια συνταγή για να δημιουργήσετε νέους παράγοντες πρόβλεψης και διεξάγετε την προεπεξεργασία που απαιτεί το μοντέλο.

Χρησιμοποιήστε τη συνάρτηση 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()

Πρόβλεψη αποτελεσμάτων

Μία μόνο κλήση προς predict() χρησιμοποιεί την εκπαιδευμένη ροή εργασιών (flights_fit) για να κάνει προβλέψεις με τα μη οροθετικά δεδομένα δοκιμής. Η predict() μέθοδος εφαρμόζει τη συνταγή στα νέα δεδομένα και, στη συνέχεια, διαβιβάζει τα αποτελέσματα στο τοποθετημένο μοντέλο.

predict(flights_fit, test_data)

Λάβετε την έξοδο από predict() για να επιστρέψετε την προβλεπόμενη κλάση: late έναντι on_time. Ωστόσο, για τις προβλεπόμενες πιθανότητες κλάσης για κάθε πτήση, χρησιμοποιήστε augment() με το μοντέλο, σε συνδυασμό με δεδομένα δοκιμής, για να τις αποθηκεύσετε μαζί:

flights_aug <- 
  augment(flights_fit, test_data)

Εξετάστε τα δεδομένα:

glimpse(flights_aug)

Αξιολόγηση του μοντέλου

Τώρα έχουμε μια κιβωδία με τις προβλεπόμενες πιθανότητες κλάσης. Στις πρώτες γραμμές, το μοντέλο προέβλεψε σωστά πέντε πτήσεις εγκαίρως (οι τιμές των .pred_on_time είναι p > 0.50). Ωστόσο, έχουμε 81.455 γραμμές συνολικά να προβλέψουμε.

Χρειαζόμαστε ένα μετρικό που υποδεικνύει πόσο καλά το μοντέλο προέβλεψε καθυστερημένες αφίξεις, σε σύγκριση με την πραγματική κατάσταση της μεταβλητής αποτελέσματός σας, arr_delay.

Χρησιμοποιήστε το χαρακτηριστικό λειτουργίας Area Under the Curve Receiver (AUC-ROC) ως μετρικό. Υπολογίστε την με roc_curve() και roc_auc(), από το πακέτο yardstick:

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

Δημιουργία αναφοράς Power BI

Το αποτέλεσμα του μοντέλου φαίνεται εντάξει. Χρησιμοποιήστε τα αποτελέσματα πρόβλεψης καθυστέρησης πτήσης για να δημιουργήσετε έναν αλληλεπιδραστικό πίνακα εργαλείων Power BI. Ο πίνακας εργαλείων εμφανίζει τον αριθμό των πτήσεων κατά μεταφορέα και τον αριθμό των πτήσεων κατά προορισμό. Ο πίνακας εργαλείων μπορεί να φιλτράρει με βάση τα αποτελέσματα της πρόβλεψης καθυστέρησης.

Στιγμιότυπο οθόνης που εμφανίζει γραφήματα ράβδων για τον αριθμό των πτήσεων κατά μεταφορέα και τον αριθμό των πτήσεων κατά προορισμό σε μια αναφορά Power BI.

Συμπεριλάβετε το όνομα του μεταφορέα και το όνομα του αεροδρομίου στο σύνολο δεδομένων αποτελέσματος πρόβλεψης:

  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)

Εξετάστε τα δεδομένα:

glimpse(flights_clean)

Μετατρέψτε τα δεδομένα σε ένα Spark DataFrame:

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

Γράψτε τα δεδομένα σε έναν πίνακα δέλτα στο lakehouse σας:

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

Χρησιμοποιήστε τον πίνακα δέλτα για να δημιουργήσετε ένα μοντέλο σημασιολογίας.

  1. Στην αριστερή πλευρά, επιλέξτε OneLake

  2. Επιλέξτε τη λίμνη που επισυνάψετε στο σημειωματάριό σας

  3. Επιλέξτε Άνοιγμα

    Στιγμιότυπο οθόνης που εμφανίζει το κουμπί για το άνοιγμα μιας λίμνης.

  4. Επιλέξτε νέο μοντέλο σημασιολογίας

  5. Επιλέξτε nycflight13 για το νέο μοντέλο σημασιολογίας και, στη συνέχεια, επιλέξτε Επιβεβαίωση

  6. Το σημασιολογικό μοντέλο σας δημιουργείται. Επιλέξτε νέα αναφοράς

  7. Επιλέξτε ή σύρετε πεδία από το δεδομένων και τμήματα παραθύρου "Απεικονίσεις" στον καμβά αναφορών, για να δημιουργήσετε την αναφορά σας

    Στιγμιότυπο οθόνης που εμφανίζει δεδομένα και λεπτομέρειες απεικόνισης για μια αναφορά.

Για να δημιουργήσετε την αναφορά που εμφανίζεται στην αρχή αυτής της ενότητας, χρησιμοποιήστε αυτές τις απεικονίσεις και δεδομένα:

  1. γραφήματος σωρευμένων ράβδων με:
    1. Άξονας Υ: carrier_name
    2. Άξονας Χ:πτήσης . Επιλέξτε πλήθους για τη συνάθροιση
    3. Υπόμνημα: origin_name
  2. γραφήματος σωρευμένων ράβδων με:
    1. Άξονας Υ: dest_name
    2. Άξονας Χ:πτήσης . Επιλέξτε πλήθους για τη συνάθροιση
    3. Υπόμνημα: origin_name
  3. αναλυτή με:
    1. Πεδίο: _pred_class
  4. αναλυτή με:
    1. Πεδίο: _pred_late