หาจำนวนต้นไม้ที่เหมาะสมสำหรับ gradient boosting machine
ในแบบฝึกหัดนี้ เราจะเตรียมสร้างโมเดล gradient boosting เพื่อพยากรณ์จำนวนจักรยานที่ถูกเช่าในแต่ละชั่วโมง โดยอิงจากสภาพอากาศ ประเภทของวัน และช่วงเวลา โมเดลจะถูก train ด้วยข้อมูลจากเดือนกรกฎาคม
ข้อมูลเดือนกรกฎาคมถูกโหลดไว้ให้แล้ว โปรดจำไว้ว่า bikesJuly.treat ไม่มีคอลัมน์ outcome แล้ว จึงต้องดึงค่านั้นจากข้อมูลดิบ: bikesJuly$cnt
เราจะใช้แพ็กเกจ xgboost ในการ fit โมเดล ฟังก์ชัน xgb.cv() (docs) ใช้ cross-validation เพื่อประมาณค่า learning error บนข้อมูลนอกกลุ่มตัวอย่างเมื่อมีการเพิ่มต้นไม้แต่ละต้นเข้าสู่โมเดล จำนวนต้นไม้ที่เหมาะสมสำหรับโมเดลสุดท้ายคือจำนวนที่ทำให้ holdout RMSE ต่ำที่สุด
สำหรับแบบฝึกหัดนี้ อาร์กิวเมนต์หลักของ xgb.cv() มีดังนี้
data: numeric matrixlabel: vector ของค่า outcome (ต้องเป็น numeric เช่นกัน)nrounds: จำนวน round สูงสุด (จำนวนต้นไม้ที่จะสร้าง)nfold: จำนวน fold สำหรับ cross-validation โดย 5 เป็นค่าที่เหมาะสมobjective:"reg:squarederror"สำหรับ outcome ที่เป็นค่าต่อเนื่องeta: learning ratemax_depth: ความลึกสูงสุดของต้นไม้early_stopping_rounds: หยุดการ train หากผ่านไปตามจำนวน round นี้โดยไม่มีการพัฒนาขึ้นverbose:FALSEเพื่อไม่ให้แสดงผลระหว่างการรัน
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Supervised Learning ใน R: การถดถอย
คำแนะนำการฝึกหัด
- เติมช่องว่างเพื่อรัน
xgb.cv()กับข้อมูล training ที่ผ่านการ treat แล้ว จากนั้น assign ผลลัพธ์ไปยังตัวแปรcv- ใช้
as.matrix()เพื่อแปลง data frame ที่ผ่านการ treat ให้เป็น matrix - ใช้ 50 rounds และ cross-validation แบบ 5-fold
- ตั้งค่า
early_stopping_roundsเป็น 5 - ตั้งค่า
etaเป็น 0.75 และmax_depthเป็น 5
- ใช้
- ดึง data frame
evaluation_logจากcvแล้ว assign ไปยังตัวแปรelogโดยแต่ละแถวของevaluation_logจะตรงกับต้นไม้ที่ถูกเพิ่มเข้ามาหนึ่งต้น ดังนั้นหมายเลขแถวจะบอกจำนวนต้นไม้ในโมเดล - เติมช่องว่างเพื่อหาจำนวนต้นไม้ที่ให้ค่าต่ำที่สุดของคอลัมน์
train_rmse_meanและtest_rmse_meanwhich.min()(docs) จะคืนค่า index ของค่าต่ำสุดใน vector- ต้องการต้นไม้กี่ต้น?
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Run xgb.cv
cv <- xgb.cv(data = ____,
label = ___,
nrounds = ___,
nfold = ___,
objective = "reg:squarederror",
eta = ___,
max_depth = ___,
early_stopping_rounds = ___,
verbose = FALSE # silent
)
# Get the evaluation log
elog <- ___
# Determine and print how many trees minimize training and test error
elog %>%
summarize(ntrees.train = ___, # find the index of min(train_rmse_mean)
ntrees.test = ___) # find the index of min(test_rmse_mean)