前回に引き続き、こちらを教材に機械学習の勉強を行っていきます。
第2章 Titanicに取り組む
2.6 機械学習アルゴリズムのお気持ち?!ハイパーパラメータを調整してみよう
前回、そこそこ良い結果を出したアルゴリズムであるLightGBMには、様々なパラメータがあり、その値次第で予測結果は変わります。
今日は、パラメータ調整を手動と自動の2つで行う方法について試してみます。
ちなみに、パラメータチューニングと特徴量エンジニアリングでは、後者の方がスコアが上がりやすいそうなので、かける労力としては程々で良さそう。
とはいえ、影響があるのは間違い無いので調整の仕方は習得しておこう。
パラメータチューニングの指針として、公式ドキュメントに詳しく書いてある。
https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html
このドキュメント内に、性能を高めるために、ということで「For Better Accuracy」の項目にこのようにある。
・大きめのmax_bin(ヒストグラムの最大分割数)を使え(defaultは255)
・小さめのlearning_rate(学習率)を使え(defaultは0.1)
・大きめのnum_leaves(決定木における分岐の末端の最大数)を使え(defaultは31)
以上より、max_bin=300、learning_rate=0.05、num_leaves=40に変更させたコードがこちら。
こちらの結果をkaggleにsubmitしたところ、スコアは0.77033となり、パラメータ変更前よりも少し向上しました。
ここでは、パラメータを3つ一気に変化させているけど、それぞれがどのように効いているかをみるには1つずつ変更させた方が良い、という注意書きもありました。
続いて、今度はある程度自動的にパラメータを与えて最適なパラメータを探索する方法について、Optunaというパッケージを使って行います。
初めて使う場合は、
pip install optuna
を実行する。
その後、このようなコードでobjective関数を定義。
7行目と9行目でtrial.suggest_intを用いてmax_binは255から500までの値、num_leavesを32から128までの値の中の整数値の中からランダムにセレクトされる。
その上で、最終的にスコアをreturnする。
例えば、今回はmax_bin=300, num_leaves=50、次回はmax_bin=400, num_leaves=100・・・のように。
sampler=optuna.samplers.RandomSampler(seed=0)で、変数選択のための乱数のシードを固定。(固定しないと毎回結果が変わってしまう。)
n_trialsで試行回数を指定。
私が少し勘違いしていたのは、各パラメータごとに網羅的に調べるのかと思っていたけどそうではない、ということ。
なので、試行回数が少ないと当然あまり信用できない結果になる。
公式ドキュメントはこちら。
https://optuna.readthedocs.io/en/latest/reference/trial.html
study.best_paramsで、こんな風にscoreが最小値だった時のパラメータを表示してくれる。
ちなみに、scoreであるloglossはモデルの性能を測る指標で0から1の値をとり、少ないほど良いことを示す。
なので、scoreが最小である方が良い、ということ。
このパラメータで再度計算した結果をkaggleにsubmitしたところ、スコアは0.77033となり、結局手動で与えたときと変わらない結果となりました。
試行回数をもっと上げれば変わるのかも知れないけど、でも確かに、パラメータチューニングはそこまで影響は大きくない模様・・・。
なかなか勉強になりました。




