Param Tuner
@muddydixon
東京Node学園 8時限目
13年4月25日木曜日
お詫び
✓ParamTunerの話だけでは尺が持たなかった
ので最近作ったあれこれの話を含めます
13年4月25日木曜日
me
✓Data Science
✓DataVisualization
✓working @ Nifty
13年4月25日木曜日
最近作ったあれこれ
✓ParamTuner
✓grunt-contrib-tuning
✓Series.interpolate.js
✓Series.js ←イマ作ってる
✓全体的に改善・時系列のあれこれです
13年4月25日木曜日
Param Tuner
✓パラメタ空間を定義
✓Strategyを選択
✓パラメタ空間の中で試行
✓bestな解を取り出してくれる
✓binもあります
13年4月25日木曜日
Strategy
✓現在実装済みなのは、Greedyのみ
✓ つまりランダムで施行して良い結果を選択
✓GeneralizeLinearModel(線形モデル)は間に
合いませんでした m( _ _ )m
✓ サンプル点からモデルを作成し、極小点を探索
する戦略
13年4月25日木曜日
Param Tuner bin
{
	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "range":	
  [0,	
  1]
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  },
	
  	
  	
  	
  "command":	
  "echo	
  $RANDOM",
	
  	
  	
  	
  "report":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "type":	
  "json",
	
  	
  	
  	
  	
  	
  	
  	
  "filename":	
  "./report.json"
	
  	
  	
  	
  }	
  	
  	
  	
  
}
plan.json
13年4月25日木曜日
Param Tuner bin
%	
  ./bin/tuner	
  -­‐p	
  ./example/plan.json
13年4月25日木曜日
Param Tuner
{
	
  	
  "time":	
  {
	
  	
  	
  	
  "begin":	
  "2013-­‐04-­‐24T19:15:58.559Z",
	
  	
  	
  	
  "end":	
  "2013-­‐04-­‐24T19:15:58.628Z"
	
  	
  },
	
  	
  "results":	
  {
	
  	
  	
  	
  "best":	
  {
	
  	
  	
  	
  	
  	
  "cost":	
  3164,
	
  	
  	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  0.5529168925713748
	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  },
	
  	
  	
  	
  "iteration":	
  [
	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  0.20574524416588247
	
  	
  	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  	
  	
  "cost":	
  19094
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  0.5529168925713748
report.json
13年4月25日木曜日
Param Tuner bin
{
	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "range":	
  [0,	
  1]
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  },
	
  	
  	
  	
  "command":	
  "echo	
  $RANDOM",
	
  	
  	
  	
  "report":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "type":	
  "json",
	
  	
  	
  	
  	
  	
  	
  	
  "filename":	
  "./report.json"
	
  	
  	
  	
  }	
  	
  	
  	
  
}
plan.json
パラメタ空間の定義
13年4月25日木曜日
Param Tuner bin
{
	
  	
  "params":	
  {
	
  	
  	
  	
  "alpha":	
  3.5,	
  //	
  const
	
  	
  	
  	
  "beta":	
  {
	
  	
  	
  	
  	
  	
  "range":	
  [0,	
  10]	
  //	
  range	
  [begin,	
  end]
	
  	
  	
  	
  },
	
  	
  	
  	
  "gamma":	
  {
	
  	
  	
  	
  	
  	
  "enum":	
  [1,	
  3,	
  6,	
  9]	
  //	
  enumerate	
  [items]
	
  	
  	
  	
  }
	
  	
  }
}
params
13年4月25日木曜日
Param Tuner bin
{
	
  	
  	
  	
  "params":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "alpha":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "range":	
  [0,	
  1]
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  },
	
  	
  	
  	
  "command":	
  "./command.js",
	
  	
  	
  	
  "report":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "type":	
  "json",
	
  	
  	
  	
  	
  	
  	
  	
  "filename":	
  "./report.json"
	
  	
  	
  	
  }	
  	
  	
  	
  
}
plan.json 外部jsを利用することもできます
通常のmoduleと同様 exports してください
13年4月25日木曜日
Param Tuner module
✓moduleとして利用するときにはいくつか
の機能を利用できます
✓prepare
✓ 施行探索前に実施する(データのロードなど)
✓env
✓ 施策ごとに環境を変えることができる
✓ サーバのポートなど
13年4月25日木曜日
Param Tuner module
Tuner	
  =	
  require	
  'paramtuner'
tuner	
  =	
  new	
  Tuner
	
  	
  #	
  施行ごとに繰り返される処理を記述
	
  	
  command:	
  (env,	
  params,	
  next)-­‐>
	
  	
  	
  	
  #	
  なんか処理してcostが求まる	
  costなので小さいほうが良い
	
  	
  	
  	
  next(null,	
  cost)
	
  	
  
	
  	
  #	
  探索するパラメタ空間を定義
	
  	
  params:
	
  	
  	
  	
  alpha:
	
  	
  	
  	
  	
  	
  range:	
  [0,	
  10]
	
  	
  	
  	
  beta:
	
  	
  	
  	
  	
  	
  range:	
  [0,	
  10]
	
  	
  
	
  	
  #	
  探索前に処理しておく内容を記述	
  command内のenv.$topicで取り出すことが可能
	
  	
  prepare:	
  (done)-­‐>
	
  	
  	
  	
  done	
  null,	
  {data:	
  [0,	
  1,	
  2,	
  3,	
  4]}	
  #	
  実際にはdbから取得など
