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 แบบเต็มที่ใช้ในตัวอย่างนี้ ได้ ที่นี่