Aracılığıyla paylaş


Öğretici: R kullanarak uçuş gecikmesini tahmin etme

Bu öğretici, Microsoft Fabric'te Synapse Veri Bilimi iş akışının uçtan uca bir örneğini sunar. nycflights13 verilerini ve R'yi kullanarak bir uçağın 30 dakikadan fazla geç gelip gelmeyeceğini tahmin eder. Ardından tahmin sonuçlarını kullanarak etkileşimli bir Power BI panosu oluşturur.

Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:

  • Verileri işlemek ve makine öğrenmesi modelini eğitmek için paketleri (yemek tarifleri, ayrıştırma, rsample, iş akışları) düzenli modelleri kullanın
  • Çıkış verilerini bir lakehouse'a delta tablosu olarak yazın.
  • Power BI görsel raporu oluşturun, göl evindeki verilere doğrudan erişmek için.

Önkoşullar

  • bir Microsoft Fabric aboneliği alın. Alternatif olarak, ücretsizMicrosoft Fabric deneme sürümüne kaydolun.

  • Oturum açın Microsoft Fabric.

  • Ana sayfanızın sol alt tarafındaki deneyim değiştiriciyi kullanarak Fabric'e geçiş yapın.

    Veri Bilimi'nin seçileceği yeri gösteren deneyim değiştirici menüsünün ekran görüntüsü.

  • Not defterini açın veya oluşturun. Nasıl yapılacağını öğrenmek için bkz. Microsoft Fabric not defterlerini kullanma.

  • Birincil dili değiştirmek için dil seçeneğini SparkR (R) olarak ayarlayın.

  • Not defterinizi bir lakehouse'a bağlayın. Sol tarafta, mevcut bir göl evi eklemek veya bir göl evi oluşturmak için ekle'yi seçin.

Paketleri yükleme

Bu öğreticideki kodu kullanmak için nycflights13 paketini yükleyin.

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

Verileri keşfetme

nycflights13 verilerinde, 2013'te New York city yakınına gelen 325.819 uçuş hakkında bilgi bulunur. İlk olarak, uçuş gecikmelerinin dağılımını görüntüleyin. Bu grafikte, varış gecikmelerinin dağılımının doğru eğilmiş olduğu gösterilmektedir. Yüksek değer aralığında uzun bir kuyruğa sahiptir.

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

Uçuş gecikmelerinin grafiğini gösteren ekran görüntüsü.

Verileri yükleyin ve değişkenlerde birkaç değişiklik yapın:

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)

Modeli oluşturmadan önce, hem ön işleme hem de modelleme için önemli olan birkaç belirli değişkeni göz önünde bulundurun.

Değişken arr_delay bir faktör değişkenidir. Lojistik regresyon modeli eğitimi için sonuç değişkeninin bir faktör değişkeni olması önemlidir.

glimpse(flight_data)

Bu veri kümesindeki uçuşların yaklaşık yüzde 16%'ı 30 dakikadan fazla geç geldi.

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

dest özelliği 104 uçuş noktasına sahiptir.

unique(flight_data$dest)

16 farklı taşıyıcı vardır.

unique(flight_data$carrier)

Verileri bölme

Tek veri kümesini iki kümeye bölün: eğitim kümesi ve test kümesi. Özgün veri kümesindeki satırların çoğunu (rastgele seçilen bir alt küme olarak) eğitim veri kümesinde tutun. Modeli sığdırmak için eğitim veri kümesini ve model performansını ölçmek için test veri kümesini kullanın.

Verilerin nasıl bölündüğü hakkında bilgi içeren bir nesne oluşturmak için rsample paketini kullanın. Ardından, eğitim ve test kümeleri için DataFrame'ler oluşturmak üzere iki rsample işlevi daha kullanın:

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)

Yemek tarifi ve roller oluşturma

Basit bir lojistik regresyon modeli için bir tarif oluşturun. Modeli eğitmeden önce, yeni tahminciler oluşturmak ve modelin gerektirdiği ön işlemeyi gerçekleştirmek için bir tarif kullanın.

update_role() işlevini kullanarak, tariflerin flight ve time_hour'nin, IDadlı özel bir role göre değişkenler olduğunu bilmelerini sağlayın. Bir rol herhangi bir karakter değerine sahip olabilir. Formül, arr_delaydışında eğitim kümesindeki tüm değişkenleri tahminci olarak içerir. Tarif bu iki kimlik değişkenini tutar ancak bunları sonuç veya tahmin aracı olarak kullanmaz.

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

Geçerli değişken ve rol kümesini görüntülemek için summary() işlevini kullanın:

summary(flights_rec)

Özellik oluşturma

Modelinizi geliştirmek için bazı özellik mühendisliği yapın. Uçuş tarihi, geç varış olasılığı üzerinde makul bir etkiye sahip olabilir.

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

