Hypertuning พารามิเตอร์ XGBoost


27

XGBoost ทำงานได้อย่างยอดเยี่ยมเมื่อพูดถึงการจัดการกับตัวแปรตามหมวดหมู่และต่อเนื่อง แต่ฉันจะเลือกพารามิเตอร์ที่เหมาะสมสำหรับปัญหา XGBoost ได้อย่างไร

นี่คือวิธีที่ฉันใช้พารามิเตอร์สำหรับปัญหา Kaggle ล่าสุด:

param <- list(  objective           = "reg:linear", 
                booster = "gbtree",
                eta                 = 0.02, # 0.06, #0.01,
                max_depth           = 10, #changed from default of 8
                subsample           = 0.5, # 0.7
                colsample_bytree    = 0.7, # 0.7
                num_parallel_tree   = 5
                # alpha = 0.0001, 
                # lambda = 1
)


clf <- xgb.train(   params              = param, 
                    data                = dtrain, 
                    nrounds             = 3000, #300, #280, #125, #250, # changed from 300
                    verbose             = 0,
                    early.stop.round    = 100,
                    watchlist           = watchlist,
                    maximize            = FALSE,
                    feval=RMPSE
)

สิ่งที่ฉันทำในการทดลองคือการสุ่มเลือก (พร้อมปรีชา) พารามิเตอร์ชุดอื่นสำหรับการปรับปรุงผล

ต่อไปฉันจะทำการเลือกชุดพารามิเตอร์ที่ดีที่สุด (ดีที่สุด) โดยอัตโนมัติหรือไม่?

(คำตอบสามารถเป็นภาษาใดก็ได้ฉันแค่มองหาเทคนิค)

คำตอบ:


40

เมื่อใดก็ตามที่ฉันทำงานกับ xgboost ฉันมักจะทำการค้นหาพารามิเตอร์ homebrew ของตัวเอง แต่คุณสามารถทำได้ด้วยชุดคาเร็ตและ KrisP ที่เพิ่งพูดถึง

  1. เครื่องหมายตก

ดูคำตอบนี้ในการตรวจสอบข้ามสำหรับคำอธิบายอย่างละเอียดเกี่ยวกับวิธีการใช้ชุดคาเร็ตสำหรับการค้นหาพารามิเตอร์ใน xgboost วิธีการปรับค่าพารามิเตอร์ไฮเปอร์ของต้น xgboost?

  1. ค้นหากริดที่กำหนดเอง

ฉันมักจะเริ่มต้นด้วยสมมติฐานบางอย่างจากสไลด์ของโอเว่นจางเกี่ยวกับเคล็ดลับสำหรับวิทยาศาสตร์ข้อมูลหน้า 14

ป้อนคำอธิบายรูปภาพที่นี่

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

searchGridSubCol <- expand.grid(subsample = c(0.5, 0.75, 1), 
                                colsample_bytree = c(0.6, 0.8, 1))
ntrees <- 100

#Build a xgb.DMatrix object
DMMatrixTrain <- xgb.DMatrix(data = yourMatrix, label = yourTarget)

rmseErrorsHyperparameters <- apply(searchGridSubCol, 1, function(parameterList){

    #Extract Parameters to test
    currentSubsampleRate <- parameterList[["subsample"]]
    currentColsampleRate <- parameterList[["colsample_bytree"]]

    xgboostModelCV <- xgb.cv(data =  DMMatrixTrain, nrounds = ntrees, nfold = 5, showsd = TRUE, 
                           metrics = "rmse", verbose = TRUE, "eval_metric" = "rmse",
                           "objective" = "reg:linear", "max.depth" = 15, "eta" = 2/ntrees,                               
                           "subsample" = currentSubsampleRate, "colsample_bytree" = currentColsampleRate)

    xvalidationScores <- as.data.frame(xgboostModelCV)
    #Save rmse of the last iteration
    rmse <- tail(xvalidationScores$test.rmse.mean, 1)

    return(c(rmse, currentSubsampleRate, currentColsampleRate))

})

