ベイズ最適でハイパラチューニングをしたい(optunaを使う)

ハイパーパラメータのチューニングをする場合、グリッドサーチでは非常に時間がかかることがあります。
対して、ベイズを用いたハイパーパラメータチューニングは非常に早く実行できます。

今回はそのために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)