パープルハット

※当サイトではGoogleアドセンス広告を利用しています

sklearn GridSearchCVによるモデル作成



用語

グリッドサーチ

  • モデルの汎化性能を高めるために、ハイパーパラメータを調整する手法です。
  • ハイパーパラメータは、モデル作成時に調整する変数のことです。例えば、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と変更させるなら、
{'max_depth':[2, 3, 4, 5], 'n_estimators':[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を50以上150未満で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)