SckitLearnでグリットサーチを行いパラメータを最適化する
グリットサーチとは
グリットサーチとは英名でGridSerchと呼ばれハイパーパラメータの最適化を行う機能です。
ハイパーパラメータとはコストパラメータを表すCやgammaなどに該当し、これらのパラメータの調整を行うことで、認識の精度が上ったり、下がったりもします。
SckitLearnではハイパーパラメータを省略しても、デフォルトで設定されるため、ある程度の精度を出すことは出来ますが、微調整を行う場合はハイパーパラメータの調整が不可欠です。
しかし、最適なパラメータを探すために、一つ一つパラメータを設定し結果を確認、また別なパラメータを設定し確認・・という手順を行うと最適なパラメータを発見するために非常に時間がかかってしまいます。
そのような時に便利なのがグリットサーチです。
グリットサーチはあらかじめ、微調整をおこないたいパラメータを設定しておくことで、最適なパラメータを自動的に求めてくれる機能です。SckitLearnではグリットサーチのライブラリがあるので簡単に使用することができます。
SckitLearnでグリットサーチの使用方法
グリットサーチを行うためにGridSearchCVをインポート
1 |
from sklearn.model_selection import GridSearchCV |
パラメータをあらかじめ設定
例としてコストパラメータを表すCを調整する場合は次のように記載します。
1 2 |
C_range = [1e-5,1e-4,1e-3,1e-2,1,1e1,1e2,1e3,1e4,1e5,] parameter = {'C':C_range} |
GridSearchCVにパラメータを設定
先ほど設定したパラメータをGridSearchCVに指定します。
例)
1 |
GridSearch = GridSearchCV(識別器,parameter) |
グリットサーチを使用したソースコードを具体的に示します。
ソースコード(グリットサーチ未使用)
SckitLearnに含まれている癌の識別のデータを使用してグリットサーチを行うコードを記載します。比較のために、グリットサーチを行わない通常のコードを示します。
測定器はロジスティク回帰を使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#各種ライブラリのImport import numpy as np import pandas as pd from matplotlib import pyplot as pld #%matplotlib inline #scikit-learnより癌のデータを抽出する from sklearn.datasets import load_breast_cancer data = load_breast_cancer() #癌のデータ(説明変数)をdataXに格納する dataX = pd.DataFrame(data=data.data,columns=data.feature_names) dataX.head() #癌のデータ(目的変数)をdataYに格納する dataY = pd.DataFrame(data=data.target) dataY = dataY.rename(columns={0: '判定(0:悪性 / 1:陽性)'}) dataY.head() #データの分割を行う(訓練用データ 0.6 評価用データ 0.4) from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(dataX, dataY, test_size=0.4) #線形モデル(ロジスティク回帰)として測定器を作成する from sklearn import linear_model clf = linear_model.LogisticRegression() #訓練の実施(グリットサーチを使用しない場合) clf.fit(X_train,Y_train) #評価の実行(正答率)(グリットサーチを使用しない場合) clf.score(X_test,Y_test) |
このコードを実行した場合、測定器のハイパーパラメータ(デフォルト)は以下のようになっています。
1 2 3 4 |
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False) |
注目すべき点はC=1.0となっていることです。このC=1.0はデフォルトのパラメータです。
正答率は次のようになりました。
1 |
0.95614035087719296 |
約95%の精度となっています。
ソースコード(グリットサーチ使用)
先ほどのコードに次のコードを追記してください。
グリットサーチを行う
1 2 3 4 5 6 7 8 |
#グリットサーチを行う from sklearn.model_selection import GridSearchCV C_range = [1e-5,1e-4,1e-3,1e-2,1,1e1,1e2,1e3,1e4,1e5,] parameter = {'C':C_range} GridSearch = GridSearchCV(clf,parameter,cv=6) GridSearch.fit(X_train,Y_train) |
0.0001、0.001、0.01・・・1000.0,10000.0,100000.0,
GridSearchCVに先ほど指定したparameterとロジスティク回帰の測定器を指定しています。CV=XXとはクロスバリデーションとなり、今回はクロスバリデーションの数を6として指定しています。
グリットサーチの結果において、最適なパラメータを表示する
1 2 |
#グリットサーチの結果において、最適なパラメータを表示する GridSearch.best_params_ |
1 |
{'C': 10.0} |
グリットサーチの結果において、最適なパラメータを表示する
1 2 |
#グリットサーチの結果において、最適なパラメータを表示する GridSearch.best_estimator_ |
1 2 3 4 |
LogisticRegression(C=10.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False) |
評価の実行(グリットサーチを使用)
1 2 |
#評価の実行(グリットサーチを使用) GridSearch.score(X_test,Y_test) |
1 |
0.96052631578947367 |
今回はCという1つのパラメータに特化して行いましたが、辞書型のリストを追加することで、複数のパラメータについても検証することができます。
複数のパラメータを調整することで、より高い精度を求めることが可能となったり、パラメータの意味を理解する手がかりとなります。是非いろいろ試してください。