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で作業するときはいつでも、自分で自作のパラメータ検索を行うことがよくありますが、先ほど述べたKrisPのようにキャレットパッケージでも実行できます。

  1. キャレット

xgboostでのハイパーパラメーター検索にキャレットパッケージを使用する方法の詳細については、相互検証に関するこの回答を参照してください。 xgboostツリーのハイパーパラメーターを調整する方法は?

  1. カスタムグリッド検索

私はしばしば、Owen Zhangデータサイエンスのヒントに関するスライドに基づいたいくつかの仮定から始めます。

ここに画像の説明を入力してください

ここでは、行のサンプリング、列のサンプリング、そしておそらく最大の木深さを調整する必要があることがわかります。これは私が現在取り組んでいる問題のカスタム行サンプリングと列サンプリング検索を行う方法です:

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ハイパーパラメーター検索

このプロットでは、明るい色はより低い誤差を表し、各ブロックは列サンプリングと行サンプリングの一意の組み合わせを表します。したがって、たとえばeta(またはツリーの深さ)の追加検索を実行する場合は、テストされたetaパラメーターごとにこれらのプロットの1つになります。

異なる評価基準(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%未満をほとんどの問題のまれなイベントとして扱います。これはアルゴリズムの癖の1つだと思います。クリック率の問題のクリックより下にあるものはすべて「まれなイベント」であると考えたいです。したがって、この場合は3 / 3.6になります。私は時々低いですが、それほど頻繁ではありません。
wacax

1
rBayesianOptimizationパッケージによりBOの実装が非常に簡単になります
MichaelChirico


0

グリッド、ランダム、ベイジアン、PSO ...など

XGBoostを使用する場合、上記のすべては重要ではありません。XGBは非常に高速であるため、解決策が見つかるまでグリッドを多くのハイパーパラメーターで使用できるからです。

あなたを助けるかもしれない1つのこと:近似方法を使用して、それは私に常に最小のmseエラーを与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.