手軽に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")
実行コード
- library(h2o)
- localH2O = h2o.init(nthreads = -1) # run with full cpu cores
- data_dl <- h2o.importFile(localH2O,path="tmp_deeplearning.csv")
- #setting data
- index1 <- 1:5005
- tData1 <- data_dl[-index1,]
- eData1 <- data_dl[index1,]
- #deeplearning
- 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 さんよりアドバイス頂きましたので、参考にさせていただきました。