ハイパーパラメータのチューニングをする場合、グリッドサーチでは非常に時間がかかることがあります。
対して、ベイズを用いたハイパーパラメータチューニングは非常に早く実行できます。
今回はそのためにoptunaを使用します。
基本的な使い方
最大化、最小化する目的関数を作成し、それを最適化します。
目的関数の作成
探索するハイパーパラメータはtrial.xxx
で型、範囲、名前を定義します。
import optuna from sklearn.metrics import accuracy_score def objective(trial): params = { "min_samples_split":trial.suggest_int("min_samples_split", 8, 16), "max_leaf_nodes":int(trial.suggest_discrete_uniform("max_leaf_nodes", 4, 64, 4)), "criterion":trial.suggest_categorical("criterion", ["gini", "entropy"]) } rfc = RandomForestClassifier(**params) rfc.fit(rfc_data['X_train'], rfc_data["y_train"]) #return #1.0 - accuracy_score(rfc_data["y_test"], rfc.predict(rfc_data["X_test"])) return accuracy_score(rfc_data["y_test"], rfc.predict(rfc_data["X_test"]))
プロセスの定義
direction
で最小化か、最大化か、過程をsqliteに書き込むかなどを指定し、optimize
で実行します。
study_name = 'rfc_optimize' s = optuna.create_study( study_name = study_name, direction='maximize', storage='sqlite:///example.db', load_if_exists=True #途中までの結果があればそれを利用する ) s.optimize(objective,n_trials=10) #結果の確認 s.best_params s.best_value
その他便利な物
sqliteに入れた場合は、sqlite3で確認できます。
sqlite3 example.db .table select * from trials
また、studyからデータフレームで確認したり、可視化をすることもできます。(plotlyのextensionが必要になります)
s.trials_dataframe(attrs=('number', 'value', 'params', 'state')) #ハイパーパラメータの重要度 optuna.visualization.plot_param_importances(s) #過程の可視化 optuna.visualization.plot_optimization_history(s)