แชร์ผ่าน


บทช่วยสอน: ใช้ R เพื่อคาดการณ์การหน่วงเวลาเที่ยวบิน

บทช่วยสอนนี้แสดงตัวอย่างแบบ end-to-end ของเวิร์กโฟลว์ Synapse Data Science ใน Microsoft Fabric ใช้ข้อมูล nycflights13 และ R เพื่อคาดการณ์ว่าเครื่องบินมาถึงสายมากกว่า 30 นาทีหรือไม่ จากนั้นใช้ผลลัพธ์การคาดการณ์เพื่อสร้างแดชบอร์ด Power BI แบบโต้ตอบ

ในบทช่วยสอนนี้ คุณจะเรียนรู้วิธีการ:

  • ใช้แพคเกจ tidymodels (สูตรสูตร parsnip rsample เวิร์กโฟลว์) เพื่อประมวลผลข้อมูลและฝึกแบบจําลองการเรียนรู้ของเครื่อง
  • เขียนข้อมูลผลลัพธ์ไปยังเลคเฮ้าส์เป็นตารางเดลต้า
  • สร้างรายงานวิชวล Power BI เพื่อเข้าถึงข้อมูลในเลคเฮ้าส์โดยตรง

ข้อกำหนดเบื้องต้น

  • เปิดหรือสร้างสมุดบันทึก หากต้องการเรียนรู้วิธีการ ดู วิธีใช้สมุดบันทึก Microsoft Fabric

  • ตั้งค่าตัวเลือกภาษาเป็น SparkR (R) เพื่อเปลี่ยนภาษาหลัก

  • แนบสมุดบันทึกของคุณเข้ากับเลคเฮ้าส์ ทางด้านซ้าย เลือก เพิ่ม เพื่อเพิ่มเลคเฮาส์ที่มีอยู่ หรือเพื่อสร้างเลคเฮ้าส์

ติดตั้งแพคเกจ

ติดตั้งแพคเกจ 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)

Screenshot that shows a graph of flight delays.

โหลดข้อมูล และทําการเปลี่ยนแปลงบางอย่างไปยังตัวแปร:

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เป็นตัวคาดการณ์ สูตรเก็บตัวแปร ID สองตัวนี้ แต่ไม่ใช้เป็นผลลัพธ์หรือตัวคาดการณ์

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

ซึ่งอาจช่วยในการเพิ่มเงื่อนไขแบบจําลองที่มาจากวันที่ที่อาจมีความสําคัญกับแบบจําลอง ได้รับคุณลักษณะที่มีความหมายดังต่อไปนี้จากตัวแปรวันที่เดียว:

  • วันของสัปดาห์
  • Month
  • กําหนดว่าวันที่สอดคล้องกับวันหยุดหรือไม่

เพิ่มสามขั้นตอนลงในสูตรของคุณ:

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ผลลัพธ์ของคุณ

ใช้พื้นที่ภายใต้ลักษณะการใช้งานของตัวรับเส้นโค้ง (AUC-ROC) เป็นเมตริก คํานวณด้วย roc_curve() และ roc_auc()จาก yardstick แพคเกจ:

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

สร้างรายงาน Power BI

ผลลัพธ์แบบจําลองดูดี ใช้ผลลัพธ์การคาดการณ์การหน่วงเวลาของเที่ยวบินเพื่อสร้างแดชบอร์ด Power BI แบบโต้ตอบ แดชบอร์ดแสดงจํานวนเที่ยวบินตามผู้ให้บริการ และจํานวนเที่ยวบินตามปลายทาง แดชบอร์ดสามารถกรองตามผลลัพธ์การคาดการณ์การหน่วงเวลา

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

ใส่ชื่อผู้ให้บริการและชื่อสนามบินในชุดข้อมูลผลลัพธ์การคาดการณ์:

  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)

เขียนข้อมูลลงในตารางเดลต้าในเลคเฮ้าส์ของคุณ:

# 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. เลือก เปิด

    Screenshot that shows the button to open a lakehouse.

  4. เลือก แบบจําลองความหมายใหม่

  5. เลือก nycflight13 สําหรับแบบจําลองความหมายใหม่ของคุณ จากนั้นเลือก ยืนยัน

  6. แบบจําลองความหมายของคุณจะถูกสร้างขึ้น เลือก รายงานใหม่

  7. เลือกหรือลากเขตข้อมูลจากบานหน้าต่าง ข้อมูล และ การจัดรูปแบบการแสดงข้อมูล ลงบนพื้นที่รายงานเพื่อสร้างรายงานของคุณ

    Screenshot that shows data and visualization details for a report.

หากต้องการสร้างรายงานที่แสดงในตอนต้นของส่วนนี้ ให้ใช้การแสดงภาพและข้อมูลเหล่านี้:

  1. แผนภูมิแท่งแบบเรียงซ้อนที่มี:
    1. แกน Y: carrier_name
    2. แกน X: เที่ยวบิน เลือก จํานวน สําหรับการรวม
    3. คําอธิบายแผนภูมิ: origin_name
  2. แผนภูมิแท่งแบบเรียงซ้อนที่มี:
    1. แกน Y: dest_name
    2. แกน X: เที่ยวบิน เลือก จํานวน สําหรับการรวม
    3. คําอธิบายแผนภูมิ: origin_name
  3. ตัวแบ่งส่วนข้อมูลที่มี:
    1. เขตข้อมูล: _pred_class
  4. ตัวแบ่งส่วนข้อมูลที่มี:
    1. เขตข้อมูล: _pred_late