【AIプログラミング】Optunaを使ってscikit-learnのランダムフォレストを最適化

1_プログラミング

Optunaチュートリアル第二弾です。

今回は、ランダムフォレストのハイパーパラメータを最適化するんだね。

前回は、数式(x-2)**2というものが最小になる値をOptunaで探索しました。Optunaの使い方の流れを知るために一番シンプルなチュートリアルでよかったです。今回はもう少し実用的なチュートリアルを見つけました。「scikit-learnライブラリのランダムフォレストでアヤメデータの分類を行う」課題のハイパーパラメータをOptunaで最適化するというものです。

Optunaの使い方の流れについては、前回の記事もご参考ください。

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・Optunaを利用したい人

・Optunaでscikit-learnライブラリの機械学習アルゴリズムを最適化したい人

スポンサーリンク

scikit learnのランダムフォレストをOptunaで最適化

チュートリアルについて

OptunaのGoogle colabo用チュートリアルが存在していました。私は、「google colabo scikit-learn optuna quickstart」で検索しました。

quickstartという名前のgoogle colaboファイルが出てきました。

また、Optuna自体のプログラミングのためのマニュアルは次のリンクで参照できます。

objective関数の定義

まずは、Optunaで最適化するための「objective(trial)」を作成します。

import sklearn.datasets
import sklearn.ensemble
import sklearn.model_selection
import optuna

#目的関数の定義
def objective(trial):
    iris = sklearn.datasets.load_iris()

    #ハイパーパラメータの定義
    n_estimators = trial.suggest_int('n_estimators', 2, 20)
    max_depth = int(trial.suggest_loguniform('max_depth', 1, 32))
    
    #ランダムフォレストモデルの作成
    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()

今回のobjective関数は、次の①~④の順番に処理を行います。

①アヤメのデータを読み込む

アヤメデータの分類については、こちらの記事もご参考ください。

②ランダムフォレストのパラメータ範囲を設定

ランダムフォレストにつきましては、こちらに記事もご参考ください。

③ランダムフォレストを作成

④交差検証を行い、スコアの平均値を返す

交差検証につきましては、こちらの記事もご参考ください。

入力パラメータとして、ランダムフォレストのハイパーパラメータ「n_estimators」「max_depth」を変化させ、出力値の「交差検証のスコア」を最適化するような動作となります。

Trialの引数の定義について

Optunaは、最適化するためのハイパーパラメータの与え方が特徴的です。今回のランダムフォレストでは、「n_estimators」と「max_depth」をいろいろ検討して最適化します。

まず、scikit-learnのランダムフォレストのパラメータ「n_estimators」は整数値をとりますので、「suggest_int」機能を利用してtrialを定義します。suggest_intは、与えられた整数の範囲の整数を返してくれるパラメータになります。「(‘n_estimators’, 2, 20)」のようにパラメータを設定することで、整数値の2~20の値を試してくれます。

同様に、「max_depth」も整数を取るのですが、

先の「n_estimators」と同じように設定されていない点が疑問です。「suggest_loguniform」は、小数も含む数値で、対数的に値が選択される感じでしょうか・・・最後には、intに直しているので、最終的には「max_depth」にも整数がはいってきます。ちょっと理解できなかったので、引き続き情報をモニターしていきたいです。

最適化の実行

次のプログラムで最適化を実行します。

#Optunaオブジェクトの作成 directionをmaximizeとすることで最大化
study = optuna.create_study(direction='maximize')
#100回の試行で最適化をおこなう。
study.optimize(objective, n_trials=100)

#trialにベストのトライアル結果を入れる。
trial = study.best_trial

#ベストな結果、パラメータの表示
print('Accuracy: {}'.format(trial.value))
print("Best hyperparameters: {}".format(trial.params))

studyという変数で、Optunaオブジェクトを作成します。今回は、directionというパラメータに「maximaize」を指定しているので、objectiveから返ってくる「交差検証のスコア」を最大化するようなパラメータを探索することになります。

そして、最後に試行でベストの結果、パラメータを表示しています。

使い方に慣れれば、簡単に使っていけそう

タイトルとURLをコピーしました