XGBoostのハイパーパラメータをまとめてみた

みんな大好きXGBoostのハイパーパラメータをまとめてみました。

基本的にはリファレンスの翻訳をベースによくわからなかったところを別途調べた感じです。
また調べた結果良い文献もなく不明なままのものもありますがご容赦いただきたく思います。

▼リファレンス
[リファレンス(XGBClassifier)](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.XGBClassifier)
[リファレンス(parameter)](https://xgboost.readthedocs.io/en/stable/parameter.html)
⇒下記の内容はXGBClassifierについて調べてましたが
　XGBRegressorも基本的に同じ内容かなと思っています。

　
ではさっそくどうぞ。

|No|パラメータ名|概要|デフォルト|選択肢/備考|
|------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
|1|n_estimators|決定木の数|100|整数を指定|
|2|use_label_encoder|scikit-learnの<br>ラベルエンコーダー<br>を使用するか(非推奨)|True|True/False<br>(Trueは非推奨っぽい)|
|3|max_depth|決定木の最大深度|6|整数を指定|
|4|eta(learning_rate)|学習率|0.3|0～1の小数を指定|
|5|verbosity|ログの表示量|1|0:なし/1:警告(Default)/<br>2:info/3:デバッグ|
|6|objective|目的関数を指定する|reg:squarederror|詳細は下記|
|7|booster|ブースティング手法<br>の選択|gbtree|gbtree(Tree)/<br>gblinear(リッジ回帰)/<br>dart|
|8|tree_method|使用する<br>ツリーメソッド|auto|auto/exact/<br>approx/hist/gpu_hist|
|9|n_jobs|並列処理する数|None|-1で全コア|
|10|gamma|正則化項ガンマ|0|0～∞<br>大きいほど保守的になる|
|11|min_child_weight|決定木の<br>葉の重みの下限|1|0～∞<br>大きいほど保守的になる|
|12|max_delta_step|各決定木の重みの<br>推定を制約する|0|0～∞<br>不均衡データの際使用する|
|13|subsample|各決定木の<br>サンプル抽出比|1|0～1<br>小さいほど保守的になる|
|14|colsample_bytree|説明変数の<br>サンプル抽出比(木)|1|0～1<br>※基本1つ指定すれば良い|
|15|colsample_bylevel|説明変数の<br>サンプル抽出比(深さ)|1|0～1<br>※基本1つ指定すれば良い|
|16|colsample_bynode|説明変数の<br>サンプル抽出比(ノード)|1|0～1<br>※基本1つ指定すれば良い|
|17|alpha(reg_alpha)|L1正規化項アルファ|0|0～∞<br>大きいほど保守的になる|
|18|lambda(reg_lambda)|L2正規化項ラムダ|1|0～∞<br>大きいほど保守的になる|
|19|scale_pos_weight|正負のバランス|1|0の件数÷1の件数<br>を指定する(二値分類の場合)|
|20|base_score|初期予測スコア|0.5|反復回数が十分な場合は設定不要|
|21|random_state|乱数のシード値|None|整数を指定|
|22|missing|負の値を欠損にしたい<br>などの場合に使用|None(np.nan)|設定しなくて良さそう|
|23|num_parallel_tree|各ステップで<br>ランダムフォレストを<br>使う場合は<br> 1 より大きな値を設定|1|整数を指定|
|24|monotone_constraints|単調性の制約を付与|'()'|'(0,1,0,-1,0)'のように設定する|
|25|interaction_constraints|説明変数の<br>相互制約を付与|''|listで指定する|
|26|importance_type|feature_importances_の<br>値を指定|None|gain/weight/cover/<br>total_gain/total_cover|
|27|gpu_id|デバイスの序列|-1|設定しなくて良さそう|
|28|validate_parameters|不明なパラメータに<br>対して警告を出す|False|設定しなくて良さそう|
|29|predictor|GPU または CPU の<br>使用を許可する<br>(結果は同じ)|auto|設定しなくて良さそう|
|30|enable_categorical|カテゴリデータの<br>実験的サポート|False|設定しなくて良さそう<br>(PythonではDefault:1)|
|31|eval_metric|テストデータの<br>評価指標を指定|objectiveの<br>設定で決まる|詳細は下記|

　
ついでにobjectiveの設定値一覧。

|No|パラメータ|概要|
|-------------------:|:------------------:|:------------------:|
|1|reg:squarederror|二乗損失を伴う回帰|
|2|reg:squaredlogerror|二乗対数損失による回帰|
|3|reg:logistic|ロジスティック回帰|
|4|reg:pseudohubererror|擬似フーバー損失による回帰|
|5|binary:logistic|二項分類のロジスティック回帰、出力確率|
|6|binary:logitraw|二項分類のロジスティック回帰、ロジスティック変換前の出力スコア|
|7|binary:hinge|二項分類のためのヒンジ損失|
|8|count:poisson|カウントデータの–ポワソン回帰、ポワソン分布の出力平均|
|9|survival:cox|右打ち切り生存時間データのCox回帰|
|10|survival:aft|打ち切られた生存時間データの加速故障時間モデル|
|11|aft_loss_distribution|目標とメトリックで使用される確率密度関数|
|12|multi:softmax|ソフトマックスの目的を使用したマルチクラス分類|
|13|multi:softprob|softmax と同じですがベクトルを出力|
|14|rank:pairwise|ペアワイズロスを最小化するペアワイズランキングを実行|
|15|rank:ndcg|正規化割引累積利益が最大化されるリストごとのランキングを実行|
|16|rank:map|平均平均精度が最大化されているリストごとのランキングを実行|
|17|reg:gamma|ログリンクを使用したガンマ回帰|
|18|reg:tweedie|ログリンクを使用したツイーディ回帰|

　
さらにeval_metricの設定値一覧。

|No|パラメータ|概要|
|-------------------:|:------------------:|:------------------:|
|1|rmse|二乗平均平方誤差|
|2|rmsle|平方平均平方対数エラー|
|3|mae|絶対誤差|
|4|mape|絶対パーセント誤差|
|5|mphe|擬似フーバーエラー|
|6|logloss|負の対数尤度|
|7|error|二項分類エラー率|
|8|error@t|'t'を指定することで0.5の二項分類しきい値とは異なる値を指定|
|9|merror|多クラス分類エラー率|
|10|mlogloss|マルチクラスのlog loss|
|11|auc|AUC|
|12|aucpr|PR曲線の下の領域|
|13|ndcg|正規化割引累積利益|
|14|map|平均精度|
|15|ndcg@n / map@n|evaluationの上位のカットオフを整数nで指定できる|
|16|ndcg- / map- / ndcg@n- / map@n-|正のサンプルを含まないリストのスコアを0として評価|
|17|poisson-nloglik|ポアソン回帰の負の対数尤度|
|18|gamma-nloglik|ガンマ回帰の負の対数尤度|
|19|cox-nloglik|Cox比例ハザード回帰の負の部分対数尤度|
|20|gamma-deviance|ガンマ回帰の残存逸脱|
|21|tweedie-nloglik|Tweedie 回帰の負の対数尤度|
|22|aft-nloglik|加速故障時間モデルの負の対数尤度|
|23|interval-regression-accuracy|間隔打ち切りラベルに予測ラベルが入るデータポイントの割合|

　
最後にタイタニックのデータ(01分類)を想定して
私の独断と偏見で設定してみたOptunaの関数を記載します。


```
# ハイパラ探索 : Optuna用定義

# scale_pos_weightの比率(0の件数÷1の件数)を算出
scale_pos_weight_rate=test_y['Survived'].value_counts()[0]/test_y['Survived'].value_counts()[1]

def XGBClassifier_objective(trial):

    # 範囲 or カテゴリ指定の定義
    n_estimators     =trial.suggest_categorical('n_estimators', [1000])
    use_label_encoder=trial.suggest_categorical('use_label_encoder', [False])
    max_depth        =trial.suggest_int('max_depth', 1, 10)
    eta              =trial.suggest_uniform('eta', 0.001, 0.3)
    verbosity        =trial.suggest_categorical('verbosity', [0])
    objective        =trial.suggest_categorical('objective', ['binary:logistic'])
    booster          =trial.suggest_categorical('booster', ['gbtree'])      # Default
    tree_method      =trial.suggest_categorical('tree_method', ['auto'])    # Default
    n_jobs           =trial.suggest_categorical('n_jobs', [-1])
    gamma            =trial.suggest_uniform('gamma', 0.01, 10)
    min_child_weight =trial.suggest_uniform('min_child_weight', 0.01, 10)
    # max_delta_step          : 設定しない
    subsample        =trial.suggest_uniform('subsample', 0.2, 1.0)
    colsample_bytree =trial.suggest_uniform('colsample_bytree', 0.2, 1.0)
    # colsample_bylevel       : 設定しない
    # colsample_bynode        : 設定しない
    reg_alpha        =trial.suggest_uniform('reg_alpha', 0.1, 2.0)
    reg_lambda       =trial.suggest_uniform('reg_lambda', 0.1, 2.0)
    scale_pos_weight =trial.suggest_categorical('scale_pos_weight', [scale_pos_weight_rate])
    # base_score              : 設定しない
    random_state     =trial.suggest_categorical('random_state', [1])
    # missing                 : 設定しない
    # num_parallel_tree       : 設定しない
    # monotone_constraints    : 設定しない
    # interaction_constraints : 設定しない
    # importance_type         : 設定しない
    # gpu_id                  : 設定しない
    # validate_parameters     : 設定しない
    # predictor               : 設定しない
    # enable_categorical      : 設定しない
    eval_metric      =trial.suggest_categorical('eval_metric', ['auc'])

    # モデル定義
    model_optuna=xgb.XGBClassifier(n_estimators=n_estimators,
                                   use_label_encoder=use_label_encoder,
                                   max_depth=max_depth,
                                   eta=eta,
                                   verbosity=verbosity,
                                   objective=objective,
                                   booster=booster,
                                   tree_method=tree_method,
                                   n_jobs=n_jobs,
                                   gamma=gamma,
                                   min_child_weight=min_child_weight,
                                   subsample=subsample,
                                   colsample_bytree=colsample_bytree,
                                   reg_alpha=reg_alpha,
                                   reg_lambda=reg_lambda,
                                   scale_pos_weight=scale_pos_weight,
                                   random_state=random_state,
                                   eval_metric=eval_metric
                                   )

    # trainデータを用いてモデル作成(fit)する
    model_optuna.fit(train_X_op,
                     train_y_op,
                     eval_set=[(eval_X_op, eval_y_op)],
                     early_stopping_rounds=100)

    # 目的関数用にAUCを算出
    pred_test=model_optuna.predict_proba(eval_X_op)[:, 1]
    roc_auc_test=roc_auc_score(eval_y_op, pred_test)

    # 目的関数は(1-AUC)の最小化と定義
    return 1.0-roc_auc_test
```

こちらはご参考まで。

boosterとtree_methodはデフォルトのままですが
わかりやすくするため明示的にパラメータにしました。

　
内容的には以上です。
ご参考になれば幸いです。