Usage
13年4月25日木曜日
Param Tuner module
Tuner	
  =	
  require	
  'paramtuner'
tuner	
  =	
  new	
  Tuner
	
  	
  #	
  ~中略~
	
  	
  #	
  施行ごとに異なる環境を提供する場合	
  以下の場合、5000から1つずつ上げていく
	
  	
  #	
  envで返される関数が毎回実行される	
  commandの第1引数から取得可能
	
  	
  env:	
  ()-­‐>
	
  	
  	
  	
  port	
  =	
  5000
	
  	
  	
  	
  ()-­‐>
	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  port:	
  port++
	
  	
  	
  	
  	
  	
  }
	
  	
  #	
  探索後の処理	
  例えば、最適なパラメタでWebサーバ起動など
	
  	
  done:	
  (err,	
  results,	
  time)-­‐>
	
  	
  	
  	
  best	
  =	
  results.best
	
  	
  	
  	
  #	
  best.params	
  を使って処理
	
  	
  	
  	
  console.log	
  "best	
  cost	
  is	
  #{best.cost}"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
tuner.start()
Usage
13年4月25日木曜日
Param Tuner module
✓Todo
✓ Strategyの追加
❖ 特に一般線形モデル作ったら気持ちよさそう
✓ grunt-contrib-tuning (現在はやっつけ)
❖ このmoduleを利用した形に変更する
❖ さっきやりました
13年4月25日木曜日
grunt-contrib-tuning
✓gruntで使えます!
✓multitask
tuning:
	
  	
  #	
  required:	
  tuning	
  case	
  name
	
  	
  test:	
  
	
  	
  	
  	
  #	
  required:	
  tuning	
  parameter	
  list
	
  	
  	
  	
  params:	
  
	
  	
  	
  	
  	
  	
  alpha:
	
  	
  	
  	
  	
  	
  	
  	
  range:	
  [0,	
  1]
	
  	
  	
  	
  	
  	
  beta:
	
  	
  	
  	
  	
  	
  	
  	
  range:	
  [5,	
  10]
	
  	
  	
  	
  	
  	
  gamma:
	
  	
  	
  	
  	
  	
  	
  	
  range:	
  [10,	
  100]
	
  	
  	
  	
  prepare:	
  (next)-­‐>
	
  	
  	
  	
  	
  	
  next	
  null,	
  {hoge:	
  'fuga'}
	
  	
  	
  	
  #	
  optional:	
  if	
  define	
  this	
  method,	
  it	
  
passed	
  to	
  `command`
	
  	
  	
  	
  env:	
  ()-­‐>
	
  	
  	
  	
  	
  	
  port	
  =	
  10000
13年4月25日木曜日
grunt-contrib-tuning
✓test: simplemocha
✓document: docco
✓coverage: coffee-coverage
13年4月25日木曜日
grunt-contrib-tuning
✓test: simplemocha
✓document: docco
✓coverage: coffee-coverage
✓tuning: paramtuner
13年4月25日木曜日
時間が余ったら
✓Series.js
✓系列データに特化したモジュールを作って
います(誰得)
✓ R, pandas, Octave, Matlab...
13年4月25日木曜日
Series.js
✓sum
✓mean
✓variance
✓stdev
✓covariance
✓correlation
✓autocovariance
✓autocorrelation
✓moving average
✓moving variance
✓arima (現在はarのみ)
✓t-test
✓smoothing
✓lag
✓dif
TODO:
✓arima
✓spectrum
✓fourier transfer
13年4月25日木曜日
Series.js
Series	
  =	
  require	
  'series.js'
	
  
expect(Series.sum([0..10])).to.be.equal(55)
	
  
series	
  =	
  new	
  Series({bufsize:	
  10,	
  discount:	
  0.8}).x((d)-­‐>	
  d.time).y((d)-­‐>	
  
d.val)
series.push({time:	
  new	
  Date(2013,0,1),	
  val:	
  1})
series.push({time:	
  new	
  Date(2013,0,2),	
  val:	
  2})
series.push({time:	
  new	
  Date(2013,0,3),	
  val:	
  3})
series.push({time:	
  new	
  Date(2013,0,4),	
  val:	
  4})
	
  
expect(series.mean()).to.be.equal(1.6384)	
  
#	
  正確には	
  2.5
#	
  discountを変更することで、最新値と過去の重みを変更
13年4月25日木曜日
Series.js
✓d3.jsと組み合わせることで時系列データの
処理・表現の両方を同一言語で処理する
ことが可能
13年4月25日木曜日
Series.interpolate.js
✓時系列データにはだいたい欠損が入る
✓欠損値をよきに埋めるモジュール
✓というのを作って、いま、直しています
✓d3と組み合わせることで(略
date:2013-­‐01-­‐01<TAB>val:34
date:2013-­‐01-­‐02<TAB>val:26
date:2013-­‐01-­‐04<TAB>val:43
13年4月25日木曜日

ParamTuner 東京Node学園#8