Re:ゼロから始めるML生活

どちらかといえばエミリア派です

Optunaを使ってみる

f:id:nogawanogawa:20200823124206p:plain

結構前にmlflowを使ってOptunaのチューニングの過程を可視化することをやってみてました。

その時はmlflowの勉強の意図だったので、Optunaについてはあんまりわかってませんでした。 今回は、Optunaの使い方を中心に勉強してみたいと思います。

ざっくりOptunaの使い方

Optunaの説明については、前の記事をご参照ください。

www.nogawanogawa.com

本家のページはこの辺になっています。

optuna.org

optuna.readthedocs.io

Optunaを使用する上でStudyとTrialという概念が出てきます。 それぞれ、

  • Study: 目的関数に基づく最適化
  • Trial: 目的関数に関する1回の試行

といった意味合いになっています。 サンプルコードはこんな感じになっています。

import optuna

def objective(trial):
    iris = sklearn.datasets.load_iris()
    
    n_estimators = trial.suggest_int('n_estimators', 2, 20)
    max_depth = int(trial.suggest_float('max_depth', 1, 32, log=True))
    
    clf = sklearn.ensemble.RandomForestClassifier(
        n_estimators=n_estimators, max_depth=max_depth)
    
    return sklearn.model_selection.cross_val_score(
        clf, iris.data, iris.target, n_jobs=-1, cv=3).mean()

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

trial = study.best_trial

print('Accuracy: {}'.format(trial.value))
print("Best hyperparameters: {}".format(trial.params))

これを見る限り、Optunaを使用した最適化の手順としては、

  1. objective関数を定義
  2. optuna.studyインスタンスを作成
  3. optuna.study.optimizeにobjective関数を渡す

のような流れが基本的な流れのようです。 このとき、objective関数の中で探索するパラメータをsuggest_intやsuggest_floatで範囲等を設定することで、この範囲のパラメータを探索してくれます。

とりあえず使ってみる

チュートリアルがあるのでそちらを使って色々確認します。

まずはベースとなる実装はこんな感じ担っています。

optunaの使い方の通り、objective関数を定義し、そのパラメータをチューニングしています。 この場合はx=2で最小値をとるので、この付近にチューニングされていきます。

その他、sklearnを使ったサンプルはこのようになっていました。

こちらもobjective関数を定義し、そのパラメータをチューニングしています。 objectiveの中でパラメータだけでなく、カテゴリ変数("SVC"、"RandomForest")も設定しています。

その他、結構なパターンのサンプルコードがこちらにあったので、必要に応じてこの辺を参照すれば使えそうな気がします。

github.com

参考にさせていただいた記事

下記の記事を参考にさせていただきました。

qiita.com

感想

ちょっとわけあって、「ハイパラのチューニングなんて人間がやるもんじゃない!!」って実感したのでやってみた感じです。

Kaggleを始めとするデータサイエンス系のコンペでも、最後のひと押しにハイパラのチューニングなんかをやるようですし、自分で自由に使えるように使いながら慣れていきたいと思います。