0Pricing
R Academy · บทเรียน

การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost

กำหนดค่าพารามิเตอร์ของ xgboost การหยุดก่อนกำหนด และตารางอัตราการเรียนรู้

การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

การบูสต์ด้วยเกรเดียนต์คืออะไร

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

library(xgboost)

# XGBoost expects data in a special matrix format
# We'll build a simple example step by step
cat('XGBoost version:', packageVersion('xgboost'))

# Key concept: each tree reduces the ensemble error
# Final prediction = sum of all tree predictions

xgb.DMatrix()

xgb.DMatrix(data, label) คือรูปแบบข้อมูลภายในที่ปรับให้เหมาะสมกับการทำงานของ XGBoost โดยจะจัดเก็บเมทริกซ์คุณลักษณะและเวกเตอร์ป้ายกำกับไว้ด้วยกัน ทำให้คำนวณได้รวดเร็วและใช้หน่วยความจำอย่างมีประสิทธิภาพ ควรแปลงข้อมูลเป็น DMatrix ก่อนฝึกแบบจำลองเสมอ

library(xgboost)
library(MASS)

X_train <- as.matrix(Boston[1:400, -14])  # features
y_train <- Boston[1:400, 14]              # medv (target)

X_test  <- as.matrix(Boston[401:506, -14])
y_test  <- Boston[401:506, 14]

dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest  <- xgb.DMatrix(data = X_test,  label = y_test)

cat('DMatrix rows:', nrow(dtrain))

xgboost() — การฝึกพื้นฐาน

xgboost(data, nrounds, eta, max_depth, objective) ใช้ฝึกแบบจำลอง พารามิเตอร์สำคัญ ได้แก่ eta (อัตราการเรียนรู้ ค่าที่เล็กกว่าจะทนทานกว่าแต่ช้ากว่า), max_depth (ความลึกของต้นไม้ ซึ่งควบคุมความซับซ้อนของแบบจำลอง) และ nrounds (จำนวนต้นไม้)

params <- list(
  objective  = 'reg:squarederror',
  eta        = 0.1,     # learning rate
  max_depth  = 6,       # tree depth
  subsample  = 0.8,     # row subsampling
  colsample_bytree = 0.8  # column subsampling
)

set.seed(42)
model <- xgboost(
  data    = dtrain,
  params  = params,
  nrounds = 100,
  verbose = 0
)

cat('Model trained with', model$niter, 'rounds')

Watchlist — ติดตามค่าความสูญเสียจากการตรวจสอบ

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

watchlist <- list(train = dtrain, eval = dtest)

model <- xgb.train(
  params    = params,
  data      = dtrain,
  nrounds   = 200,
  watchlist = watchlist,
  verbose   = 1
)

# The log shows train-rmse and eval-rmse per round
# Watch for eval-rmse increasing (overfitting signal)

early_stopping_rounds

early_stopping_rounds = 20 จะหยุดการฝึกหากตัวชี้วัดบนข้อมูลตรวจสอบไม่ดีขึ้นติดต่อกัน 20 รอบ วิธีนี้จะหาจำนวนต้นไม้ที่เหมาะสมที่สุดโดยอัตโนมัติ และหลีกเลี่ยงทั้งการเรียนรู้ไม่เพียงพอและการเรียนรู้มากเกินไปโดยไม่ต้องปรับแต่งด้วยตนเองอย่างละเอียด

model <- xgb.train(
  params              = params,
  data                = dtrain,
  nrounds             = 1000,      # max rounds
  watchlist           = list(train = dtrain, eval = dtest),
  early_stopping_rounds = 20,      # stop if no improvement
  print_every_n       = 50,
  verbose             = 1
)

cat('Best iteration:', model$best_iteration)
cat('Best eval RMSE:', model$best_score)

การจำแนกประเภทแบบทวิภาค

สำหรับการจำแนกประเภทแบบทวิภาค ให้ใช้ objective = 'binary:logistic' ซึ่งจะแสดงผลเป็นความน่าจะเป็นที่พยากรณ์ ป้ายกำกับต้องเป็นค่าตัวเลข 0/1 ประเมินผลด้วย AUC หรือ log-loss โดยใช้พารามิเตอร์ eval_metric

