見出し画像

scikit-learn機械学習⑰ランダム・サーチ

前回は、アダブーストで簡単な実験を行いましたが、ハイパーパラメータのチューニングの必要性が課題となりました。よって、今回は、scikit-learnにあるハイパーパラメータのチューニングのためのツールを使います。

最も単純なのは、以前にも登場したグリッド・サーチ(Grid Search)と呼ばれる手法で、調節したい各ハイパーパラメータに対して試したい値のリストを準備し、その組み合わせをすべて順番に実行して一番良い性能を出すパラメータ値の組み合わせを決定します。

例えば、AdaBoostClassifierの内部で使う弱学習器の数を[50, 100, 150, 200, 250]と徐々に増やして試したいとします。さらに、学習率も変化させたいので[0.01, 0.1, 1.0, 1.2, 1.4]などの値を用意します。

この二つだけを考えてもその組み合わせは、$${5 \times 5 = 25}$$個になります。自分でプログラムを書いて多重ループを準備するとしたらこんな感じでしょうか。

from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score

# 最も精度が高かったモデルを保存するための変数
best_accuracy = 0
best_model = None

# ハイパーパラメータの組み合わせごとに予測精度を表示
for n_estimators in [50, 100, 150, 200, 250]:
    for learning_rate in [0.01, 0.1, 1.0, 1.2, 1.4]:
            # モデルの学習
            model = AdaBoostClassifier(n_estimators=n_estimators, 
                                       learning_rate=learning_rate,
                                       algorithm='SAMME',
                                       random_state=42)
            model.fit(X_train, y_train)

            # テストデータで評価
            y_pred = model.predict(X_test)
            accuracy = accuracy_score(y_test, y_pred)

            # 結果の表示
            print(f"n_estimators: {n_estimators}")
            print(f"learning_rate: {learning_rate}")
            print(f"accuracy: {accuracy:.2f}")

            # 最も精度が高かったモデルを保存
            if accuracy > best_accuracy:
                best_accuracy = accuracy
                best_model = model

# 最も精度が高かったモデルの精度を表示
print(f"Best accuracy: {best_accuracy:.2f}")

ちなみに、前回と同じ環境設定でこれを実行すると、最高の精度でも87%となり前回よりは良い結果です。よってハイパーパラメータの重要性がわかります。

ただし本記事では、さらにこれを超える精度を出します。

scikit-learnのGridSearchCVを使えば、自分でループを書くことなく、もっと簡単にグリッド・サーチを行うことができます。

また、今記事ではランダム・サーチ(Random Search)も取り上げ、グリッド・サーチとの違い、使う理由などを解説します。


ここから先は

6,366字 / 2画像

キカベン・読み放題

¥1,000 / 月
初月無料
このメンバーシップの詳細

この記事が気に入ったらサポートをしてみませんか?