結構前にmlflowを使ってOptunaのチューニングの過程を可視化することをやってみてました。
その時はmlflowの勉強の意図だったので、Optunaについてはあんまりわかってませんでした。 今回は、Optunaの使い方を中心に勉強してみたいと思います。
ざっくりOptunaの使い方
Optunaの説明については、前の記事をご参照ください。
本家のページはこの辺になっています。
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を使用した最適化の手順としては、
- objective関数を定義
- optuna.studyインスタンスを作成
- optuna.study.optimizeにobjective関数を渡す
のような流れが基本的な流れのようです。 このとき、objective関数の中で探索するパラメータをsuggest_intやsuggest_floatで範囲等を設定することで、この範囲のパラメータを探索してくれます。
とりあえず使ってみる
チュートリアルがあるのでそちらを使って色々確認します。
まずはベースとなる実装はこんな感じ担っています。
optunaの使い方の通り、objective関数を定義し、そのパラメータをチューニングしています。 この場合はx=2で最小値をとるので、この付近にチューニングされていきます。
その他、sklearnを使ったサンプルはこのようになっていました。
こちらもobjective関数を定義し、そのパラメータをチューニングしています。 objectiveの中でパラメータだけでなく、カテゴリ変数("SVC"、"RandomForest")も設定しています。
その他、結構なパターンのサンプルコードがこちらにあったので、必要に応じてこの辺を参照すれば使えそうな気がします。
参考にさせていただいた記事
下記の記事を参考にさせていただきました。
感想
ちょっとわけあって、「ハイパラのチューニングなんて人間がやるもんじゃない!!」って実感したのでやってみた感じです。
Kaggleを始めとするデータサイエンス系のコンペでも、最後のひと押しにハイパラのチューニングなんかをやるようですし、自分で自由に使えるように使いながら慣れていきたいと思います。