# Binary classification example
library(MASS)
Pima <- MASS::Pima.tr

X_cl <- as.matrix(Pima[, -8])
y_cl <- as.numeric(Pima$type) - 1  # factor to 0/1

dt_cl <- xgb.DMatrix(data = X_cl, label = y_cl)

mod_cl <- xgboost(
  data       = dt_cl,
  objective  = 'binary:logistic',
  eval_metric = 'auc',
  eta        = 0.05,
  max_depth  = 4,
  nrounds    = 100,
  verbose    = 0
)

ผลการพยากรณ์

predict(model, dtest) คืนค่าที่พยากรณ์ดิบ ได้แก่ ความน่าจะเป็นสำหรับการจำแนกประเภท หรือค่าจริงที่พยากรณ์สำหรับการถดถอย ใช้เกณฑ์ 0.5 เพื่อแปลงความน่าจะเป็นเป็นป้ายกำกับคลาสสำหรับงานจำแนกประเภท

# Regression predictions
reg_preds <- predict(model, dtest)
rmse <- sqrt(mean((reg_preds - y_test)^2))
cat('Test RMSE:', round(rmse, 3))

# Classification predictions
prob_preds  <- predict(mod_cl, dt_cl)
class_preds <- ifelse(prob_preds > 0.5, 1, 0)
accuracy <- mean(class_preds == y_cl)
cat('Training Accuracy:', round(accuracy, 3))

xgb.cv() — การตรวจสอบไขว้

xgb.cv(params, data, nrounds, nfold) เรียกใช้การตรวจสอบไขว้แบบ k ส่วนภายใน XGBoost วิธีนี้เร็วกว่าการใช้ rsample เพราะ XGBoost จัดการการแบ่งส่วนภายในเอง ผลลัพธ์จะแสดงค่าเฉลี่ยและ SD ของตัวชี้วัดในแต่ละรอบ

cv_result <- xgb.cv(
  params    = params,
  data      = dtrain,
  nrounds   = 200,
  nfold     = 5,
  early_stopping_rounds = 15,
  print_every_n = 20,
  verbose   = 1
)

# Best nrounds from CV
best_nrounds <- cv_result$best_iteration
cat('Optimal nrounds:', best_nrounds)

# CV RMSE at best iteration
cat('CV RMSE:', cv_result$evaluation_log[best_nrounds, 'test_rmse_mean'][[1]])

ไฮเปอร์พารามิเตอร์สำคัญ

ไฮเปอร์พารามิเตอร์ของ XGBoost ที่มีผลมากที่สุด:

  • eta: อัตราการเรียนรู้ (0.01–0.3) ค่าที่ต่ำกว่าต้องใช้ต้นไม้มากขึ้นและทนทานกว่า
  • max_depth: ความลึกของต้นไม้ (3–10) ค่าที่มากกว่าทำให้ซับซ้อนขึ้นและเรียนรู้มากเกินไปได้เร็วขึ้น
  • subsample: สัดส่วนแถวต่อต้นไม้ (0.5–1.0) ช่วยลดการเรียนรู้มากเกินไป
  • colsample_bytree: สัดส่วนคุณลักษณะต่อต้นไม้ (0.5–1.0)
  • lambda: การทำให้เป็นปกติแบบ L2 กับน้ำหนักของใบไม้
  • alpha: การทำให้เป็นปกติแบบ L1 กับน้ำหนักของใบไม้
params_tuned <- list(
  objective         = 'reg:squarederror',
  eta               = 0.05,
  max_depth         = 5,
  subsample         = 0.75,
  colsample_bytree  = 0.75,
  lambda            = 1.0,    # L2 regularization
  alpha             = 0.1,    # L1 regularization
  min_child_weight  = 3       # min samples in leaf
)

model_tuned <- xgboost(
  data = dtrain, params = params_tuned,
  nrounds = best_nrounds, verbose = 0
)

การบันทึกและโหลดแบบจำลอง

