2018-11-20###前置き###scikit-learnにはハイパーパラメータ探索用のGridSearchCVがあって、Pythonのディクショナリでパラメータの探索リストを渡すと全部試してスコアを返してくれる便利なヤツだ。今回はDeepLearningではないけど、使い方が分からないという声を聞くので、このGridSearchCVの使い方をまとめておこうと思います。ちなみにKerasだとscikit-learnのAPIもあるので、Kerasで作ったモデルをこのGridSearchCVでパラメータ探索できる。(やったことないけど・・・)####GridSearchCV####sklearn.model_selection.GridSearchCV###ソースコード全文###今回は最初にコード全文を載せておく。データはirisデータセットでサポートベクターマシンを使って分類する。confusion_matrix探索パラメータが数値の時にndarrayでやると楽なのでnumpy、スコア一覧をDataFrameにしてしまえばCSVなどで吐き出すのが楽なのでpandas。irisデータセットと分類用のサポートベクターマシン(SVC)、データをランダムに分割するtrain_test_split、最後の評価用の混同行列を出力するconfusion_matrixをインポートします。retメインのソースが綺麗になるので、パラメータ空間は関数で作る。ディクショナリで渡す必要がある。キーがサポートベクターマシンのパラメータ名で値が探索する値のリスト(というか多分iteratorなら何でもOKなんだと思う)値の最大・最小を指定しておけばいいわけではないので、ここではnumpyが活躍する。あるけど、arangeとlinspaceを覚えておけば大体OKと思う。どちらも始点と終点を入れ替えると昇順・降順が入れ替わる。test_size=0.25)説明変数となるx、目的変数となるyを75%と25%にランダムに分ける。ここでの25%は最後の評価用で、75%を使ってGridSearchCVによるパラメータ探索を行う。y_train)GridSearchCVの第1引数には推定器のインスタンスを渡す。探索せずに固定したいパラメータがあれば、ここで指定しておけば常にそのパラメータが使われる。第2引数にはパラメータの探索空間(ディクショナリ)を渡す。ここでは先ほどの関数を渡す。ここでのパラメータcvは交差検証の手法を指定する。この例のようにIntで指定するとK-Fold法のn分割のnを指定することになる。※省略すると3になる。Int型以外ではscikit-learnのデータ分割(ShuffleSplit等)を指定することもできる。verboseは進捗を見たい場合は1や2を指定しておくと標準出力で進捗が見れるけど、プログレスバーみたいな上等な物は出ない。fitにデータを放り込むと探索が始まる。設定した探索空間次第だが、長くなる。gs_result.to_csv('gs_result.csv')ディクショナリで返ってくるので、そのままpandasのDataFrameに入れてCSV出力する。・・・というのも大抵の場合、大きすぎてEXCELなどじゃないと見れたものじゃないからだ。キーは全部英語だけど、意味が分からない物はほとんどないと思うが、一番分かりやすいのはrank_test_score。この列をキーに昇順に並べ替えた時、一番上に来るものが未学習データのスコアが一番良かったパラメータの適用例。pred))GridSearchCVのインスタンスからbest_estimator_にアクセスすると最高性能だったパラメータを適用した学習済みのインスタンスを取り出せる。11]]1つだけ間違ってしまうようだが、上々の性能だ。###最後に###GridSearchCVの必要最小限の使い方を解説しました。カスタマイズ性が高いので、これ以上は色々試されると良いと思います。評価方法はscikit-learnの場合、回帰問題だと決定係数$R^2$、分類問題だと正解率が適用されて、いずれも高い方が良いように扱われますが、回帰問題で正負反転した平均二乗誤差などを使うこともできます。