20
27

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-03

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

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

▼リファレンス
リファレンス(XGBClassifier)
リファレンス(parameter)
⇒下記の内容はXGBClassifierについて調べてましたが
 XGBRegressorも基本的に同じ内容かなと思っています。

 
ではさっそくどうぞ。

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

 
ついでに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はデフォルトのままですが
わかりやすくするため明示的にパラメータにしました。

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

20
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
27