Optunaのハイパラ探索時に、複数の指標を保存しておく方法

はじめに

Optunaでは、例えばAccuracyを最大化するようなハイパラ探索を行います。その場合、Accuracyをリアルタイムで表示したり、studyオブジェクトに保存したりすることができます。しかし、Accuracy以外にも、例えばPrecisionやRecallなどの指標を保存したい場合があります。そこで、今回はOptunaのハイパラ探索時に、複数の指標を保存しておく方法を紹介します。(注意点:複数指標を使ってハイパラ探索を行うという話ではありません。)

使用したバージョン

  • python: 3.8.11
  • optuna: 3.2.0

コード

通常の使い方

まずは、通常の使い方を紹介します。以下のコードは、ハイパラ探索の結果を見るために、全てのtrialが終わるまで待つコードです。

import optuna

def objective(trial):
    #学習データとテストデータを作成。make_data()は適当な関数.
    X_train, y_train, X_test, y_test = make_data()
    #あるtrialの学習とテストを行う関数
    accuracy = train_test(X_train, y_train, X_test, y_test)

    # Accuracyに基づいてハイパラ探索を行うように、accuracyを返す
    return accuracy

# 100通りのハイパラを探索する
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
# studyを保存
with open('study.pkl', 'wb') as f:
    pickle.dump(study, f)

複数の指標を保存する使い方

trial毎に特定の指標を保存するには、set_user_attr()メソッドを使います。以下のコードは、各trialが終わるたびに、そのtrialのAccuracyとPrecisionとRecallを保存するコードです。

def objective(trial):
    #学習データとテストデータを作成。make_data()は適当な関数.
    X_train, y_train, X_test, y_test = make_data()
    #あるtrialの学習とテストを行う関数
    # 今回は、AccuracyとPrecisionとRecallを返すようにする
    accuracy,precision,recall = train_test(X_train, y_train, X_test, y_test)

    # trial毎にAccuracyとPrecisionとRecallを保存する
    trial.set_user_attr("precision", precision)
    trial.set_user_attr("recall", recall)
  
    # Accuracyに基づいてハイパラ探索を行うように、accuracyを返す
    return accuracy

# 100通りのハイパラを探索する
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# studyを保存
with open('study.pkl', 'wb') as f:
    pickle.dump(study, f)

まとめ

Optunaのハイパラ探索時に、複数の指標を保存しておく方法を紹介しました。 上記のようにtrialからset_user_attr()メソッドを叩くことで、trialと保存したい指標を紐づけることができます。修正点やご意見などありましたら、コメントお願いします。