LoginSignup
5
4

More than 3 years have passed since last update.

Python機械学習手遊び(GridSearchCVミニマムコード)

Last updated at Posted at 2019-03-03

この記事、何?

回帰でGridSearchCVを使ってみたくなった。
けど、よく上がっているのって流用しづらいのが多かった。
だからミニマムのコードサンプルを作ってみた。

補足

データサイエンティスト・・・を目指すものとしては、GridSearchCVは道具。
道具の使い方が分かればそれでよし。
直接、公式サイトを見てもいいんだけど、組み合わせて使いたい「あれ」と「これ」が組み合わさったコードがあると助かる。

使った「あれ」とか「これ」とか

■sklearn.cross_decomposition.PLSRegression
https://scikit-learn.org/0.19/modules/generated/sklearn.cross_decomposition.PLSRegression.html

■sklearn.model_selection.GridSearchCV
https://scikit-learn.org/0.19/modules/generated/sklearn.model_selection.GridSearchCV.html

■sklearn.svm.SVR
https://scikit-learn.org/0.19/modules/generated/sklearn.svm.SVR.html#sklearn.svm.SVR

方針

単純化のため、回帰ロジックはPLSとした。
1個じゃ寂しいのでSVRを追加した。
予測を成立させるために、f(x,y,z) = x+y+z という単純な一次式を想定して予測させた。

作ったコード


#26-01.py
from sklearn.cross_decomposition import PLSRegression
from sklearn.model_selection import GridSearchCV
X = [[3,5,7], [1,2,3], [2,2,6], [0,3,5], [3,1,2], [4,3,8], [1,7,2]]
Y = [[15], [6], [10], [8], [6], [15], [10]]

params = [{'n_components':(1,2,3)}]

pls = PLSRegression()

clf = GridSearchCV(pls, params)
clf.fit(X, Y)

result = clf.cv_results_

print(result['params'])
print(result['mean_train_score'])


#26-03.py
from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV
X = [[3,5,7], [1,2,3], [2,2,6], [0,3,5], [3,1,2], [4,3,8], [1,7,2]]
Y = [[15], [6], [10], [8], [6], [15], [10]]

params = [{'kernel':('linear', 'rbf')}]

pls = SVR()

clf = GridSearchCV(pls, params)
clf.fit(X, Y)

result = clf.cv_results_

print(result['params'])
print(result['mean_train_score'])

出力

(PLS)
[{'n_components': 1}, {'n_components': 2}, {'n_components': 3}]
[0.90585749 0.99680841 1.        ]

(SVR)
[{'kernel': 'linear'}, {'kernel': 'rbf'}]
[0.9991696  0.35999864]

3つの変数を足しただけなのでPLSのn_components=3でscoreが1になるのは当然として、n_componentsが1や2の時のscoreがすごい。
やっぱりPLSが行列変換して都合がいい軸を作って合わせる仕様で、最初の1つ目の次元削減くらいどうとでも合わせられるということの表れのように思うわ。
逆にSVR。linearって言っているくらいだから、そっちはいいとしても、よく使われている(っぽい?)rbfのスコアが。。。
そりゃ、サンプル数があまりにも少なすぎということでしょ。

この記事を書こうと思った理由(というか、愚痴。。)

GridSearchCV使っているのって、svcのコピペか、jupyterのいろいろ試して長いやつばかり。
jupyterから切って貼ったやつって、手元で動かそうとしても肝心な部分が抜けてたり、実行順に影響したりして初学者にとって難易度が高いものが多くてつらい。。。

感想

時間不足を反省。
経験値が足らないなぁ・・・このくらいの記事を書くにも時間をかけてしまって。
というか、こういうのを書こうと思うくらい慣れが少なくて。
次の投稿は「GridSearchCVで評価してみた」で。

5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4