mikemoke blog

ビジネスに関心があるデータサイエンティスト。データ解析・ビジネス・エンジニアリングについての知見を纏めています。

手軽にDeepLearning (とりあえず難しいことは分かった)

Pylearn,Caffeの環境設定・実行テストはしてみたものの、結局手持ちのデータについて解析していない、、という日々が長いこと続いてきました。

そこで、一旦速度とかチューニングとかは置いといて、とりあえず手を動かそう。

ということでH2Oとかいうライブラリ(R)を用いて手軽にDeepLearningを実施してみることに。

 

参考にした記事↓↓

Deep Learningの性能を見てみよう ~Iris編~ | ALBERT分析者ブログ「分析現場24時 そのデータの裏側に迫る!」

H2OのRパッケージ{h2o}でお手軽にDeep Learningを実践してみる(1):まずは決定境界を描く - 銀座で働くデータサイエンティストのブログ

 

手持ちのデータ(詳細は内緒)

パラメータ数:900
データ数:20000
※以前ロジスティック回帰でAccuracy80%程度の判別性能

 

今回躓いた所

  • Rは最新バージョン(3.1.3)に更新
    3.1.0では "Error in h2o.init() : R 3.1.0 is not compatible with H2O!" だそうです。
  • データをH2O用フォーマットで読み込み

    ちゃんと調べてないですが、H2OはRとは別の実行ファイルによリ動いているようなので、データを指定のフォーマットにする必要があるようです。
    今回はとりあえず、csvに保存して、以下のように読み込みました。

    >localH2O = h2o.init(nthreads = -1)
    >data_dl = h2o.importFile(localH2O,path="tmp_deeplearning.csv")

  

実行コード

  1.  library(h2o)
  2. localH2O = h2o.init(nthreads = -1) # run with full cpu cores
  3. data_dl <- h2o.importFile(localH2O,path="tmp_deeplearning.csv")
  4. #setting data 
  5. index1 <- 1:5005
  6. tData1 <- data_dl[-index1,]
  7. eData1 <- data_dl[index1,]
  8. #deeplearning
  9. res.dl <- h2o.deeplearning(x = 1:900,y=901, data = tData1, validation =eData1, activation = "TanhWithDropout",hidden=c(100,100))

 

結果

レイヤー数とノード数をコロコロ変えたり、ハイパーパラメータ選択したりしつ動作の確認を行っていますが、Logisticよりも良い、と言えるような結果は今のところ出ていません。
もうすこしパラメータを調整しつつ様子見してみます。

 

追記

隠れ層のLayer,Nodeパラメータを変更して解析してみました。(他ハイパーパラメータは同じ)考察ができていないので結果ベタ書きします。。

使用するデータについて

学習データとして15015,検証データとして5005適用し、評価を実施。

実行環境について

OS:Windows7 64bit
CPU:AMD Phenom(tm)II X6 1065T Processor 2.90GHz
memory:10GHz

 参考: logistic回帰(StepWiseにより40 Parameter 選択 )
    predict total error rate
    0 1
actual 0 3548 482 4030 0.119603
1 469 506 975 0.481026
条件① 隠れ層 hidden=c(100,100)
計算時間:数分
  predict total error rate
0 1
actual 0 3523 507 4030 0.125806
1 516 459 975 0.529231
条件② 隠れ層 hidden=c(100,1000)
計算時間:数分
  predict total error rate
0 1
actual 0 3535 495 4030 0.122829
1 505 470 975 0.517949
条件③ 隠れ層 hidden=c(2000,2000,1000) ※1
計算時間:111min
  predict total error rate
0 1
actual 0 3549 481 4030 0.119355
1 490 485 975 0.502564

 

以降はLogistic回帰で選択した40parameterを用いて学習を実施

条件④ 隠れ層 hidden=c(100,100)   parameter選択40
計算時間:数分
  predict total error rate
0 1
actual 0 3565 465 4030 0.115385
1 474 501 975 0.486154
条件⑤ 隠れ層 hidden=c(10,100)    parameter選択40
計算時間:数分
  predict total error rate
0 1
actual 0 3571 459 4030 0.113896
1 468 507 975 0.48
条件⑥ 隠れ層 hidden=c(100,10,100)    parameter選択40
計算時間:数分
  predict total error rate
0 1
actual 0 3416 614 4030 0.152357
1 665 310 975 0.682051
条件⑦ 隠れ層 hidden=c(2000,2000,1000)    parameter選択40
計算時間:73min
  predict total error rate
0 1
actual 0 3534 496 4030 0.123077
1 505 470 975 0.517949

 

 

所感

参考としたLogistic回帰よりも良好な結果は条件⑤( 隠れ層 hidden=c(10,100)    parameter選択40)のみ、完全に技術に振り回されてしまっています。

ハイパーパラメータ数が非常に多く、挙動も推測し辛いため、一定の性能を引き出すだけでも苦労しそうです。他の機械学習手法なら、適当にやってもソコソコ性能がでそうなもんですが。

前向きに捉えれば、初学者でも簡単にデータ解析ができる世の中で、データ解析担当者が差別化できるポイントにならないかな、と。

 

今後は、このまま手探りで検討数増やしてもどうにもならない気がするので、せめてH2Oで適用できるハイパーパラメータを使いまわせる程度に理解してリベンジ決めます。

 

 

 

※1  TJO_datasci さんよりアドバイス頂きましたので、参考にさせていただきました。

TJO on Twitter: "LRより性能が上がらないのはそもそも線形分離可能でDLの長所が生きないか、後はもっと隠れ層のユニット数を増やして例えばc(2000,2000,1000)にするとか / 手軽にDeepLearning(進行中 - mikemokeの日記 http://t.co/QKwbVX8sKU"