แบบจำลอง XGBoost สามารถบันทึกลงดิสก์ในรูปแบบไบนารีด้วย xgb.save(model, 'model.xgb') และโหลดกลับมาด้วย xgb.load('model.xgb') รูปแบบนี้เป็นรูปแบบที่แนะนำสำหรับการนำไปใช้งานจริง และช่วยให้ทำซ้ำผลลัพธ์ได้ตรงกันในระดับบิต

# Save model
xgb.save(model, '/tmp/xgb_boston.xgb')

# Reload and predict
loaded_model <- xgb.load('/tmp/xgb_boston.xgb')
new_preds <- predict(loaded_model, dtest)

# Verify predictions match
all.equal(reg_preds, new_preds)  # TRUE

การจำแนกประเภทหลายคลาส

สำหรับปัญหาหลายคลาส ให้ใช้ objective = 'multi:softprob' และตั้งค่า num_class เป็นจำนวนคลาส ป้ายกำกับต้องเป็นจำนวนเต็มที่เริ่มดัชนีจาก 0 ผลลัพธ์คือเมทริกซ์ความน่าจะเป็นของแต่ละคลาส

X_mc <- as.matrix(iris[, -5])
y_mc <- as.integer(iris$Species) - 1  # 0, 1, 2

dt_mc <- xgb.DMatrix(data = X_mc, label = y_mc)

params_mc <- list(
  objective  = 'multi:softprob',
  num_class  = 3,
  eta        = 0.1,
  max_depth  = 3
)

mod_mc <- xgboost(
  data = dt_mc, params = params_mc,
  nrounds = 50, verbose = 0
)

# Predictions: matrix of shape (n, num_class)
prob_matrix <- matrix(predict(mod_mc, dt_mc), ncol = 3, byrow = TRUE)
head(prob_matrix)

ตรวจสอบความเข้าใจ

การตั้งค่า early_stopping_rounds = 20 ใน xgb.train() มีจุดประสงค์ใด

ทบทวน XGBoost

ประเด็นสำคัญจากการบูสต์ด้วยเกรเดียนต์ด้วย XGBoost:

  • xgb.DMatrix(data, label) สร้างรูปแบบข้อมูลที่ปรับให้เหมาะสมกับ XGBoost
  • พารามิเตอร์สำคัญ: eta (อัตราการเรียนรู้), max_depth, subsample, colsample_bytree
  • watchlist ติดตามค่าความสูญเสียของข้อมูลฝึกและข้อมูลตรวจสอบในแต่ละรอบ
  • early_stopping_rounds หาจำนวนต้นไม้ที่เหมาะสมที่สุดโดยอัตโนมัติ
  • xgb.cv() เรียกใช้ CV แบบ k ส่วนภายใน XGBoost เพื่อค้นหาไฮเปอร์พารามิเตอร์ได้อย่างรวดเร็ว
  • ใช้ objective = 'binary:logistic' สำหรับสองคลาส และ 'multi:softprob' สำหรับหลายคลาส
  • บันทึกและโหลดแบบจำลองด้วย xgb.save() / xgb.load()
# Production XGBoost pipeline
dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest  <- xgb.DMatrix(data = X_test,  label = y_test)

params <- list(objective = 'reg:squarederror',
               eta = 0.05, max_depth = 5, subsample = 0.8)

cv  <- xgb.cv(params, dtrain, nrounds = 500, nfold = 5,
              early_stopping_rounds = 20, verbose = 0)

model <- xgboost(data = dtrain, params = params,
                 nrounds = cv$best_iteration, verbose = 0)

preds <- predict(model, dtest)
cat('RMSE:', sqrt(mean((preds - y_test)^2)))

คำถามที่พบบ่อย

บทเรียน “การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost”

กำหนดค่าพารามิเตอร์ของ xgboost การหยุดก่อนกำหนด และตารางอัตราการเรียนรู้ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล
  2. ป่าสุ่มด้วย ranger
  3. การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost
  4. ความสำคัญของคุณลักษณะและการตีความโมเดล
← กลับไปที่ R Academy