データサイエンティストにはなれなかった

システム屋さんの中でひっそりデータ活用について考えていくブログ

グリッドサーチ結果の可視化

春がもう少しで来そうでなかなか来ないもどかしい季節ですね。こんばんは。
最近Rのパッケージの関数を見るのが面白いなと感じる様になりました。
私はあまりコーディングをしないので得意ではないのですが、
下手なりに色々書き換えたりして、自分の欲求を満たすものに作り変えていくのは
なかなか悪くない趣味だなと思っています。

というところで、以前id:hoxo_mさんのブログ
SVM のチューニングのしかた(2) - ほくそ笑む
を読んでtune.plotカッコいいなあ、
もっと汎用的に使えたら嬉しいなぁと思ったのを思い出し、
勉強がてら色々書き換えてみました。

本当は元のe1071で行っている様にfilled.contourを使いたかったのですが、
私の力不足で図の配置が上手くコントロールできなかったため断念しました。
そのためカッコよさは激減しています。
グラフィックパラメータ周り難しい。。

library(e1071)
plot.tune.mat <- function(data,#scoreを指定しない場合最も右の列を評価値
                          score = NULL,
                          error = TRUE,#評価値が小さいほど良い場合はTRUE
                          main = NULL,
                          xlab = NULL,
                          ylab = NULL,
                          transform = NULL,#パラメータ全体を変換する関数
                          color.palette = hsv_palette(),
                          nlevels = 20,
                          ...){
  param <- as.data.frame(data)
  k <- ncol(param)
  
  if(is.null(score)){
    score <- param[,k]
    param <- param[,-k]
    k <- ncol(param)
  }
  
  if (!is.null(transform))
    param <- transform(param)
  
  if(!error){
    col <- rev(color.palette(n =nlevels))
  }
  else{
    col <- (color.palette(n =nlevels))
  }
  
  #グラフィックパラメータ設定
  plot.new()
  par(mfcol=c(k,k))  
  par(mar=par("mar")/sqrt(k-1))
  par(mgp=c(1.5,0.5,0))
  
  #描画
  lapply(1:ncol(param),function(i){
    lapply(1:ncol(param),function(j){
      
      paramtab <- tapply(score,param[,c(i,j)],mean)
      
      if (is.null(xlab)) xl <- colnames(param)[i]
      if (is.null(ylab)) yl <- colnames(param)[j]
      
      image(x=as.double(rownames(paramtab)),
            y=as.double(colnames(paramtab)),
            z=paramtab,
            xlab=xl,ylab=yl,
            col = col)
    })})
  
  #グラフィックパラメータを初期化
  on.exit(par(mfcol=c(1,1)))
  on.exit(par(mgp=c(3,1,0)))
  on.exit(par(mar=c(5.1,4.1,4.1,2.1)))
}

使い方としてはこんな感じです。

plot.tune.mat(data,error=T,transform=log2,nlevels=10)

結果
f:id:fqz7c3:20150215222456p:plain
濃いところが良いところです。
濃さのスケールは全プロットで共通です。

表示したデータ

> data
     p1 p2  p3 error_rate
