グリッドサーチ結果の可視化
春がもう少しで来そうでなかなか来ないもどかしい季節ですね。こんばんは。
最近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)
結果
濃いところが良いところです。
濃さのスケールは全プロットで共通です。
表示したデータ
> 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