渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

KerasをTensorFlowバックエンドで試してみた:「もっと多くの人に機械学習とDeep Learningを」という時代の幕開け

f:id:TJO:20160608131830p:plain
(左:Keras、右:MXnet)

Kaggle Masterの間ではMXnetよりさらに人気なDeep Learningフレームワークというかラッパーが、@氏の手によるKeras。

結構苦心したのですが、ようやく手元のPython環境で走るようになったので、試してみました。なおKerasの概要と全体像についてはid:aidiaryさんが詳細な解説を書いて下さっているので、そちらの方を是非お読み下さい。


追記

Kerasは人気のフレームワークなので、僕なんぞがこんなブログ記事を書く前から素晴らしい紹介記事・スクリプトが幾つもあります。こちらでは参考までに以下のお二方のものをご紹介させていただきます。


Kerasはレゴブロックを組み合わせるかのようにして、簡単にディープラーニングのモデルを作成できる便利なライブラリです。これを使って楽しく開発できるのではないかと思います。

まことにそう思います。


一応こちらでも簡単に解説しておくと、KerasはバックエンドにTensorFlowもしくはTheanoの好きな方を選べば良い、というDeep Learningフレームワークのラッパーです。開発者の@氏とちょっと個人的にやり取りしたことがあるんですが、彼が語っていたのは「Theanoはもはや煩雑過ぎるし、TensorFlowは使いやすいが計算グラフの理解のところが難しくて万人向けではない」というコメント。「出来るだけ多くの人にDeep Learningに触れてもらいたい」というのがその開発理念だそうです。


ちなみに、彼がTwitterで呟いていたのをチラッとご覧になった方もいるかもしれませんが、Kerasドキュメントの日本語化プロジェクトが目下進行中のようです*1。MXnetが英語以外では中国語ドキュメントのみが整備されていて中国語圏で人気が高いことを鑑みるに、いずれKerasも日本人に最も馴染み深いDeep Learningフレームワークの一つになるかもしれませんね。

*1:@氏はそもそも日本での留学経験があるということで、日本でも是非Kerasを広めたいというお話のようです

続きを読む

機械学習分類器ごとに汎化vs.過学習の様子を可視化してみる

以前12回まで続けた「サンプルデータで試す機械学習シリーズ」ですが*1

あれから色々分類器の手法やその実装もバリエーションが増えてきたということもあり、思い立って今回まとめてやり直してみようと思います。そうそう、12回シリーズの頃から愛用している線形分離不可能XORパターンのデータセットがあるんですが、あれってサンプルサイズがたったの100しかないので色々と粗いんですよね。ということで、サンプルサイズを10000まで増やしてみたものを新しく生成しておいたので、こちらで試してみましょう。

> xorc <- read.csv('https://github.com/ozt-ca/tjo.hatenablog.samples/raw/master/r_samples/public_lib/jp/xor_complex_medium.txt',sep='\t')
> xorc$label <- as.factor(xorc$label-1)


データ自体は上記リンク先からもお分かりかと思いますが、xor_complex_XXXXX.txtという名前で僕のGitHubに上げてあります。他にも幾つか追加したシリーズがありますが、それはまたおいおいお見せしますよということで。


そう言えば、決定境界を描くためのグリッドなんですが、よくよく考えたらあれって(特にXORパターン)だと本来想定している「真の決定境界」が規定されているので、グリッドに対応する正解ラベルを与えることも可能なんですよね。ということで、今回はそれもやっておきました。

> px<-seq(-4,4,0.03)
> py<-seq(-4,4,0.03)
> pgrid<-expand.grid(px,py)
> names(pgrid)<-names(xorc)[-3]
> label.grid<-rep(0,nrow(pgrid))
> for(i in 1:nrow(pgrid)){
+     if (pgrid[i,1]>=0 & pgrid[i,2]>=0){label.grid[i]<-0}
+     if (pgrid[i,1]<0 & pgrid[i,2]>=0){label.grid[i]<-1}
+     if (pgrid[i,1]<0 & pgrid[i,2]<0){label.grid[i]<-0}
+     if (pgrid[i,1]>=0 & pgrid[i,2]<0){label.grid[i]<-1}
+ }


今回取り上げる機械学習分類器は、RBF(ガウシアン)カーネルSVM、ランダムフォレスト、Xgboost、Deep Learning (DNN)の4種類です。ちなみに、以前も実験したように本来はXORのような線形分離不可能パターンには使えないロジスティック回帰も交互作用項を入れれば分離できるようになる上、しかもなかなか良いパフォーマンスになるんですが、いかんせん全く汎用性がないので今回は取り上げません。というか、面倒なので非線形分類器だけに今回は絞りました(笑)。悪しからずご了承あれ。

*1:元々「糞コードで頑張る機械学習シリーズ」というカテゴリ名だったんですが、この語感もあんまりなので今回変更しました汗

続きを読む