แชร์ผ่าน


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

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

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

  • ใช้แพคเกจ tidymodels ( สูตรparsnipตัวอย่างเวิร์กโฟลว์) เพื่อประมวลผลข้อมูลและฝึกแบบจําลองการเรียนรู้ของเครื่อง
  • เขียนข้อมูลผลลัพธ์ไปยังเลคเฮ้าส์เป็นตารางเดลต้า
  • สร้างรายงานวิชวล 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)

สกรีนช็อตที่แสดงกราฟของความล่าช้าของเที่ยวบิน

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

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

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

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

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

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_timep > 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 แบบโต้ตอบ แดชบอร์ดแสดงจํานวนเที่ยวบินตามผู้ให้บริการ และจํานวนเที่ยวบินตามปลายทาง แดชบอร์ดสามารถกรองตามผลลัพธ์การคาดการณ์การหน่วงเวลา

สกรีนช็อตที่แสดงแผนภูมิแท่งสําหรับจํานวนเที่ยวบินตามผู้ให้บริการและจํานวนเที่ยวบินตามปลายทางในรายงาน 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)

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

# 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. แกน 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