Tăng thông số XGBoost


27

XGBoost đã và đang làm một công việc tuyệt vời, khi nói đến việc xử lý cả hai biến phụ thuộc phân loại và liên tục. Nhưng, làm cách nào để chọn các tham số được tối ưu hóa cho sự cố XGBoost?

Đây là cách tôi áp dụng các tham số cho một vấn đề Kaggle gần đây:

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
)

Tất cả những gì tôi làm để thử nghiệm là chọn ngẫu nhiên (với trực giác) một bộ thông số khác để cải thiện kết quả.

Có cách nào tôi tự động hóa việc lựa chọn các tham số được tối ưu hóa (tốt nhất) không?

(Câu trả lời có thể bằng bất kỳ ngôn ngữ nào. Tôi chỉ tìm kiếm kỹ thuật)

Câu trả lời:


40

Bất cứ khi nào tôi làm việc với xgboost, tôi thường thực hiện tìm kiếm tham số homebrew của riêng mình nhưng bạn có thể thực hiện với gói caret cũng như KrisP vừa đề cập.

  1. Caret

Xem câu trả lời này trên Cross xác thực để được giải thích kỹ lưỡng về cách sử dụng gói caret cho tìm kiếm siêu tham số trên xgboost. Làm thế nào để điều chỉnh siêu âm của cây xgboost?

  1. Tìm kiếm lưới tùy chỉnh

Tôi thường bắt đầu với một vài giả định dựa trên các slide của Owen Zhang về các mẹo cho khoa học dữ liệu P. 14

nhập mô tả hình ảnh ở đây

Ở đây bạn có thể thấy rằng hầu hết bạn sẽ cần điều chỉnh lấy mẫu hàng, lấy mẫu cột và có thể độ sâu cây tối đa. Đây là cách tôi thực hiện tìm kiếm lấy mẫu hàng và lấy mẫu cột tùy chỉnh cho một vấn đề tôi đang làm việc tại thời điểm này:

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))

})

Và kết hợp với một số phép thuật ggplot2 bằng cách sử dụng kết quả của hàm áp dụng đó, bạn có thể vẽ biểu diễn đồ họa của tìm kiếm.Tìm kiếm siêu tham số xgboost của tôi

Trong biểu đồ này, màu sáng hơn biểu thị lỗi thấp hơn và mỗi khối biểu thị một sự kết hợp duy nhất của lấy mẫu cột và lấy mẫu hàng. Vì vậy, nếu bạn muốn thực hiện một tìm kiếm bổ sung về eta (hoặc độ sâu của cây), bạn sẽ kết thúc với một trong các ô này cho từng tham số eta được kiểm tra.

Tôi thấy bạn có một số liệu đánh giá khác nhau (RMPSE), chỉ cần cắm nó vào chức năng xác thực chéo và bạn sẽ nhận được kết quả mong muốn. Bên cạnh đó, tôi sẽ không lo lắng quá nhiều về việc tinh chỉnh các tham số khác bởi vì làm như vậy sẽ không cải thiện hiệu suất quá nhiều, ít nhất là không quá nhiều so với việc dành nhiều thời gian hơn cho các tính năng kỹ thuật hoặc làm sạch dữ liệu.

  1. Khác

Tìm kiếm ngẫu nhiên và lựa chọn tham số Bayes cũng có thể nhưng tôi chưa thực hiện / tìm thấy việc triển khai chúng.

Dưới đây là một mồi tốt về Tối ưu hóa bayesian của siêu đường kính bởi người tạo ra Max Kuhn của caret.

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


Tôi có một câu hỏi liên quan đến tham số min_child_ weight. nó nói 3 / (% các sự kiện hiếm) Giả sử tôi có 3 lớp 0 (3,4%), 1 (96,4%) và 2 (0,2%). vậy nó nên là 3 / 3.6 hay 3 / 0.2? Tôi đoán người cũ

Trong hầu hết các trường hợp, xgboost coi bất cứ điều gì dưới 5% là sự kiện hiếm gặp trong hầu hết các vấn đề, tôi đoán đó là một trong những điều kỳ quặc của thuật toán. Tôi thích nghĩ về nó như bất cứ điều gì bên dưới một nhấp chuột trong một vấn đề về CTR là một "sự kiện hiếm gặp". Vì vậy, trong trường hợp này sẽ là 3 / 3.6. Tôi đôi khi thấp hơn nhưng không thường xuyên.
wacax

1
rBayesianOptimizationgói làm cho việc triển khai BO khá đơn giản
MichaelChirico


0

Lưới, Ngẫu nhiên, Bayes và PSO ... vv ..

Khi bạn làm việc với XGBoost, tất cả những điều trên không thành vấn đề, bởi vì XGB thực sự rất nhanh nên bạn có thể sử dụng Grid với nhiều hyperparametrs cho đến khi bạn tìm thấy giải pháp cho mình.

Một điều có thể giúp bạn: sử dụng phương pháp xấp xỉ, nó luôn cho tôi lỗi mse thấp nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.