และเมื่อรวมกับเวทมนตร์ ggplot2 บางส่วนโดยใช้ผลลัพธ์ของฟังก์ชั่นการใช้งานนั้นคุณสามารถพล็อตการแสดงภาพกราฟิกของการค้นหาการค้นหาพารามิเตอร์ xgboost ของฉัน

ในพล็อตสีที่เบากว่านี้แสดงถึงข้อผิดพลาดที่ต่ำกว่าและแต่ละบล็อกแสดงถึงการรวมกันที่ไม่ซ้ำกันของการสุ่มตัวอย่างคอลัมน์และการสุ่มตัวอย่างแถว ดังนั้นหากคุณต้องการทำการค้นหาเพิ่มเติมของ say eta (หรือความลึกของต้นไม้) คุณจะพบกับหนึ่งในแผนการเหล่านี้สำหรับแต่ละพารามิเตอร์ของการทดสอบ eta

ฉันเห็นว่าคุณมีตัวชี้วัดการประเมินผลที่แตกต่างกัน (RMPSE) เพียงแค่เสียบเข้าไปในฟังก์ชันการตรวจสอบความถูกต้องแบบไขว้และคุณจะได้ผลลัพธ์ที่ต้องการ นอกจากนั้นฉันไม่ต้องกังวลมากเกินไปเกี่ยวกับการปรับพารามิเตอร์อื่น ๆ อย่างละเอียดเพราะการทำเช่นนั้นจะไม่ปรับปรุงประสิทธิภาพมากเกินไปอย่างน้อยก็ไม่มากเมื่อเทียบกับการใช้เวลาคุณสมบัติด้านวิศวกรรมมากขึ้นหรือการล้างข้อมูล

  1. คนอื่น ๆ

การค้นหาแบบสุ่มและการเลือกพารามิเตอร์แบบเบย์ก็เป็นไปได้เช่นกัน แต่ฉันยังไม่ได้ทำการค้นหา

นี่คือไพรเมอร์ที่ดีเกี่ยวกับการเพิ่มประสิทธิภาพแบบเบย์ของพารามิเตอร์โดย Max Kuhn ผู้สร้างคาเร็ต

http://blog.revolutionanalytics.com/2016/06/bayesian-optimization-of-machine-learning-models.html


ฉันมีคำถามเกี่ยวกับพารามิเตอร์ min_child_weight มันบอกว่า 3 / (% ของเหตุการณ์ที่หายาก) สมมติว่าฉันมี 3 คลาส 0 (3.4%), 1 (96.4%) และ 2 (0.2%) ดังนั้นควรเป็น 3 / 3.6 หรือ 3 / 0.2? ฉันคาดเดาอดีต

ในกรณีส่วนใหญ่ xgboost ปฏิบัติต่อสิ่งที่ต่ำกว่า 5% เป็นเหตุการณ์ที่หายากในปัญหาส่วนใหญ่ฉันคิดว่ามันเป็นหนึ่งในองค์ประกอบของอัลกอริทึม ฉันชอบคิดว่ามันเป็นอะไรที่คลิกด้านล่างในปัญหา CTR คือ "เหตุการณ์ที่หายาก" ดังนั้นในกรณีนี้มันจะเป็น 3 / 3.6 บางครั้งฉันต่ำ แต่ไม่บ่อย
wacax

1
rBayesianOptimizationเกจทำให้การดำเนินงานของ BO ค่อนข้างตรงไปตรงมา
MichaelChirico


0

Grid, Random, Bayesian และ PSO ... ฯลฯ

เมื่อคุณทำงานกับ XGBost ทั้งหมดข้างต้นไม่สำคัญเพราะ XGB นั้นเร็วมากดังนั้นคุณสามารถใช้ Grid กับ hyperparametrs จำนวนมากได้จนกว่าคุณจะพบทางออก

สิ่งหนึ่งที่อาจช่วยคุณได้: ใช้วิธีการประมาณมันให้ข้อผิดพลาด mse ที่ต่ำที่สุดเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.