機械学習:モデルの評価とハイパーパラメータのチューニング:グリッドサーチ

検証曲線で扱ったように、パラメータの一つを最適化するのではなく、網羅的探索手法により最適なパラメータの組み合わせを見つけ出すのがグリッドサーチである。
 ハイパーパラメータ値のリストを指定し、それをGridSearchCVに入れて行う。
 パイプラインは標準正則化と、サポートベクトルマシンの組み合わせとし、このサポートベクトルマシンのsvc$${\_\_}$$Cとsvc$${\_\_}$$gamma、svc$${\_\_}$$kernelのlinearかrbfをチューニングしている。

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))

param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]

param_grid = [{'svc__C': param_range, 
               'svc__kernel': ['linear']},
              {'svc__C': param_range, 
               'svc__gamma': param_range, 
               'svc__kernel': ['rbf']}]

gs = GridSearchCV(estimator=pipe_svc, 
                  param_grid=param_grid, 
                  scoring='accuracy', 
                  cv=10,
                  n_jobs=-1)
gs = gs.fit(X_train, y_train)
print(gs.best_score_)
print(gs.best_params_)
グリッドサーチによる最適パラメータの組み合わせ

この組み合わせを使った、テスト結果での性能は以下のように出せる。

clf = gs.best_estimator_
clf.fit(X_train, y_train)
print('Test accuracy: %.3f' % clf.score(X_test, y_test))

グリッドサーチとk分割交差検証

入子式の交差検証は、機械学習のアルゴリズムのどれかを選ぶため行われる。外側のループでグリッドサーチ、内側でk分割交差検証の組み合わせた入子式交差検証は5✖️2交差検証法とも呼ばれる。
 内側2回のループでグリッドサーチで訓練データを訓練サブセットと検証サブセットに分割してパラメータをチューニングし、外側五回のループで最適なパラメータでk分割交差検証をする。
 この実装は以下のように行われる。

from sklearn.tree import DecisionTreeClassifier
gs = GridSearchCV(estimator=pipe_svc,
                  param_grid=param_grid,
                  scoring='accuracy',
                  cv=2)

scores = cross_val_score(gs, X_train, y_train, 
                         scoring='accuracy', cv=5)

print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores),
                                      np.std(scores)))
グリッドサーチと交差検証の入子型

ここで、SVMモデルを決定気分類器に変えて行う入子交差検証法は以下のコードで実装できる。

gs = GridSearchCV(estimator=DecisionTreeClassifier(random_state=0),
                  param_grid=[{'max_depth': [1, 2, 3, 4, 5, 6, 7, None]}],
                  scoring='accuracy',
                  cv=2)

scores = cross_val_score(gs, X_train, y_train, 
                         scoring='accuracy', cv=5)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), 
                                      np.std(scores)))

いいなと思ったら応援しよう!