Model için önemi olabilecek tarihten türetilmiş model terimlerinin eklenmesine yardımcı olabilir. Aşağıdaki anlamlı özellikleri tek bir tarih değişkeninden türetin:

  • Haftanın günü
  • Ay
  • Tarihin bir tatil gününe karşılık olup olmadığı

Tarifinize üç adımı ekleyin:

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

Bir modeli bir tarifle oluşturma

Uçuş verilerini modellemek için lojistik regresyonu kullanın. İlk olarak, parsnip paketiyle bir model belirtimi oluşturun:

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

parsnip modelinizi (lr_mod) tarifinizle (flights_rec) paketlemek için workflows paketini kullanın:

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

flights_wflow

Modeli eğitin

Bu işlev tarifi hazırlayabilir ve modeli sonuçta elde edilen tahmincilerden eğitebilir:

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

model veya tarif nesnelerini iş akışından ayıklamak için xtract_fit_parsnip() ve extract_recipe() yardımcı işlevlerini kullanın. Bu örnekte, uygun model nesnesini çekin ve ardından broom::tidy() işlevini kullanarak model katsayılarından oluşan düzenli bir düzeltme elde edin:

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

Sonuçları tahmin et

predict()'a yapılan tek bir çağrı, görünmeyen test verileriyle tahminlerde bulunmak için (flights_fit) ile eğitilen iş akışını kullanır. predict() yöntemi tarifi yeni verilere uygular, ardından sonuçları uydurılan modele geçirir.

predict(flights_fit, test_data)

Tahmin edilen sınıfı döndürmek için predict() çıktısını alın: late ve on_time. Bununla birlikte, her bir uçuş için tahmin edilen sınıf olasılıkları için modelle augment() kullanın ve bunları birlikte kaydetmek için test verileriyle birlikte kullanın:

flights_aug <- 
  augment(flights_fit, test_data)

Verileri gözden geçirin:

glimpse(flights_aug)

Modeli değerlendirme

Artık tahmin edilen sınıf olasılıklarıyla bir tibble var. İlk birkaç satırda model beş zamanında uçuşu doğru tahmin etti (.pred_on_time değerleri p > 0.50). Ancak tahmin etmek için toplam 81.455 satır var.

Modele, arr_delaysonuç değişkeninizin gerçek durumu ile karşılaştırıldığında geç varışları ne kadar iyi tahmin ettiğini gösteren bir ölçüme ihtiyacımız var.

Ölçüm olarak Eğri Alıcısı çalışma özelliğinin altındaki alanı (AUC-ROC) kullanın. yardstick paketinden roc_curve() ve roc_auc()ile hesaplayın:

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

Power BI raporu oluşturma

Model sonucu iyi görünüyor. Etkileşimli bir Power BI panosu oluşturmak için uçuş gecikmesi tahmin sonuçlarını kullanın. Pano, taşıyıcıya göre uçuş sayısını ve hedefe göre uçuş sayısını gösterir. Pano, gecikme tahmini sonuçlarına göre filtreleyebilir.

Power BI raporundaki taşıyıcıya göre uçuş sayısı ve hedefe göre uçuş sayısı için çubuk grafikleri gösteren ekran görüntüsü.

Tahmin sonucu veri kümesine taşıyıcı adını ve havaalanı adını ekleyin:

  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)

Verileri gözden geçirin:

glimpse(flights_clean)

Verileri Spark DataFrame'e dönüştürün:

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

Verileri lakehouse'unuzda bir delta tablosuna yazın:

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

Anlamsal model oluşturmak için delta tablosunu kullanın.

  1. Sol tarafta OneLake seçeneğini belirleyin

  2. Not defterinize eklediğiniz göl evi seçin

  3. Aç'ı seçin

    Göl evi açma düğmesini gösteren ekran görüntüsü.

  4. Yeni anlam modeli 'ı seçin

  5. Yeni anlamsal modeliniz için nycflight13 seçin, ardından Onayla seçeneğini tıklayın.

  6. Anlam modeliniz oluşturulur. Yeni rapor seçin

  7. Raporunuzu oluşturmak için Veri ve Görselleştirmeler bölmelerindeki alanları seçin veya rapor tuvaline sürükleyin

    Raporun veri ve görselleştirme ayrıntılarını gösteren ekran görüntüsü.

Bu bölümün başında gösterilen raporu oluşturmak için şu görselleştirmeleri ve verileri kullanın:

  1. ile yığılmış çubuk grafiği:
    1. Y ekseni: carrier_name
    2. X ekseni: uçuş. Toplama için Say seçin
    3. Açıklama: origin_name
  2. Yığılmış çubuk grafiği :
    1. Y ekseni: dest_name
    2. X ekseni: uçuşu. Toplama için Sayı seçin
    3. Açıklama: origin_name
  3. Şununla birleştir: Dilimleyici
    1. Alan: _pred_class
  4. Dilimleyici ile:
    1. Alan: _pred_late