はじめに(CouseraのHow to Win a Data Science Competitionの紹介)
こんにちはえびてんです。
普段は画像系のAIエンジニアとして働いています。
CouseraのHow to Win a Data Science Competition: Learn from Top Kagglersを受講したのでそこで勉強になった内容をまとめていきたいと思います。
こちらの講座ではテーブルデータのCompetitionにおいて前処理から、探索的データ分析、モデルの選択、ハイパーパラメータチューニングなど、データ分析Competitionで勝つためのノウハウをKaggleのGrandMasterの方々から学ぶことができます。
今回は機械学習アルゴリズムのうちのツリー系モデルのハイパーパラメータのチューニングについてまとめていきたいと思います。
※ 何か間違いなどありましたらご指摘頂けると嬉しいです。
ハイパーパラメータの調整で大事なこと
ハイパーパラメーターには、
- 値を大きくすると、アンダーフィットしやすくなるもの
- 値を大きくすると、オーバフィットしやすくなるもの
があります。
まずはこれをパラメータごとに1つ1つしっかりと認識することが大事です。
そして、ハイパーパラメーターをチューニングする際は、
最適なパラメーターを発見するために、モデルがアンダーフィットしているのか、それともオーバーフィットしているのかしっかりと把握することが重要となります。
ハイパーパラメーターはモデルによって様々な種類があるので、全てのパラメーターをいじる時間はなかなかないので、
モデルの性能に影響を与えるパラメーターを見極めることが重要です。
ツリー系アルゴリズムの種類
- Decision Tree(決定木)
- Random Forest(ランダムフォレスト)
- Extra Trees
- Xgboost
- LightGBM
- RGF(遅くて使いにくい。小さいデータセットなら使える。)
などなどがあります。それぞれの細かいアルゴリズムは今回は省略します。
今回はXgboostとLightGBM、RandomForestについて書いていきたいと思います。
以下では値を大きくするとアンダーフィットしやすくなるものは青色で、
値を大きくするとオーバフィットしやすくなるものは赤色で表現したいと思います。
XgboostとLightGBMのハイパーパラメーター
まずは、GBTD(Gradient Boosting Decision Tree)のXgboostとLightGBMから見ていきます。
Xgboost | LightGBM |
MaxDepth subsample colsample_bytree,colsample_bylevel min_child_weight, labmda, alpha eta, num_round seed | MaxDepth/num_leaves bagging_fraction feature_fraction min_data_in_leaf, lambda_l1, lambda_l2 lerarinig_rate, num_iterations seed |
各パラメータを説明します。
max_depth(決定木の深さ)
- 木の深さを深くすればするほど、表現力は高まるが、過学習する可能性が高くなり計算時間も長くなる。
- 最適な深さは場合により2のときもあれば30になるときもある。最初は7ぐらいからスタートするのが良いらしい。
- だんだんと木を深くしていく際に、過学習することなくvalidationのスコアが上がっていく場合、データに重要な相互作用があるサインになりうる。この場合は、チューニングをいったん止めて、新しい特徴量の生成に戻るのが良い。
num_leaves(葉の数)
- LightGBMでは決定木の葉の数を指定することができる。これは非常に便利であり、もしmax_depthが大きくなってもこの値を調整することで過学習を防ぐことができる。
subsample, bagging_fraction(サブサンプルで使うデータの割合)
- 0 ~ 1の値を取り、サブサンプルを生成する際のトレーニングデータの抽出割合を表す。たとえば、0.5に設定すると、XGBoost はデータの半分をランダムに選んで木を成長させる。
- これを設定することで、fittingするのに時間はかかるが、過学習を防ぐことができるで正則化のような役割をする。
colsample_by_tree, feature_fraction
- 各木を作成するときの列におけるサブサンプルの割合。過学習している場合はこの値を下げる。
min_child_weight, min_data_in_leaf
- min_child_weight,かなり重要。最小値である0に設定すると、モデルの制約が緩和され、学習しやすくなる。増加することで過学習を減らす。最適な値は0,5,15,300あたりらしい。データにより最適な値は違うので幅広い値を試してみるとよい。
eta, learning_weight
- 勾配降下法の学習率のようなもの。値が大きいほど学習は早いが過学習しやすい。学習率が大きいと発散するので、収束するのに十分小さな値を設定するのが良い。学習率が小さい方が時間はかかるがいいモデルができることが多い。0.1~0.01ぐらいがよく使われる。
num_round, num_iterations
- 何個の木を作るか。
seed
- seedが違うだけでモデルが大きく変わる。固定するのはあまりオススメされない。違うseedで試して学習結果が大きく変わらないことを確認するのにも使用できる。
ランダムフォレスト(RandomForest)のパラメーター
RandomForestの重要なパラメータについて解説します。
n_estimators
- RandomForestはまずこれを調整する。RandomForestでは1つ1つの木が独立しているため、大きい値でも過学習しない。しかし、大きい値ほど学習に時間がかかるのでチューニングするのにはどれくらいの値で十分なのかを検証する。
- 提出の際は、大きな値を使った方が確実なので良い。
- 10ぐらいから始めると良い。
max_depth
- 7ぐらいから始め、10、20とだんだん大きくしていく。GBTDと比べて大きな値が最適になることが多いので、大きな値を試すことをためらわない方がいい。
max_features
- xgboostのcol_samplesに対応する。大きいほど学習しやすくなる。
min_sample_leaf
- xgboostのmin_child_weight, LightGBMのmin_data_leafに対応する
criterion
- GiniかEntropyを選択できる。通常Giniが良いが、たまにEntropyのパフォーマンスが良い時もある。
コメント