Xgboost ใน r: ตัวอย่างทีละขั้นตอน


การเพิ่มประสิทธิภาพ เป็นเทคนิคการเรียนรู้ของเครื่องที่ได้รับการพิสูจน์แล้วว่าสร้างแบบจำลองที่มีความแม่นยำในการทำนายสูง

วิธีหนึ่งที่พบบ่อยที่สุดในการใช้การบูสต์ในทางปฏิบัติคือการใช้ XGBoost ย่อมาจาก “การเร่งความเร็วแบบไล่ระดับสีขั้นสุด”

บทช่วยสอนนี้ให้ตัวอย่างทีละขั้นตอนของวิธีใช้ XGBoost เพื่อให้พอดีกับโมเดลที่ได้รับการปรับปรุงใน R

ขั้นตอนที่ 1: โหลดแพ็คเกจที่จำเป็น

ขั้นแรก เราจะโหลดไลบรารี่ที่จำเป็น

 library (xgboost) #for fitting the xgboost model
library (caret) #for general data preparation and model fitting

ขั้นตอนที่ 2: โหลดข้อมูล

สำหรับตัวอย่างนี้ เราจะปรับแบบจำลองการถดถอยที่ได้รับการปรับปรุงให้เหมาะกับชุดข้อมูล Boston จากแพ็คเกจ MASS

ชุดข้อมูลนี้มีตัวแปรทำนาย 13 ตัวที่เราจะใช้ทำนาย ตัวแปรตอบสนอง ที่เรียกว่า mdev ซึ่งแสดงถึงค่ามัธยฐานของบ้านในพื้นที่สำรวจสำมะโนประชากรต่างๆ ทั่วบอสตัน

 #load the data
data = MASS::Boston

#view the structure of the data
str(data) 

'data.frame': 506 obs. of 14 variables:
 $ crim: num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
 $ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
 $ indus: num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
 $chas: int 0 0 0 0 0 0 0 0 0 0 ...
 $ nox: num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
 $rm: num 6.58 6.42 7.18 7 7.15 ...
 $ age: num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
 $ dis: num 4.09 4.97 4.97 6.06 6.06 ...
 $rad: int 1 2 2 3 3 3 5 5 5 5 ...
 $ tax: num 296 242 242 222 222 222 311 311 311 311 ...
 $ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
 $ black: num 397 397 393 395 397 ...
 $ lstat: num 4.98 9.14 4.03 2.94 5.33 ...
 $ medv: num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...

เราจะเห็นว่าชุดข้อมูลประกอบด้วย การสังเกต 506 รายการ และตัวแปรทั้งหมด 14 รายการ

ขั้นตอนที่ 3: เตรียมข้อมูล

ต่อไป เราจะใช้ฟังก์ชัน createDataPartition() จากแพ็คเกจคาเร็ตเพื่อแยกชุดข้อมูลดั้งเดิมออกเป็นชุดการฝึกและการทดสอบ

สำหรับตัวอย่างนี้ เราจะเลือกใช้ 80% ของชุดข้อมูลดั้งเดิมเป็นส่วนหนึ่งของชุดการฝึก

โปรดทราบว่าแพ็คเกจ xgboost ยังใช้ข้อมูลเมทริกซ์ ดังนั้นเราจะใช้ฟังก์ชัน data.matrix() เพื่อเก็บตัวแปรทำนายของเรา

 #make this example reproducible
set.seed(0)

#split into training (80%) and testing set (20%)
parts = createDataPartition(data$medv, p = .8 , list = F )
train = data[parts, ]
test = data[-parts, ]

#define predictor and response variables in training set
train_x = data. matrix (train[, -13])
train_y = train[,13]

#define predictor and response variables in testing set
test_x = data. matrix (test[, -13])
test_y = test[, 13]

#define final training and testing sets
xgb_train = xgb. DMatrix (data = train_x, label = train_y)
xgb_test = xgb. DMatrix (data = test_x, label = test_y)

ขั้นตอนที่ 4: ปรับโมเดล

ต่อไป เราจะปรับแต่งโมเดล XGBoost โดยใช้ฟังก์ชัน xgb.train() ซึ่งแสดงการฝึกและการทดสอบ RMSE (ข้อผิดพลาดกำลังสองเฉลี่ย) สำหรับแต่ละรอบการบูสต์

