Ruby Business Users Conference 2017
Rubyにおける機械学習と統計分析のための 環境整備の取り組みKenta MurataSpeee Inc.2017.02.23Ruby Business Users Conference 2017Rubyにおける機械学習と統計分析のための 環境整備の取り組みKenta MurataSpeee Inc.2017.02.23Ruby Business Users Conference 2017
View Slide
Ruby Business Users Conference 2017 (2017.02.23)self.introduction• Kenta Murata (mrkn)• Speee Inc.‣ Researcher• CRuby committer‣ A bigdecimal maintainer
Ruby Business Users Conference 2017 (2017.02.23) gems • bigdecimal• enumerable-statistics• daru-td• iruby-rails
Ruby Business Users Conference 2017 (2017.02.23)謝辞
Ruby Business Users Conference 2017 (2017.02.23)はじめに
Ruby Business Users Conference 2017 (2017.02.23)Topics• 統計分析、機械学習、データサイエンスについての基礎知識• Ruby ではデータサイエンスのお仕事はできない → なぜか?• Ruby のためのデータサイエンス環境整備プロジェクトの進捗
Ruby Business Users Conference 2017 (2017.02.23)今日の流れ• はじめに• 統計分析と機械学習• Ruby とデータサイエンスの関係• Ruby のためのデータサイエンス環境• まとめ
Ruby Business Users Conference 2017 (2017.02.23)統計分析と機械学習• はじめに• 統計分析と機械学習• Ruby とデータサイエンスの関係• Ruby のためのデータサイエンス環境• まとめ
Ruby Business Users Conference 2017 (2017.02.23)統計分析と機械学習• 数学と計算機科学のサブカテゴリ• データから知識を取り出す仕組み• データサイエンスで使う道具
Ruby Business Users Conference 2017 (2017.02.23)データサイエンス• ビッグデータ‣ 政府や企業が大量にデータを蓄積している• サイエンス‣ 大量のデータから科学的な知識を取り出して政策や事業開発に活かしたい
Ruby Business Users Conference 2017 (2017.02.23)データサイエンスのイメージ
Ruby Business Users Conference 2017 (2017.02.23)統計分析? 機械学習?• データサイエンスのための手法• 既知のデータ (訓練データ) から統計モデルを作る• 何が違う?
Ruby Business Users Conference 2017 (2017.02.23)統計分析と機械学習の違い
Ruby Business Users Conference 2017 (2017.02.23)統計分析• 統計分析で作った統計モデルの目的‣ 統計モデルを使って既知のデータの性質を説明する• 要求されること‣ 統計モデルの中身が解釈しやすいこと‣ 過学習していないこと
Ruby Business Users Conference 2017 (2017.02.23)データの性質の説明• 「なぜそうなるのか?」を説明できること‣ 例1: 一般化線形モデル- 目的変数に対する説明変数の関与の仕方: 線形結合‣ 例2: 単一決定木- サンプルを分ける規準: ジニ係数, エントロピー‣ 例3: 統計的検定、ベイズ推定- 「どうしてそうなるのか?」の確率を与える• シンプルな統計モデルを利用する必要がある‣ 未知のデータに対する予測性能は頭打ちになる
Ruby Business Users Conference 2017 (2017.02.23)機械学習• 機械学習で作った統計モデルの目的‣ 未知のデータに対して良い精度の予測を与える• 要求されること‣ 予測の精度が高いこと‣ 過学習していないこと
Ruby Business Users Conference 2017 (2017.02.23)良い精度の予測• 大量の訓練データを使用‣ できるだけ広いケースで学習したい• 交差検定による過学習の回避‣ 統計モデルが複雑でも過学習しないように• ハイパーパラメータの機械的な最適化• 複数の統計モデルを組み合わせて精度を高める‣ 予測結果を説明する必要がないから可能
Ruby Business Users Conference 2017 (2017.02.23)統計分析と機械学習の違い• 統計モデルに対して解釈性と予測性のどちらを求めるか‣ 統計分析では解釈性‣ 機械学習では予測性• 理論的背景は同じ• 人間と機械のどちらが学ぶか?
Ruby Business Users Conference 2017 (2017.02.23)人間と機械のどっちが学ぶか?統計モデル統計分析機械学習
Ruby Business Users Conference 2017 (2017.02.23)機械 に 学習 させる
Ruby Business Users Conference 2017 (2017.02.23)機械 に 学習 させる• 人間が自然に行っている学習能力 を コンピュータ上で実現するための技術• 問題の解き方を直接プログラムとして記述せずに、いろいろ 試行錯誤を通して正しい解き方を見つけ出す ように記述されたプログラム
Ruby Business Users Conference 2017 (2017.02.23)機械学習の厳密な定義あるプログラムの 問題 T に対する性能を 性能尺度 P で評価したとき 経験 E によって性能が向上しているとき、 そのプログラムは 問題 T と 性能尺度 Pについて 経験 E から 学習 している
Ruby Business Users Conference 2017 (2017.02.23)例: 料理レシピのジャンル分類• 問題 T‣ レシピのジャンルを予測• 経験 E‣ レシピに対する適切なジャンルを人間が指定する• 性能尺度 P‣ ジャンル予測が正しかったレシピの件数
Ruby Business Users Conference 2017 (2017.02.23)プログラムが経験から学習
Ruby Business Users Conference 2017 (2017.02.23)なぜ統計分析や機械学習が 必要なのか?• ビジネス上の意思決定をデータに基づいて行うことが主目的• 統計分析や機械学習の利用は必須ではない• 大量のデータから知識を取り出してビジネスに活かすには、特に機械学習の利用は避けられない
Ruby Business Users Conference 2017 (2017.02.23)機械学習によって実現できること• 人間には不可能なタスク• 手書きのプログラムで直接表現できないタスク• プログラムが自ら変化することで正解が変化する問題に対応する
Ruby Business Users Conference 2017 (2017.02.23)人には不可能なタスクの例• 大量のデータから知識を取り出す‣ 医療診断記録から予後を予測‣ 10万人のユーザを購買履歴に基づいてグループ分けする方法‣ Web のクリックログから将来のコンバージョンを予測
Ruby Business Users Conference 2017 (2017.02.23)手でプログラミング できないタスクの例• 将棋や囲碁の指し手を求める• 自動車やヘリコプターの自動操縦• 手書き文字認識• 線画に対する自動色塗り• スパムメール判定
Ruby Business Users Conference 2017 (2017.02.23)プログラムが自ら変化することで正解が変化する問題に対応する• ユーザの行動履歴に基づくコンテンツ掲出‣ e.g. おすすめ商品の推薦• A/B テストにおける掲出パターン選択の自動最適化‣ バンディットアルゴリズムと呼ばれてるやつ
Ruby Business Users Conference 2017 (2017.02.23)要求されるスキルセットの違い• 統計分析では、統計モデルを理解するための能力が要求される• 機械学習では、統計分析のプロセスを自動化するためのプログラミング能力も要求される‣ 場合によってはインフラ構築・運用スキルまで要求される
Ruby Business Users Conference 2017 (2017.02.23)統計分析と機械学習• 統計分析はデータから人間が学んでビジネス上の意思決定に活かす• 機械学習はデータから機械が学び、その機械を人間が仕事に活用する• どちらも同じ道具を使うが、要求されるスキルセットが違う
Ruby Business Users Conference 2017 (2017.02.23)Ruby とデータサイエンスの関係• はじめに• 統計分析と機械学習• Ruby とデータサイエンスの関係• Ruby のためのデータサイエンス環境• まとめ
Ruby Business Users Conference 2017 (2017.02.23)データサイエンスのワークフロー• データ収集• 探索的データ解析• データ・クレンジング• 複数データソースの統合• 前処理• 統計モデルの学習• 実世界への適用
Ruby Business Users Conference 2017 (2017.02.23)統計分析・機械学習が 絡むプロセス• データ収集• 探索的データ解析• データ・クレンジング• 複数データソースの統合• 前処理• 統計モデルの学習• 実世界への適用
Ruby Business Users Conference 2017 (2017.02.23)Ruby のみで完了できるもの• データ収集• 探索的データ解析• データ・クレンジング• 複数データソースの統合• 前処理• 統計モデルの学習• 実世界への適用
Ruby Business Users Conference 2017 (2017.02.23)Ruby ではデータサイエンスはできない
Ruby Business Users Conference 2017 (2017.02.23)なぜできないのか?• 使える道具がない• 使ってる人がいない• 作ろうとする人がいない
Ruby Business Users Conference 2017 (2017.02.23)使える道具がない• 道具自体は存在する• でも実用的ではない• 品質も信頼できない
Ruby Business Users Conference 2017 (2017.02.23)どんな道具があるか?• nmatrix• numo-narray• daru• statsamples• ai4r• etc.
Ruby Business Users Conference 2017 (2017.02.23)実用的ではない• 機能が足りない• 道具間の連携が不十分• かなり頑張らなければならない
Ruby Business Users Conference 2017 (2017.02.23)プルリクエストする?• データサイエンスがやりたいのである• データサイエンスのための道具を作ることが目的でない• データサイエンスの道具を実装するのは、利用する人には結構大変
Ruby Business Users Conference 2017 (2017.02.23)利用者と実装者の違い• 利用者に要求されるスキル‣ 利用する道具の理論的背景‣ ビジネス領域の知識と経験• 実装者に要求されるスキル‣ 実装する道具の理論的背景‣ 高度なコンピュータサイエンスの知識と経験‣ 実装する道具に特有のプログラミング技能
Ruby Business Users Conference 2017 (2017.02.23)品質も信頼できない• ユーザが少ない• 情報も少ない• 開発が継続していない
Ruby Business Users Conference 2017 (2017.02.23)使ってる人がいない• 使える道具がないから• Python と R を使ってる人が多い• Python と R の求人が多い
Ruby Business Users Conference 2017 (2017.02.23)作ろうとする人がいない• 作ることが目的の人は少ない• 使われないものを作りたい人は少ない• 作り始めようとすると障壁が大きい
Ruby Business Users Conference 2017 (2017.02.23)障壁の例• 数値配列、グラフィックスなどの基礎となるライブラリの定番がない• 仕事では Python と R を使っているので、作っても使う機会がなさそう
Ruby Business Users Conference 2017 (2017.02.23)負のサイクル• Ruby でデータサイエンスができない状態がより強くなる経済原理が働いている• できるだけ早く Ruby でデータサイエンスができる状態を作ってユーザを集め、負のサイクルを止める必要がある
Ruby Business Users Conference 2017 (2017.02.23)Ruby のためのデータサイエンス環境• はじめに• 統計分析と機械学習• Ruby とデータサイエンスの関係• Ruby のためのデータサイエンス環境• まとめ
Ruby Business Users Conference 2017 (2017.02.23)求められる条件• 実用的に使える機能と品質を持つものでないと使ってもらえない• Python や R で作られた資産を捨てずに使い続けられないと使ってもらえない• できれば1年くらいでシュッと実現したい‣ 早くしないと Ruby が使われなくなっちゃうかも
Ruby Business Users Conference 2017 (2017.02.23)Ruby から Python と Rをそのまま使えれば良い
Ruby Business Users Conference 2017 (2017.02.23)他の言語をそのまま使う• 主流の環境を Ruby からそのまま利用できる• スイッチングコストが低いのでユーザを集めやすい‣ 知ってる技術だから‣ 既存の資産を使い続けられる• ユーザが集まれば、Ruby のための独自システムを作るサイクルが軌道にのるかも
Ruby Business Users Conference 2017 (2017.02.23)PyCall を作り始めた
Ruby Business Users Conference 2017 (2017.02.23)PyCallRuby と Python の橋渡し
Ruby Business Users Conference 2017 (2017.02.23)PyCall• Ruby から Python の処理系を呼び出せるようにする• Python のオブジェクトを Ruby から操作できる (一部実装完了)• Ruby のオブジェクトを Python から操作できる (未実装)
Ruby Business Users Conference 2017 (2017.02.23)PyCall の使い方$ git clone https://github.com/mrkn/pycall.git$ git checkout -t origin/eval$ bundle install$ bundle exec ruby example/hist.rb⚠ まだ実用段階ではない
Ruby Business Users Conference 2017 (2017.02.23)デモンストレーション
Ruby Business Users Conference 2017 (2017.02.23)
Ruby Business Users Conference 2017 (2017.02.23)Python → Ruby# Python のこのコードをfrom sklearn.datasets import fetch_olivetti_facesdata = fetch_olivetti_faces()x = data.images.reshape((len(data.images), -1))y = data.target# 現状の PyCall を使って Ruby で書くとこうなるrequire 'pycall/import'import PyCall::Importpyfrom 'sklearn.datasets', import: 'fetch_olivetti_faces'data = fetch_olivetti_faces.()x = data.images.reshape.(PyCall.tuple(PyCall.len(data.images), -1))y = data.target
Ruby Business Users Conference 2017 (2017.02.23)Python → Ruby# Python のこのコードをfrom sklearn.datasets import fetch_olivetti_facesdata = fetch_olivetti_faces() # numpy.ndarray オブジェクトx = data.images.reshape((len(data.images), -1))y = data.target# 現状の PyCall を使って Ruby で書くとこうなるrequire 'pycall/import'import PyCall::Importpyfrom 'sklearn.datasets', import: 'fetch_olivetti_faces'data = fetch_olivetti_faces.()x = data.images.reshape.(PyCall.tuple(PyCall.len(data.images), -1))y = data.target不自然な部分を隠すためのラッパーライブラリを作る必要がある
Ruby Business Users Conference 2017 (2017.02.23)Ruby VM Python VMOVNQZOEBSSBZ ΦϒδΣΫτ1Z$BMM1Z0CKFDU ΦϒδΣΫτPython 側のオブジェクトのポインタを保持SFTIBQFؔͷ ΦϒδΣΫτreshape 属性1Z$BMM1Z0CKFDU ΦϒδΣΫτ[2] call メソッドの呼び出し[3] PyObject_Call 関数の呼び出し例: NumPy 配列の reshape の動き[1] reshape 属性の取り出し
Ruby Business Users Conference 2017 (2017.02.23)PyCall の今後の開発予定• Python オブジェクトを Ruby から操作するための機能の完成• Ruby オブジェクトを Python から操作するための機能• Ruby ←→ Python 両方向のコールバック機能• PyCall が事前に知らない型変換のサポート• Python オブジェクトの IRuby 対応• PyCall を生で使った時の Ruby としての不自然さを隠すラッパーライブラリの開発
Ruby Business Users Conference 2017 (2017.02.23)PyCall 以外• R とのブリッジ• Julia とのブリッジ• Python、R、Julia、Ruby の4者間での自然なデータ交換の実現• etc.
Ruby Business Users Conference 2017 (2017.02.23)マイルストーンhttp://www.s-itoc.jp/report/reaserch_results/439図: 多言語ブリッジの開発計画(上段)とRuby Grant 2016(下段)との関係
Ruby Business Users Conference 2017 (2017.02.23)ITOC Report• 『データサイエンスにおけるRubyの現在の位置づけと可能性』• http://www.s-itoc.jp/report/reaserch_results/439
Ruby Business Users Conference 2017 (2017.02.23)まとめ• はじめに• 統計分析と機械学習• Ruby とデータサイエンスの関係• Ruby のためのデータサイエンス環境• まとめ
Ruby Business Users Conference 2017 (2017.02.23)まとめ• Ruby でデータサイエンスができる世界を作るために‣ Python の機能を Ruby から使うブリッジ機能を提供するライブラリを開発中‣ matplotlib, scikit-learn などが動く‣ Ruby を Python に見せるブリッジも必要‣ R と Julia のブリッジも開発する
Ruby Business Users Conference 2017 (2017.02.23)sciruby.slack.com• Slack で意見交換をしましょう‣ https://sciruby-slack.herokuapp.com/• 日本語でも英語でも可
Ruby Business Users Conference 2017 (2017.02.23)まとめ• Ruby でデータサイエンスができる世界を作るために‣ Python の機能を Ruby から使うブリッジ機能を提供するライブラリを開発中‣ matplotlib, scikit-learn などが動く‣ Ruby を Python に見せるブリッジも必要‣ R と Julia のブリッジも開発するhttps://sciruby-slack.herokuapp.com/