機械学習モデルにはハイパーパラメータと呼ばれる人手で調整すべきパラメータがありますよね。このハイパーパラメータを解くべき問題により適した値に設定することで精度をあげることが可能です。この適切なハイパーパラメータを自動で探索する代表的な手法にグリッドサーチがありますが、本記事ではグリッドサーチがどのように最適なハイパーパラメータを探すのかを解説しましょう。
ハイパーパラメータとは
機械学習モデルは学習データを与えれば内部で自動的に適切な予測が行えるように様々なパラメータが更新されていきますが、多くの機械学習モデルでは全てのパラメータが自動で学習されるわけではなく、人手で設定するべき値、ハイパーパラメータがあります。
広く利用されているScikit-Learnというパッケージは非常に有名ですよね。Scikit-Learnでは、ひとつのモデルにおけるハイパーパラメータは10個や20個にのぼるものもあり、全て手動で変更して調整するには限界があります。
そのためハイパーパラメータは一般的に適切とされている値を使用した上で、チューニングする際には自動で行う必要が生じます。
ハイパーパラメータ自動探索手法
ハイパーパラメータを自動で探索する代表的な手法には以下の3つがあります。
- ランダムサーチ
- グリッドサーチ
- ベイズ最適化
以降では、これら3つの手法について簡単に紹介していきましょう。
ランダムサーチ
ランダムサーチは考えうる全ての探索空間からハイパーパラメータが従うであろう指定された分布に基づいてパラメータを無作為に抽出してモデルの性能を評価することで、適切なハイパーパラメータを探し出します。
Scikit-Learnでは学習を行うモデル、チューニングするパラメータとそのパラメータが従う分布、探索を行う回数を指定することで簡単にランダムサーチを実行することができます。
グリッドサーチ
グリッドサーチはその名の通り探索空間を格子状に区切り、格子点上の値の組み合わせから適切なハイパーパラメータを探索する手法で、Scikit-Learnでは学習するモデル、チューニングするハイパーパラメータとその格子点を指定して探索を行います。
ベイズ最適化
またベイズ最適化は簡単に説明すると以前の探索結果を考慮し、探索の結果がよかったものの周辺をより入念に探索していく手法で、プリファードネットワークスが提供しているOSSであるOptunaなどで広く利用されています。
Scikit-Learnのグリッドサーチを利用する
先ほども説明した通りScikit-Learnでは簡単にグリッドサーチを利用できるインターフェイスを提供しています。以降では、リッジ回帰のモデルのハイパーパラメータ探索を行う例をご紹介しましょう。
import numpy as np from sklearn.datasets import load_boston from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV if __name__ == '__main__': X, y = load_boston(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split( X, y, shuffle=True, random_state=27 ) model = Ridge() params_grid = { 'alpha': [0.0, 0.5, 1.0, 1.5, 2.0], 'normalize': [True, False] } search = GridSearchCV(model, params_grid, cv=2) search.fit(X_train,y_train) print(search.best_params_)
alphaは正則化パラメータの重み、normalizeはデータを正規化するか否かの2値です。このプログラムを実行すると以下の結果が得られます。
{'alpha': 0.5, 'normalize': True}
alphaは1.0、normalizeはFalseがデフォルトのパラメータなため、グリッドサーチによるハイパーパラメータ探索でさらに精度が良くなる可能性が見つかったと考えることができます。
まとめ
グリッドサーチについて重要な点をまとめましょう。
- ハイパーパラメータ探索の代表的な手法
- 格子点で表現された探索空間の組み合わせを総当たりで探索する手法
- Scikit-Learnで簡単に利用できる