โปรดทราบว่าเราเลือกใช้ 70 รอบสำหรับตัวอย่างนี้ แต่สำหรับชุดข้อมูลที่ใหญ่กว่ามาก ไม่ใช่เรื่องแปลกที่จะใช้หลายร้อยหรือหลายพันรอบ เพียงจำไว้ว่ายิ่งมีรอบมากเท่าไหร่ รันไทม์ก็จะยิ่งนานขึ้นเท่านั้น

โปรดทราบว่าอาร์กิวเมนต์ max.degree ระบุความลึกของการพัฒนาแผนผังการตัดสินใจแต่ละรายการ เรามักจะเลือกจำนวนนี้ค่อนข้างต่ำ เช่น 2 หรือ 3 เพื่อที่จะปลูกต้นไม้ให้เล็กลง วิธีการนี้แสดงให้เห็นว่ามีแนวโน้มที่จะสร้างแบบจำลองที่แม่นยำยิ่งขึ้น

 #define watchlist
watchlist = list(train=xgb_train, test=xgb_test)

#fit XGBoost model and display training and testing data at each round
model = xgb.train(data = xgb_train, max.depth = 3 , watchlist=watchlist, nrounds = 70 )

[1] train-rmse:10.167523 test-rmse:10.839775 
[2] train-rmse:7.521903 test-rmse:8.329679 
[3] train-rmse:5.702393 test-rmse:6.691415 
[4] train-rmse:4.463687 test-rmse:5.631310 
[5] train-rmse:3.666278 test-rmse:4.878750 
[6] train-rmse:3.159799 test-rmse:4.485698 
[7] train-rmse:2.855133 test-rmse:4.230533 
[8] train-rmse:2.603367 test-rmse:4.099881 
[9] train-rmse:2.445718 test-rmse:4.084360 
[10] train-rmse:2.327318 test-rmse:3.993562 
[11] train-rmse:2.267629 test-rmse:3.944454 
[12] train-rmse:2.189527 test-rmse:3.930808 
[13] train-rmse:2.119130 test-rmse:3.865036 
[14] train-rmse:2.086450 test-rmse:3.875088 
[15] train-rmse:2.038356 test-rmse:3.881442 
[16] train-rmse:2.010995 test-rmse:3.883322 
[17] train-rmse:1.949505 test-rmse:3.844382 
[18] train-rmse:1.911711 test-rmse:3.809830 
[19] train-rmse:1.888488 test-rmse:3.809830 
[20] train-rmse:1.832443 test-rmse:3.758502 
[21] train-rmse:1.816150 test-rmse:3.770216 
[22] train-rmse:1.801369 test-rmse:3.770474 
[23] train-rmse:1.788891 test-rmse:3.766608 
[24] train-rmse:1.751795 test-rmse:3.749583 
[25] train-rmse:1.713306 test-rmse:3.720173 
[26] train-rmse:1.672227 test-rmse:3.675086 
[27] train-rmse:1.648323 test-rmse:3.675977 
[28] train-rmse:1.609927 test-rmse:3.745338 
[29] train-rmse:1.594891 test-rmse:3.756049 
[30] train-rmse:1.578573 test-rmse:3.760104 
[31] train-rmse:1.559810 test-rmse:3.727940 
[32] train-rmse:1.547852 test-rmse:3.731702 
[33] train-rmse:1.534589 test-rmse:3.729761 
[34] train-rmse:1.520566 test-rmse:3.742681 
[35] train-rmse:1.495155 test-rmse:3.732993 
[36] train-rmse:1.467939 test-rmse:3.738329 
[37] train-rmse:1.446343 test-rmse:3.713748 
[38] train-rmse:1.435368 test-rmse:3.709469 
[39] train-rmse:1.401356 test-rmse:3.710637 
[40] train-rmse:1.390318 test-rmse:3.709461 
[41] train-rmse:1.372635 test-rmse:3.708049 
[42] train-rmse:1.367977 test-rmse:3.707429 
[43] train-rmse:1.359531 test-rmse:3.711663 
[44] train-rmse:1.335347 test-rmse:3.709101 
[45] train-rmse:1.331750 test-rmse:3.712490 
[46] train-rmse:1.313087 test-rmse:3.722981 
[47] train-rmse:1.284392 test-rmse:3.712840 
[48] train-rmse:1.257714 test-rmse:3.697482 
[49] train-rmse:1.248218 test-rmse:3.700167 
[50] train-rmse:1.243377 test-rmse:3.697914 
[51] train-rmse:1.231956 test-rmse:3.695797 
[52] train-rmse:1.219341 test-rmse:3.696277 
[53] train-rmse:1.207413 test-rmse:3.691465 
[54] train-rmse:1.197197 test-rmse:3.692108 
[55] train-rmse:1.171748 test-rmse:3.683577 
[56] train-rmse:1.156332 test-rmse:3.674458 
[57] train-rmse:1.147686 test-rmse:3.686367 
[58] train-rmse:1.143572 test-rmse:3.686375 
[59] train-rmse:1.129780 test-rmse:3.679791 
[60] train-rmse:1.111257 test-rmse:3.679022 
[61] train-rmse:1.093541 test-rmse:3.699670 
[62] train-rmse:1.083934 test-rmse:3.708187 
[63] train-rmse:1.067109 test-rmse:3.712538 
[64] train-rmse:1.053887 test-rmse:3.722480 
[65] train-rmse:1.042127 test-rmse:3.720720 
[66] train-rmse:1.031617 test-rmse:3.721224 
[67] train-rmse:1.016274 test-rmse:3.699549 
[68] train-rmse:1.008184 test-rmse:3.709522 
[69] train-rmse:0.999220 test-rmse:3.708000 
[70] train-rmse:0.985907 test-rmse:3.705192 