1   100  5 100 0.06585525
2   100  5 100 0.06455118
3   100  5 100 0.06302978
4   100  5 200 0.05520539
5   100  5 200 0.05498805
6   100  5 200 0.05629211
7   100  5 400 0.04694632
8   100  5 400 0.04803304
9   100  5 400 0.04542491
10  100  5 800 0.04629428
11  100  5 800 0.04759835
12  100  5 800 0.04520756
13  100 10 100 0.06020430
14  100 10 100 0.06346446
15  100 10 100 0.06042165
16  100 10 200 0.05390133
17  100 10 200 0.05107585
18  100 10 200 0.05455336
19  100 10 400 0.04629428
20  100 10 400 0.04694632
21  100 10 400 0.04303412
22  100 10 800 0.04868507
23  100 10 800 0.04542491
24  100 10 800 0.04846772
25  100 20 100 0.05824821
26  100 20 100 0.05933493
27  100 20 100 0.06259509
28  100 20 200 0.05129320
29  100 20 200 0.05107585
30  100 20 200 0.05346664
31  100 20 400 0.04998913
32  100 20 400 0.04694632
33  100 20 400 0.04955444
34  100 20 800 0.04998913
35  100 20 800 0.04694632
36  100 20 800 0.04672897
37  100 40 100 0.06216040
38  100 40 100 0.05824821
39  100 40 100 0.05976962
40  100 40 200 0.05346664
41  100 40 200 0.05085851
42  100 40 200 0.05346664
43  100 40 400 0.05107585
44  100 40 400 0.05433601
45  100 40 400 0.05368398
46  100 40 800 0.05020648
47  100 40 800 0.05194523
48  100 40 800 0.05107585
49  200  5 100 0.06476853
50  200  5 100 0.06302978
51  200  5 100 0.06433384
52  200  5 200 0.05737883
53  200  5 200 0.05585742
54  200  5 200 0.05629211
55  200  5 400 0.04781569
56  200  5 400 0.04651163
57  200  5 400 0.04607694
58  200  5 800 0.04607694
59  200  5 800 0.04499022
60  200  5 800 0.04585960
61  200 10 100 0.06107368
62  200 10 100 0.05998696
63  200 10 100 0.06129102
64  200 10 200 0.05194523
65  200 10 200 0.05129320
66  200 10 200 0.05172789
67  200 10 400 0.04694632
68  200 10 400 0.04672897
69  200 10 400 0.04738100
70  200 10 800 0.04651163
71  200 10 800 0.04716366
72  200 10 800 0.04672897
73  200 20 100 0.05911758
74  200 20 100 0.05890024
75  200 20 100 0.05911758
76  200 20 200 0.04977179
77  200 20 200 0.05107585
78  200 20 200 0.05151054
79  200 20 400 0.04977179
80  200 20 400 0.04651163
81  200 20 400 0.04803304
82  200 20 800 0.04759835
83  200 20 800 0.04716366
84  200 20 800 0.04781569
85  200 40 100 0.06107368
86  200 40 100 0.06042165
87  200 40 100 0.06063899
88  200 40 200 0.05129320
89  200 40 200 0.05064116
90  200 40 200 0.05281461
91  200 40 400 0.05042382
92  200 40 400 0.05020648
93  200 40 400 0.04846772
94  200 40 800 0.04977179
95  200 40 800 0.05129320
96  200 40 800 0.05107585
97  400  5 100 0.06324712
98  400  5 100 0.06324712
99  400  5 100 0.06324712
100 400  5 200 0.05585742
101 400  5 200 0.05303195
102 400  5 200 0.05390133
103 400  5 400 0.04520756
104 400  5 400 0.04651163
105 400  5 400 0.04455553
106 400  5 800 0.04716366
107 400  5 800 0.04651163
108 400  5 800 0.04672897
109 400 10 100 0.05955227
110 400 10 100 0.05976962
111 400 10 100 0.06129102
112 400 10 200 0.05237992
113 400 10 200 0.05172789
114 400 10 200 0.05303195
115 400 10 400 0.04542491
116 400 10 400 0.04651163
117 400 10 400 0.04651163
118 400 10 800 0.04564225
119 400 10 800 0.04694632
120 400 10 800 0.04585960
121 400 20 100 0.05803086
122 400 20 100 0.06042165
123 400 20 100 0.05868290
124 400 20 200 0.05151054
125 400 20 200 0.05020648
126 400 20 200 0.04933710
127 400 20 400 0.04846772
128 400 20 400 0.04694632
129 400 20 400 0.04781569
130 400 20 800 0.04803304
131 400 20 800 0.04629428
132 400 20 800 0.04716366
133 400 40 100 0.06042165
134 400 40 100 0.06107368
135 400 40 100 0.05998696
136 400 40 200 0.05216257
137 400 40 200 0.05151054
138 400 40 200 0.05194523
139 400 40 400 0.04977179
140 400 40 400 0.04933710
141 400 40 400 0.05107585
142 400 40 800 0.05085851
143 400 40 800 0.05129320
144 400 40 800 0.05172789
145 800  5 100 0.06433384
146 800  5 100 0.06216040
147 800  5 100 0.06129102
148 800  5 200 0.05455336
149 800  5 200 0.05433601
150 800  5 200 0.05411867
151 800  5 400 0.04672897
152 800  5 400 0.04433819
153 800  5 400 0.04629428
154 800  5 800 0.04455553
155 800  5 800 0.04629428
156 800  5 800 0.04477288
157 800 10 100 0.06020430
158 800 10 100 0.05998696
159 800 10 100 0.06129102
160 800 10 200 0.05346664
161 800 10 200 0.05216257
162 800 10 200 0.05324929
163 800 10 400 0.04520756
164 800 10 400 0.04607694
165 800 10 400 0.04607694
166 800 10 800 0.04542491
167 800 10 800 0.04672897
168 800 10 800 0.04651163
169 800 20 100 0.05998696
170 800 20 100 0.05737883
171 800 20 100 0.05976962
172 800 20 200 0.05042382
173 800 20 200 0.05085851
174 800 20 200 0.04977179
175 800 20 400 0.04672897
176 800 20 400 0.04672897
177 800 20 400 0.04629428
178 800 20 800 0.04672897
179 800 20 800 0.04738100
180 800 20 800 0.04759835
181 800 40 100 0.05868290
182 800 40 100 0.05955227
183 800 40 100 0.06063899
184 800 40 200 0.05107585
185 800 40 200 0.05151054
186 800 40 200 0.05129320
187 800 40 400 0.04998913
188 800 40 400 0.04933710
189 800 40 400 0.05172789
190 800 40 800 0.04955444
191 800 40 800 0.05064116
192 800 40 800 0.04998913

現時点ではテストもほとんどしていないので
色々不具合あると思います。
(lapplyの2重ループもなんか気持ち悪いので書き換えたいし)
そのうち修正していくと思います。

そもそもこんな関数caretとかにありそうな気がするがどうなのでしょうか。



今回のブログを書くにあたってこの辺りを参考にしました。
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/52.html
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/53.html
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/55.html