用語
グリッドサーチ
- モデルの汎化性能を高めるために、ハイパーパラメータを調整する手法です。
- ハイパーパラメータは、モデル作成時に調整する変数のことです。例えば、sklearnのRandomForestClassifierなら「max_depth」、「n_estimators」などが該当します。
(↓参考)
aiacademy.jp
交差検証(Cross Validation)
こちらのサイトに分かりやすく書かれています。
aiacademy.jp
GridSearchCV
- sklearnに用意されている、グリッドサーチと交差検証をまとめてやってくれる機能です。
- CVは交差検証(Cross Validation)の頭文字をとったものでしょう。
GridSearchCVの使い方
宣言と引数の調整
宣言
gscv = GridSearchCV(estimator param_grid, cv, verbose)
主な引数の設定
引数名 | 機能 |
---|---|
第1引数(model) | ハイパーパラメータを調整するモデル。 例)ランダムフォレストなら RandomForestClassifier(random_state=0) |
第2引数(param_grid) | 調整したいパラメータの文字列をkey、検証したい値のリストをvalueとした辞書型。 例)ランダムフォレストに対して、max_depthを2~5、n_estimatorsを10, 20, 30と変更させるなら、 {'n_estimators':[2, 3, 4, 5], 'max_depth':[10, 20, 30]} |
cv | 交差検証の回数 |
verbose | 処理状況の表示を調整。 1~3で、大きいほど詳細に表示。 |
(公式ドキュメント↓)
scikit-learn.org
学習
ランダムフォレストなど通常のモデルと同様に学習ができる。
gscv.fit(x_train, y_train)
結果の取得など
最も高かった正答率 | gscv.best_score_ |
↑のときのハイパーパラメータ | gscv.best_params_ |
↑のときのモデル | gscv.best_estimator_ |
各検定の詳細 | gscv.cv_results_ (辞書型) |
使用例
1. モデルの取得&訓練データとテストデータの設定
今回はsklearnのirsデータセットを使用。
import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # データの取得 x = load_iris().data y = load_iris().target # 訓練データとテストデータに分類 train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=1)
2. GridSearchCVの作成
今回は、ランダムフォレストを使用し、
- n_estimatorsを10以上50未満で5刻み
- max_depthを2以上6未満
- cv=3
として検証を行った。
from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier import numpy as np #モデル model = RandomForestClassifier(random_state=0) #設定するハイパパラメータ paramDic= {'n_estimators':np.arange(50, 150, 5), 'max_depth':np.arange(2, 6)} # GridSearchCVのインスタンスを作成&学習&スコア記録 gscv = GridSearchCV(model, paramDic, cv=3, verbose=2)
3. 学習
#学習
gscv.fit(train_X, train_y)
4. 評価など
正答率が最高だったときの値と、そのときのパラメータを表示してみます。
#正答率が最高だった時とその時のパラメータを取得 bestScore = gscv.best_score_ bestParam = gscv.best_params_ #表示 print(f'{bestParam}のときに正答率が最高で{bestScore}')
実行結果
{'max_depth': 2, 'n_estimators': 50}のときに正答率が最高で0.9416666666666668
5. 正答率が最も高いモデルの取得とテストデータの正答率の確認
こちらで取得すると、テストデータの予測精度は0.9666666666666667でした。
# 正答率が最高のモデルを取得 best = gscv.best_estimator_ #↑で予測し、その正答率を表示 best.score(test_X, test_y)
6. RandomForestとの比較
一応、何もしない場合のRandomForestと比較してみると、なんとまったく同じ正答率になりました。
パラメータの範囲を変えればよかったのでしょうか?
まあ、irisデータはデータ数も少なめだったので、変わらなかったのだと思います(適当)。
# 正答率が最高のモデルを取得 best = gscv.best_estimator_ #↑で予測し、その正答率を表示 best.score(test_X, test_y)
7. 各検定の詳細の取得
先ほど各検定の詳細はcv_results_で取得できると紹介しました。
ただ、これは辞書型で少々見にくかったので、DataFrame型に変更すると良いと思います。
# スコアの一覧を取得 import pandas as pd cvResult = pd.DataFrame.from_dict(gscv.cv_results_) cvResult
まとめ
GridSearchCVを使えば、グリッドサーチと交差検証がまとめて効率よくできる。
使用例でのコードを以下にまとめた(RandomForestとの比較は省略。また、1つにまとめたため、多少修正している)。
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier import numpy as np # データの取得 x = load_iris().data y = load_iris().target # 訓練データとテストデータに分類 train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=1) #モデル model = RandomForestClassifier(random_state=0) #設定するハイパパラメータ paramDic= {'n_estimators':np.arange(50, 150, 5), 'max_depth':np.arange(2, 6)} # GridSearchCVのインスタンスを作成&学習&スコア記録 gscv = GridSearchCV(model, paramDic, cv=3, verbose=2) #学習 gscv.fit(train_X, train_y) #正答率が最高だった時とその時のパラメータを取得 bestScore = gscv.best_score_ bestParam = gscv.best_params_ #表示 print(f'{bestParam}のときに正答率が最高で{bestScore}') # 正答率が最高のモデルを取得 best = gscv.best_estimator_ #↑で予測し、その正答率を表示 best.score(test_X, test_y)