自動でチューニングしてみる

前回の記事では頭がパンクしながらチューニングをしてみました。
今回はなんと自動でチューニングする方法を覚えたので試してみます。

概要

チューニングの方法はいくつかありますが、その中の「ランダムサーチ」を使い自動チューニングしてみます。
ランダムサーチではパラメータのとる値の範囲を指定するとその中からランダムで値を選びモデルの評価に使います。
n_iter(初期値:10)で評価の回数を指定可能。

ソースコード

1.インポートするモジュール

from sklearn.model_selection import RandomizedSearchCV #ランダムサーチ
from sklearn.metrics import f1_score

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier

2.評価するモデルと各パラメータを範囲指定したリストを作成

model_param_set_grid = {LogisticRegression(): {"C": [10 ** i for i in range(-5, 5)],
                                              "penalty": ["l1","l2"],
                                              "multi_class":["ovr","multinomial"],
                                              "random_state": [42]},
                       LinearSVC(): {"C": [10 ** i for i in range(-5, 5)],
                                     "penalty": ["l1","l2"],
                                     "multi_class":["ovr","crammer_singer"],
                                     "random_state": [42]},
                       SVC(): {"kernel": ["linear", "poly", "rbf", "sigmoid"],
                               "C": [10 ** i for i in range(-5, 5)],
                               "decision_function_shape": ["ovr", "ovo"],
                               "random_state": [42]},
                       DecisionTreeClassifier(): {"max_depth": [i for i in range(1,11)],
                                                  "random_state": [42]},
                       RandomForestClassifier(): {"n_estimators": [i for i in range(1,21)],
                                                  "max_depth": [i for i in range(1,11)],
                                                  "random_state": [42]},
                       KNeighborsClassifier(): {"n_neighbors": [i for i in range(1,11)]}

3.作成したリストを評価して一番高いF1スコアのモデル名とパラーメータを保持

max_score = 0
best_model=""
best_param = None

# ランダムパラメータでパラメーターサーチ
for model, param in model_param_set_grid.items():
   clf = RandomizedSearchCV(model, param, n_iter=20)    
   clf.fit(train_X, train_y)
   pred_y = clf.predict(test_X)
   score = f1_score(test_y, pred_y, average="micro")
   if max_score <= score:
       max_score = score
       best_model = model.__class__.__name__ #モデル名保持
       best_param = clf.best_params_ #パラメータ保持

まとめ

ハイパーパラメータのチューニングは自動化するべきですね。
これはモデル評価にも使えますね。
ちなみに、グリッドサーチというのもあり、こちらは各パラメータのとりうる値全てで試すので、今回のようにパターンが多いとランダムサーチと比較にならないくらい実行時間がかかりました。

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