จากผลการทดสอบจะเห็นได้ว่าการทดสอบ RMSE ขั้นต่ำทำได้ที่ 56 รอบ หลังจากจุดนี้ การทดสอบ RMSE จะเริ่มเพิ่มขึ้น ซึ่งบ่งชี้ว่าเรา กำลังปรับข้อมูลการฝึกอบรมมากเกินไป

ดังนั้น เราจะตั้งค่าโมเดล XGBoost สุดท้ายให้ใช้ 56 รอบ:

 #define final model
final = xgboost(data = xgb_train, max.depth = 3 , nrounds = 56 , verbose = 0 )

หมายเหตุ: อาร์กิวเมนต์ verbose=0 จะบอก R ว่าอย่าแสดงข้อผิดพลาดในการฝึกและการทดสอบสำหรับแต่ละรอบ

ขั้นตอนที่ 5: ใช้แบบจำลองเพื่อคาดการณ์

สุดท้ายนี้ เราสามารถใช้แบบจำลองที่ได้รับการปรับปรุงขั้นสุดท้ายเพื่อคาดการณ์ค่ามัธยฐานของบ้านในบอสตันในชุดทดสอบ

จากนั้น เราจะคำนวณเมตริกความแม่นยำต่อไปนี้สำหรับโมเดล:

  • MSE: ค่าคลาดเคลื่อนกำลังสองเฉลี่ย
  • แม่: หมายถึงข้อผิดพลาดสัมบูรณ์
  • RMSE: ข้อผิดพลาดรูทค่าเฉลี่ยกำลังสอง
 mean((test_y - pred_y)^2) #mse
caret::MAE(test_y, pred_y) #mae
caret::RMSE(test_y, pred_y) #rmse

[1] 13.50164
[1] 2.409426
[1] 3.674457

ค่าคลาดเคลื่อนกำลังสองเฉลี่ยกลายเป็น 3.674457 นี่แสดงถึงความแตกต่างโดยเฉลี่ยระหว่างการทำนายที่ทำกับค่ามัธยฐานของบ้านกับค่าบ้านจริงที่สังเกตได้ในชุดทดสอบ

หากเราต้องการ เราสามารถเปรียบเทียบ RMSE นี้กับโมเดลอื่นๆ เช่น Multiple Linear Regression , Ridge Regression , Principal Component Regression เป็นต้น เพื่อดูว่าโมเดลใดให้การคาดการณ์ที่แม่นยำที่สุด

คุณสามารถค้นหาโค้ด R แบบเต็มที่ใช้ในตัวอย่างนี้ ได้ ที่นี่

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *