The paradigm shift

saboyutaka’s diary なんかかく(ブログn回目)

Ruby + PyCallで機械学習をやってみた at Pydata Okinawa #23

機械学習といえばPythonがいますごい盛り上がりを見せていますが、Rubyでも最近 @mrknさんがPyCallというgemを作っていて、2月23日に行われたRuby Business Users Conference 2017で発表されたみたいです。

sssslide.com

ということで

Ruby + PyCallで機械学習をやってみる

以前、Python 3.5, scikit-learn, pandasでKaggleのTitanicを使って機械学習チュートリアルを行ったのでここのコードをRuby化してみる。

saboyutaka.hatenablog.com

基となるPythonのコード

  • Kaggleのデータ(train.csv, test.csv)をローカルのdataディレクトリに配置
  • pandasでデータを加工
  • scikit-learn RandomForestでmodelを作成
  • 学習
  • 評価

をやってます

gist.github.com

これをRuby化する

gist.github.com

比較してもらうと分かるんですが、ほとんどPythonのコードに近い状態でかけます。

違うところ

  • pyfrom, pyimport でPythonのlibraryをimportする
  • PythonのClassのmethodを呼ぶときには.methodで呼び出す
    • lambdaで実行してる?
  • PythonのDictionaryを使うためにPyCall::Dictを使用している
  • methodへの引数はRubyの書き方に置き換える

ぐらいでした。

やってみて

  • Rubyから簡単にPython呼び出せるの便利!!numpyとか普通に使えてすごい
  • オブジェクトがPyCall::Objectにラップされるのでmethodとか調べるのはむずかしい?

用途としてはPython, Jupyter Notebookでごにょごにょしてモデルを作成して、成果物としてのmodelをscikit-learnのシリアライズで永続化、それをRuby, PyCallから呼び出して実行すると言う感じでしょうか。Railsのコードなんかからmodelへの呼び出しなんかはすごい簡単にできそうです。evalでもできそうだけど失敗したときとか困るし、PyCallに置き換えると良さそう。

まだPyCallの開発は始まったばかりのようなのでこれからどんどん良くなっていきそうですが、すでに今の段階でも十分良さが伝わってくるので期待したいです!何か開発手伝えることがあればやりたいですねー :)

Pydata Okinawa

今回はPydata Okinawa #23 のLT大会ということでPyCallについて 発表してきました。

pydataokinawa.connpass.com

機械学習に興味がある方で沖縄に居る方/来れる方はぜひお越しくださいー :)