Mengurangi parameter XGBoost

27

XGBoost telah melakukan pekerjaan dengan baik, ketika berurusan dengan variabel dependen kategoris dan kontinu. Tapi, bagaimana cara memilih parameter yang dioptimalkan untuk masalah XGBoost?

Ini adalah bagaimana saya menerapkan parameter untuk masalah Kaggle baru-baru ini:

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
)

Yang saya lakukan untuk bereksperimen adalah memilih secara acak (dengan intuisi) set parameter lain untuk meningkatkan hasil.

Apakah ada cara saya mengotomatiskan pemilihan set parameter yang dioptimalkan (terbaik)?

(Jawaban bisa dalam bahasa apa pun. Saya hanya mencari tekniknya)

Dawny33
sumber

Jawaban:

40

Setiap kali saya bekerja dengan xgboost saya sering membuat pencarian parameter homebrew saya sendiri tetapi Anda dapat melakukannya dengan paket tanda sisipan seperti halnya KrisP yang baru saja disebutkan.

  1. Tanda sisipan

Lihat jawaban ini di Cross Validated untuk penjelasan menyeluruh tentang cara menggunakan paket caret untuk pencarian hyperparameter di xgboost. Bagaimana cara menyetel hyperparameter pohon xgboost?

  1. Pencarian Grid Kustom

Saya sering memulai dengan beberapa asumsi berdasarkan slide Owen Zhang pada tips untuk ilmu data P. 14

masukkan deskripsi gambar di sini

Di sini Anda dapat melihat bahwa sebagian besar Anda perlu menyetel pengambilan sampel baris, pengambilan sampel kolom dan mungkin kedalaman pohon maksimum. Ini adalah cara saya melakukan pengambilan sampel baris khusus dan pengambilan sampel kolom untuk masalah yang sedang saya kerjakan saat ini:

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

})

Dan dikombinasikan dengan beberapa ggplot2 magic menggunakan hasil dari fungsi yang berlaku Anda dapat memplot representasi grafis dari pencarian.Pencarian hyperparameter xgboost saya

Dalam plot ini, warna yang lebih terang mewakili kesalahan yang lebih rendah dan setiap blok mewakili kombinasi unik pengambilan sampel kolom dan pengambilan sampel baris. Jadi jika Anda ingin melakukan pencarian tambahan katakana eta (atau kedalaman pohon) Anda akan berakhir dengan salah satu plot ini untuk setiap parameter eta yang diuji.

Saya melihat Anda memiliki metrik evaluasi yang berbeda (RMPSE), cukup tancapkan pada fungsi validasi silang dan Anda akan mendapatkan hasil yang diinginkan. Selain itu, saya tidak akan terlalu khawatir tentang fine tuning parameter lain karena hal itu tidak akan meningkatkan kinerja terlalu banyak, setidaknya tidak terlalu banyak dibandingkan dengan menghabiskan lebih banyak waktu fitur teknik atau membersihkan data.

  1. Lainnya

Pencarian acak dan pemilihan parameter Bayesian juga dimungkinkan, tetapi saya belum membuat / menemukan penerapannya.

Berikut ini adalah primer yang bagus tentang bayesian. Optimalisasi hiperparameter oleh pencipta caret Max Kuhn.

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

wacax
sumber
Saya punya pertanyaan tentang parameter min_child_weight. katanya 3 / (% kejadian langka) Misalkan saya memiliki 3 kelas 0 (3,4%), 1 (96,4%) dan 2 (0,2%). jadi haruskah 3 / 3.6 atau 3 / 0.2? Saya menebak mantan
Dalam kebanyakan kasus, xgboost memperlakukan apa pun di bawah 5% sebagai peristiwa langka dalam sebagian besar masalah, saya kira itu salah satu keanehan dari algoritma. Saya suka menganggapnya sebagai sesuatu di bawah klik dalam masalah RKT adalah "peristiwa langka". Jadi dalam hal ini adalah 3 / 3.6. Saya terkadang lebih rendah tetapi tidak terlalu sering.
wacax
1
rBayesianOptimizationpaket membuat implementasi BO cukup mudah
MichaelChirico
5

Anda bisa menggunakan paket tanda sisipan untuk melakukan pencarian ruang hyperparameter, baik melalui pencarian kotak , atau melalui pencarian acak .

KrisP
sumber
0

Kotak, Acak, Bayesian, dan PSO ... dll.

Ketika Anda bekerja dengan XGBoost semua hal di atas tidak masalah, karena XGB sangat cepat sehingga Anda dapat menggunakan Grid dengan banyak hiperparamet hingga Anda menemukan solusi.

Satu hal yang dapat membantu Anda: menggunakan metode approx, selalu memberi saya kesalahan mse terendah.

Sepotong MasterOne
sumber